Java中用于TicTacToe AI的最简单的MiniMax算法

jdo*_*doe 2 java algorithm artificial-intelligence minimax

我试图了解MiniMax算法,并且已经阅读了它。我最初的方法是实现一个简单的MiniMax算法,然后添加alpha-beta修剪。但这是我当前的代码:

public int miniMax(char[] node, int playerNum)
{
    int victor = checkWin(node); // returns 0 if game is ongoing, 1 for p1, 2 for p2, 3 for tie.
    if(victor != 0) //game over .
        return score(victor);   

    if(playerNum == 2) //AI
    {
        int bestVal = Integer.MIN_VALUE;
        int bestSpot = 0;
        for(int i = 0; i < node.length; i++)
        {
            if(node[i] != '-')
                continue;
            node[i] = getSymbol(playerNum);
            int value = miniMax(node, 1); 
            if(value > bestVal)
            {
                bestVal = value;
                bestSpot = i;
            }

            node[i] = '-';
        }
        return bestSpot;
    }
    else
    {
        int bestVal = Integer.MAX_VALUE;
        int bestSpot = 0;
        for(int i = 0; i < node.length; i++)
        {
            if(node[i] != '-')
                continue;
            node[i] = getSymbol(playerNum);
            int value = miniMax(node, 2); 
            if(value < bestVal)
            {
                bestVal = value;
                bestSpot = i;
            }
            node[i] = '-';
        }
        return bestSpot;
    }
}
Run Code Online (Sandbox Code Playgroud)

还有我的分数功能

private int Score(int gameState)
{
    if(gameState ==2) //O wins.
        return 10;
    else if(gameState==1) //X wins
        return -10;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

现在,我有一个正在运行的AI,试图阻止我的前进并赢得胜利,但是有时它会做出非智能的选择,例如,这是我从控制台读取的输入依次为6,7,8时得到的输出。它不会试图阻止我的胜利。但在其他情况下确实如此。


| O | O | |


| | | |


| X | X | X |


在我的第二次尝试中,我尝试了4,3,但它阻止了我的获胜举动。


| | O | |


| X | X | O |


| | | |


我想知道有人能指出我的实现有什么问题吗?

mar*_*aca 6

所显示示例的代码行为正确!

那么为什么以下位置的威胁没有被阻止?为何程序播放从1移到6?

O . .                                    O 1 2
. . .     numbering available moves:     3 4 5
X X .                                    X X 6
Run Code Online (Sandbox Code Playgroud)

这是因为如果游戏在完美玩法中输了,则程序只会播放第一个可用的举动。

该算法仅关心获胜或失败,而不关心多少步。

查看如果阻止了威胁会发生什么:

O . .     O . .
. . .     . X .     and X wins on his next move
X X O     X X O
Run Code Online (Sandbox Code Playgroud)