#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)