Я вижу 2 проблемы с вашим минимаксным (negamax) кодом:
'1. В своей минимаксной функции вы проходите через каждый квадрат, находя наилучший ход. Однако вы только возвращаете счет, а не лучший ход. Если вы найдете выигрышный ход, напишите это:
return None, 1
Затем в своем минимаксном рекурсивном вызове вы напишите:
miniMax(board, !isMaximizing, isMaximizing ? p2 : p1, turns + 1)[1]
В нижней части вы напишите:
return bestMove, bestScore
Если вы выбираете bestScore, вам также необходимо обновить bestMove, ТОЛЬКО ЕСЛИ меняется максимальный / минимальный балл. Аналогично тому, что вы делаете в функции bestMove.
'2. В вашей функции bestMove вы снова проходите все квадраты. Это то, что заставляет его возвращать один и тот же квадрат снова и снова. Так как ваш минимакс найдет лучший ход, вам нужно только сделать начальный колл:
bestMove, bestScore = miniMax(board, !isMaximizing, isMaximizing ? p2 : p1, turns + 1)
В противном случае он будет go к первому квадрату и сделает полный минимакс, поэтому найдет лучший ход для позиции. (независимо от начального хода). Поскольку он никогда не найдет лучшего хода, чем лучший ход, он не обновит bestMove ни на что, кроме первого возможного квадрата.
Надеюсь, я что-то понимаю, Engli sh не является моим родным языком, и я привык только кодировать в Python:)