Форум сайта python.su
Здравствуйте, вот изучаю питон по книге Майкла Доутсона“Программирование на питон 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)
Прикреплённый файлы: 2018-04-01.png (73,2 KБ)
Офлайн
append -это метод списка. Соответственно - не
moves.append[square]
moves.append(square)
Отредактировано passant (Апрель 1, 2018 23:59:33)
Офлайн
passantСпасибо большое, проблема решена! Вот как банальная невнимательность влияет на всю работу программы.
moves.append(square)
Офлайн