Моя рекурсивная функция, похоже, использует исходный список вместо создания нового в python

#python #recursion

#python #рекурсия

Вопрос:

Я довольно новичок в Python, и я пытался написать минимаксный алгоритм для игры в крестики-нолики. Но я не могу заставить свою программу возвращать ожидаемое значение, и я не уверен, что происходит. Мой минимаксный метод должен возвращать 1, но вместо этого в значительной степени сломан. Я полагаю, что она использует исходный список вместо создания нового. Я пытался использовать copy (), но это не сработало, если только я не использовал это неправильно. Вот мой код:

 import copy

def checkWin(board):
    if board == [['y', 'x', 'y'], ['x', 'y', 'x'], ['x', 'y', 'x']]:
        return 't'
    if board == [['y', 'x', 'y'], ['x', 'y', 'x'], ['x', 'x', 'y']]:
        return 'y'
    return '0'
    
def minimax(board, player):
    status = checkWin(board)
    if status == 't':
        return 0
    if status == 'y':
        return 1

    if player == 'y':
        value = -100000
        for i in range(3):
            for k in range(3):
                if board[i][k] == '':
                    board2 = copy.deepcopy(board)
                    board2[i][k] == 'y'
                    bestMove = minimax(board2, 'x')
                    if bestMove > value:
                        value = bestMove
        return value
                    
    else:
        value = 100000
        for i in range(3):
            for k in range(3):  
                if board[i][k] == '':
                    board2 = copy.deepcopy(board)
                    board2[i][k] == 'x'
                    bestMove = minimax(board2, 'y')         
                    if bestMove < value:
                        value = bestMove

        return value

board = [
            ['y', 'x', 'y'],
            ['x', 'y', 'x'],
            ['x', 'x', '']
        ]               
bestMove = minimax(board, 'y')
print(bestMove)
  

Любая помощь приветствуется, спасибо.

Редактировать. Спасибо людям, которые помогли, извините, что я такой идиот. Но я обязательно научусь отлаживать свои программы более тщательно.

Комментарии:

1. «Мой минимаксный метод должен возвращать 1, но вместо этого в значительной степени сломан. «. Пожалуйста, определите «сломанный». Выдает ли это ошибку? Это просто возвращает что-то отличное от 1? Если последнее, что оно возвращает?

2. Вы проводили какую-либо отладку? Я бы рекомендовал прочитать ericlippert.com/2014/03/05/how-to-debug-small-programs .

3. RecursionError означает, что minimax никогда не прекращает вызывать себя

4. Какую часть этой программы вы протестировали? Можете ли вы сократить эти части до простых назначений значений? На этом этапе вы должны быть в состоянии «обвинить» 5 строк (или меньше), которые были вашим последним обновлением.

5. «Я не очень хорош в кодировании» Все мы с чего-то начинали. Продолжайте работать над этим. Убедитесь, что вы также узнаете, как отлаживать код. Ссылка из блога Эрика Липпера, приведенная ранее, является хорошим местом для начала. Как профессиональный программист, я использую методы, описанные там, каждый день. Отладка — один из моих самых бесценных инструментов. Я почти никогда не получаю свой код правильно с первого раза.

Ответ №1:

Вы хотите присвоить значение, которое не сравнивается, board2[i][k] == 'x' должно board2[i][k] = 'x' совпадать с y .

 import copy

def checkWin(board):
    if board == [['y', 'x', 'y'], ['x', 'y', 'x'], ['x', 'y', 'x']]:
        return 't'
    if board == [['y', 'x', 'y'], ['x', 'y', 'x'], ['x', 'x', 'y']]:
        return 'y'
    return '0'
    
def minimax(board, player):
    status = checkWin(board)
    if status == 't':
        return 0
    if status == 'y':
        return 1

    if player == 'y':
        value = -100000
        for i in range(3):
            for k in range(3):
                if board[i][k] == '':
                    board2 = copy.deepcopy(board)
                    board2[i][k] = 'y'
                    bestMove = minimax(board2, 'x')
                    if bestMove > value:
                        value = bestMove
        return value
                    
    else:
        value = 100000
        for i in range(3):
            for k in range(3):  
                if board[i][k] == '':
                    board2 = copy.deepcopy(board)
                    board2[i][k] = 'x'
                    bestMove = minimax(board2, 'y')         
                    if bestMove < value:
                        value = bestMove

        return value

board = [
            ['y', 'x', 'y'],
            ['x', 'y', 'x'],
            ['x', 'x', '']
        ]               
bestMove = minimax(board, 'y')
print(bestMove)