Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 1, 2018 19:56:44

Dentotalwar
Зарегистрирован: 2018-04-01
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Ошибки

Здравствуйте, вот изучаю питон по книге Майкла Доутсона“Программирование на питон 2014г”
Вот я застрял на главе 6, точнее на её конце, написание игры “Крестики Нолики”
Вот код который Майк написал в книге:

 X = "X"
O = "O"
EMPTY = " "
TIE = "Ничья"
NUM_SQUARES = 9
def display_instruct():
    print(
        "\n"
        "Добро пожаловать на ринг грандиознейших интеллектуальных состязаний всех времен\n"
        "Твой мозг и мой процессор сойдутся в схватке за доской игры \"Крестики-нолики\"\n"
        "Чтобы сделать ход. введи число от 0 до 8. Числа однозначно соответствуют полям\n"
        "доски - так. как показано ниже:\n"
        "0 | 1 | 2\n"
        "--+---+--\n"
        "3 | 4 | 5\n"
        "--+---+--\n"
        "6 | 7 | 8\n"
        "Приготовься к бою. жалкий белковый человечишка. Вот-вот начнется\n"
        "решающее сражение. \n\n"
        " "
    )
def ask_yes_no(question):
    """Задает вопрос с ответом 'Да' или 'Нет'."""
    response = None
    while response not in ("y", "n"):
        response = input(question).lower()
    return response
def ask_number(question, low, high):
    """Просит ввести число из диапазона."""
    response = None
    while response not in range(low, high):
        response = int(input(question))
    return response
def pieces():
    """Определяет принадлежносит первого хода"""
    go_first = ask_yes_no("Хочешь ли ты оставить за собой первый ход? (y/n): ")
    if go_first == "y":
        print("\nНу что я даю тебе фору: играй крестиками.")
        human = X
        computer = O
    else:
        print("\nТвоя удаль тебя погубит... Буду начинать я.")
        computer = X
        human = O
    return computer, human
def new_board():
    """Создает новую доску."""
    board = []
    for square in range(NUM_SQUARES):
        board.append(EMPTY)
    return board
def display_board(board):
    """Отображает игровую доску на экране."""
    print("\n\t", board[0], "|", board[1], "|", board[2])
    print("\t----------")
    print("\t", board[3], "|", board[4], "|", board[5])
    print("\t----------")
    print("\t", board[6], "|", board[7], "|", board[8])
def legal_moves(board):
    """Создает список доступных ходов."""
    moves = []
    for square in range(NUM_SQUARES):
        if board[square] == EMPTY:
            moves.append[square]
    return moves
def winner(board):
    """Определяет победителя в игре."""
    WAYS_TO_WIN = ((0, 1, 2),
                   (3, 4, 5),
                   (6, 7, 8),
                   (0, 3, 6),
                   (1, 4, 7),
                   (2, 5, 8),
                   (0, 4, 8),
                   (2, 4, 6))
    for row in WAYS_TO_WIN:
        if board[row[0]] == board[row[1]] == board[row[2]] != EMPTY:
            winner = board[row[0]]
            return winner
        if EMPTY not in board:
            return TIE
    return None
def human_move(board, human):
    """Получает ход человека"""
    legal = legal_moves(board)
    move = None
    while move not in legal:
        move = ask_number("Твой ход. Выбери одно из полей (0 - 8):", 0, NUM_SQUARES)
        if move not in legal:
            print("\nСмешной человек! Это полe уже занято. Выбери другое\n")
    print("Ладно...")
    return move
def computer_move(board, computer, human):
    """Делает ход за компьютерного противника."""
    board = board[:]
    BEST_MOVES = (0, 4, 2, 6, 8, 1, 3 ,5, 7)
    print("Я выберу поле номер")
    for move in legal_moves(board):
        board[move] = computer
        if winner(board) == computer:
            print(move)
            return move
        board[move] = EMPTY
    for move in legal_moves(board):
        board[move] = human
        if winner(board) == human:
            print(move)
            return move
        board[move] = EMPTY
    for move in BEST_MOVES:
        if move in legal_moves(board):
            print(move)
            return move
def next_turn(turn):
    """Осуществляет переход хода"""
    if turn == X:
        return O
    else:
        return X
def congrat_winner(the_winner, computer, human):
    """Поздравляет победителя игры"""
    if the_winner != TIE:
        print("Три", the_winner, "в ряд!\n")
    else:
        print("Ничья!\n")
    if the_winner == computer:
        print("Kaк я и предсказывал. победа в очередной раз осталась за мной\n\
               Вот еще один довод в пользу того. что компьютеры превосходят людей решительно\n\
               во всем.")
    elif the_winner == human:
        print("O нет. этого не может быть! Неужели ты как-то сумел перехитрить меня.\n\
               белковый? Клянусь: я. компьютер. не допущу этого больше никогда!")
    elif the_winner == TIE:
        print("Teбe несказанно повезло. дружок: ты сумел свести игру вничью. \n\
               Радуйся же сегодняшнему успеху! Завтра тебе уже не суждено его повторить. ")
def main():
    display_instruct()
    computer, human = pieces()
    turn = X
    board = new_board()
    while not winner(board):
        if turn == human:
            move = human_move(board, human)
            board[move] = human
        else:
            move = computer_move(board, computer, human)
            board[move] = computer
        display_board(board)
        turn = next_turn(turn)
    the_winner = winner(board)
    congrat_winner(the_winner, computer, human)
main()
input("Enter")
но с моей корректировкой

но когда дело подходит к запуску у меня возникает такая ошибка:

 Добро пожаловать на ринг грандиознейших интеллектуальных состязаний всех времен
Твой мозг и мой процессор сойдутся в схватке за доской игры "Крестики-нолики"
Чтобы сделать ход. введи число от 0 до 8. Числа однозначно соответствуют полям
доски - так. как показано ниже:
0 | 1 | 2
--+---+--
3 | 4 | 5
--+---+--
6 | 7 | 8
Приготовься к бою. жалкий белковый человечишка. Вот-вот начнется
решающее сражение. 
 
Хочешь ли ты оставить за собой первый ход? (y/n): н
Хочешь ли ты оставить за собой первый ход? (y/n): н
Хочешь ли ты оставить за собой первый ход? (y/n): y
Ну что я даю тебе фору: играй крестиками.
Traceback (most recent call last):
  File "C:/Users/dento/PycharmProjects/untitled/Крестики нолики.py", line 165, in <module>
    main()
  File "C:/Users/dento/PycharmProjects/untitled/Крестики нолики.py", line 156, in main
    move = human_move(board, human)
  File "C:/Users/dento/PycharmProjects/untitled/Крестики нолики.py", line 94, in human_move
    legal = legal_moves(board)
  File "C:/Users/dento/PycharmProjects/untitled/Крестики нолики.py", line 71, in legal_moves
    moves.append[square]
TypeError: 'builtin_function_or_method' object is not subscriptable
Process finished with exit code 1

Помогите мне пожалуйста

Отредактировано Dentotalwar (Апрель 1, 2018 21:33:48)

Прикреплённый файлы:
attachment 2018-04-01.png (73,2 KБ)

Офлайн

#2 Апрель 1, 2018 23:58:44

passant
Зарегистрирован: 2018-02-17
Сообщения: 43
Репутация: +  4  -
Профиль   Отправить e-mail  

Ошибки

append -это метод списка. Соответственно - не

moves.append[square]
а как минимум что-то вроде этого:
 moves.append(square)

Отредактировано passant (Апрель 1, 2018 23:59:33)

Офлайн

#3 Апрель 2, 2018 15:56:34

Dentotalwar
Зарегистрирован: 2018-04-01
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Ошибки

passant
moves.append(square)
Спасибо большое, проблема решена! Вот как банальная невнимательность влияет на всю работу программы.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version