我正在尝试制作一个 tic tac toe minimax 算法。在某些情况下,我的算法会输出明显错误的动作。例如,在当前保存在脚本中的棋盘状态中,最佳移动应该是下角,但由于某种原因,算法输出了上中角。我无法识别什么时候是错的、什么时候是对的模式。我怀疑我要么有一个简单的语法错误,要么我的整个方法不正确。
免责声明:我对编程非常陌生。
这里是我的完整脚本。
我的方法是找到所有可能的移动并返回具有最高值的移动(topLevelSearch())。 topLevelSearch() 调用 moveSearch() 从对手的角度评估每个动作并返回对手值的负数,在需要时递归调用自身。
def moveSearch(board, player) :
#printBoard(board)
if abs(checkWin(board)) == 1 :
return checkWin(board) * player * -1
elif checkWin(board) == 0:
return 0
elif checkWin(board) == 2 :
moveList = array('i', [])
i = 0
while i < 9 :
if board[i] == 0 :
moveList.append(i)
i += 1
j = 0
valueList = array('f', [0] * len(moveList))
while j < len(moveList) :
board[moveList[j]] = player
valueList[j] = moveSearch(board, -1 * player)
board[moveList[j]] = 0
j += 1
return max(valueList) * -1
def topLevelSearch(board, player) :
printBoard(board)
if abs(checkWin(board)) == 1 :
return
elif checkWin(board) == 0:
return
elif checkWin(board) == 2 :
moveList = array('i', [])
i = 0
while i < 9 :
if board[i] == 0 :
moveList.append(i)
i += 1
j = 0
valueList = array('f', [0] * len(moveList))
while j < len(moveList) :
board[moveList[j]] = player
valueList[j] = moveSearch(board, -1 * player)
board[moveList[j]] = 0
j += 1
bestMove = moveList[valueList.index(max(valueList))]
return bestMove
我在脑子里反复浏览了我的代码很多次,但找不到逻辑中的错误。我找不到什么时候是对什么时候是错的模式。
如有任何帮助,我们将不胜感激。
除了评论中提到的错误(只有在检查获胜后之后才检查平局),没有任何问题。
最佳移动应该是底角您对以下主板这么说:
X . .
. O .
. . .
但是 X 的所有可能走法的理论值(以及之后的最佳玩法)都是平局,即 0。因此您的代码采用这些走法中的第一个。