Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中Tictaoe人工智能的最简单MiniMax算法_Java_Algorithm_Artificial Intelligence_Minimax - Fatal编程技术网

Java中Tictaoe人工智能的最简单MiniMax算法

Java中Tictaoe人工智能的最简单MiniMax算法,java,algorithm,artificial-intelligence,minimax,Java,Algorithm,Artificial Intelligence,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 ove

我试图掌握极大极小算法,并且已经读过了。我最初的方法是实现一个简单的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;
    }
}
现在,我有一个正在工作的AI,它试图阻止我的移动并获胜,但有时它会做出非智能的选择,例如,如果我从控制台读取的输入是6,7,8,那么这就是输出。它并没有试图阻止我的胜利。但在其他情况下确实如此


|O | O | |


|| | |


|X | X | X |


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


|| O | |


|X | X | O |


|| | |



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

所示示例的代码行为是正确的

那么,为什么以下位置的威胁没有被阻止?为什么程序播放移动1而不是移动6

O . .                                    O 1 2
. . .     numbering available moves:     3 4 5
X X .                                    X X 6
这是因为如果游戏在完美游戏中失败,程序只会执行第一个可用的移动

该算法只关心输赢,而不关心移动的次数

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

O . .     O . .
. . .     . X .     and X wins on his next move
X X O     X X O

你可能会得到更多的建议,如果AI玩的是一个完美的游戏,他永远不会失去一个tic-tac-toe。他甚至会去。当X玩家在左下角打球时,AI(如果它是最优的)将在中间打球。从而防止潜在的损失。现在我不知道错误在哪里,但肯定有一个。
O . .     O . .
. . .     . X .     and X wins on his next move
X X O     X X O