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

标签 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;
    }
}

还有我的评分函数

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

现在,我有一个工作的 AI 试图阻止我的移动并获胜,但有时它会做出非智能选择,例如,如果我从控制台读取的输入是 6、7、8,这就是我得到的输出命令。它不会试图阻止我的胜利。但在其他情况下确实如此。


|欧 |欧 | |


| | | |


| × | × | × |


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


| |欧 | |


| × | × |欧 |


| | | |


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

最佳答案

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

那么为什么下面位置的威胁没有被挡住呢?为什么程序下的是 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

关于java - Java 中用于 TicTacToe AI 的最简单 MiniMax 算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45168697/

相关文章:

JavaFX - stage.show();以程序卡住结束

java - 与 Jersey 客户端的 POST 请求

python - 有没有更好的方法来查找列表中最常见的单词(仅限 Python)

javascript - JavaScript 中的贪心算法

python - 无限递归调用极小极大算法

java - 使用百分比时,找到一个随机整数创建另一个整数

algorithm - AP GP clrs 系列总和附录 A.1-4

python - 什么是快速算法,可以找到一条最短路径遍历带权无向图的每个节点至少一次?

machine-learning - Unet到底是什么?

java - 为外部库的类提供前缀