Python Minimax 没有给出正确的输出,我无法查明原因

问题描述 投票:0回答:1

我正在尝试制作一个 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

我在脑子里反复浏览了我的代码很多次,但找不到逻辑中的错误。我找不到什么时候是对什么时候是错的模式。

如有任何帮助,我们将不胜感激。

python tic-tac-toe minimax
1个回答
0
投票

除了评论中提到的错误(只有在检查获胜后之后才检查平局),没有任何问题。

最佳移动应该是底角

您对以下主板这么说:

X . . . O . . . .
但是 X 的所有可能走法的理论值(以及之后的最佳玩法)都是平局,即 0。因此您的代码采用这些走法中的第一个。

© www.soinside.com 2019 - 2024. All rights reserved.