Java中Tictaoe人工智能的最简单MiniMax算法
我试图掌握极大极小算法,并且已经读过了。我最初的方法是实现一个简单的MiniMax算法,然后添加alpha-beta修剪。但是,这是我当前的代码: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
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