Не могу найти ошибку в "Крестики-Нолики" от М. Доусона

# Игра "Крестики-нолики"
# Компьютер играет в "Крестики-нолики" против пользователя
# Глобальные константы
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
→ Ссылка