Не могу найти ошибку в "Крестики-Нолики" от М. Доусона
# Игра "Крестики-нолики"
# Компьютер играет в "Крестики-нолики" против пользователя
# Глобальные константы
X = 'X'
O = 'O'
EMPTY = ' '
TIE = 'Ничья'
NUM_SQUARES = 9
def display_instruct():
"""Выводит на экран инструкцию для игрока"""
print("""
Добро пожаловать на ринг интеллектуальных состязаний!
Твой мозг сразится с моим Ryzen 5 3600.
Чтобы сделать ход, введи число от 0 до 8. Числа соответсвуют полям доски-так как показано ниже:
0 | 1 | 2
---------
3 | 4 | 5
_________
6 | 7 | 8
Приготовься к бою. Вот-вот начнется решаюшая битва за судьбу человечества!!!!
Бугагагагага.
""")
def ask_yes_no(question):
"""Функция задает вопрос пользователю и возвращает y|s"""
response = None
while response not in ('y', 'n'):
response = input(question).lower()
return response
def ask_number(question, low, high):
"""Просит ввести пользователя число(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)').lower()
if go_first == 'y':
human, computer = X, O
print('\nНу что ж, даю тебе фору. Играй крестиками.')
else:
human, computer = O, X
print('\nТы сам обрек себя на это!')
return human, computer
def new_board():
"""Создается доска для игры"""
board = []
for i in range(NUM_SQUARES):
board.append(EMPTY)
return board
def display_board(board):
"""Печать самой доски"""
print(board[0], '|', board[1], '|', board[2])
print('---------')
print(board[3], '|', board[4], '|', board[5])
print('---------')
print(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
def human_move(board, human):
"""Выполняет ход человека"""
legal = legal_moves(board)
move = 9
while move not in legal:
move = ask_number('Выбери число от 0 до 8.', 0, NUM_SQUARES)
if move not in legal:
print('Глупый, бедный человечишка. Совсем из ума вышел...')
print('Ладно.')
return move
def computer_move(board, computer, human):
"""Делает ход за компьютерного противника"""
board = board[:]
# Поля от лучшего к худшему
BEST_MOVES = [4, 0, 2, 6, 8, 1, 3, 5, 7]
print('Я выберу поле номер: ', end=' ')
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('Ничья...')
if the_winner == computer:
print('Как я предрекал, человечество изжило себя!\n')
elif the_winner == human:
print('Я пока не умею просчитывать судьбу...\nТебе неслыханно повезло, белковый!')
elif the_winner == TIE:
print('Радуйся сегоднящнему успеху, дитя Адама...')
def again():
want = input('Хотите еще раз сыграть? ')
if want == '+':
main()
return want
def main():
display_instruct()
human, computer = pieces()
turn = X
board = new_board()
display_board(board)
while not winner(board):
if turn == human:
move = human_move(board, human)
board[move] = human
elif turn == computer:
move = computer_move(board, computer, human)
board[move] = computer
turn = next_turn(turn)
display_board(board)
the_winner = winner(board)
congrat_winner(the_winner, computer, human)
again()
main()
input()
В конце игры выдается следующая ошибка, если вы начинаете:
board[move] = computer
TypeError: list indices must be integers or slices, not NoneType
Если начинает компьютер, то цикл while просто не прерывается. Большое спасибо за ответы.
Ответы (1 шт):
Автор решения: NewBee
→ Ссылка
Нашел в функции winner(board):
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