Artificial intelligence 如何从Tictaoe的Min-Max中提取最佳移动? int最小值(棋盘游戏,int深度) { 如果(game.IsFinished()| |深度

Artificial intelligence 如何从Tictaoe的Min-Max中提取最佳移动? int最小值(棋盘游戏,int深度) { 如果(game.IsFinished()| |深度,artificial-intelligence,tic-tac-toe,minmax,Artificial Intelligence,Tic Tac Toe,Minmax,问题是这个小函数告诉我这场比赛是赢、输还是平局,但是我怎么才能得到让我赢的那一步呢?我的Point类是一个简单的类,有两个坐标X,Y,我想得到答案作为一个点,这样我可以在后面说类似于game.Do_Move(myPoint) 如果某些功能不明显: game.IsFinished()-如果赢/输/平局,则返回true,否则返回 游戏。得分(回合)-返回-1/0/1,以防下一步玩家输/平/赢 游戏。生成移动()-返回包含可用移动的列表 game.Do\u Move()-将移动应用于游戏的无效 gam

问题是这个小函数告诉我这场比赛是赢、输还是平局,但是我怎么才能得到让我赢的那一步呢?我的Point类是一个简单的类,有两个坐标X,Y,我想得到答案作为一个点,这样我可以在后面说类似于
game.Do_Move(myPoint)

如果某些功能不明显:

game.IsFinished()
-如果赢/输/平局,则返回true,否则返回

游戏。得分(回合)
-返回-1/0/1,以防下一步玩家输/平/赢

游戏。生成移动()
-返回包含可用移动的列表

game.Do\u Move()
-将移动应用于游戏的无效

game.Undo_Move()
-自动对话

您需要应用


你基本上要做一个游戏树,树中的每个节点都是一个棋盘位置,每个子节点都是合法移动的结果。叶节点(游戏结束的地方)将根据game.score()获得分数,其中一个玩家尝试沿着通向高分的路径选择移动,而另一个玩家尝试选择强制低分的移动。该定理将帮助您了解如何严格应用该思想。

如果在游戏树的根节点上调用的minimax函数同时返回choosen move和score,就足够了。对于游戏树的所有其他节点,函数只需返回分数。因此,通常的方法是实现两个稍有不同的minimax函数–。
应用于minimax接口,您将具有以下附加功能:

        int minmax(Board game, int depth)
        {
            if (game.IsFinished() || depth < 0)
                return game.Score(game.Turn);

            int alpha = int.MinValue + 1;
            foreach (Point move in game.Generate_Moves())
            {
                Board currentBoard = game;
                currentBoard.Do_Move(move); 

                alpha = max(alpha, -minmax(currentBoard, depth-1));
                currentBoard.Undo_Move(move);
            }

            return alpha;
        }

请注意,我已经删除了对
Undo\u Move
的调用,因为这是不需要的,因为您在每次迭代中都复制了
game

我的想法是,我的程序可以工作,并告诉我(与两名玩家一起)是否有机会赢/平局,或者其他玩家是否可以赢。在我第一次用X移动后,它告诉我它将以平局结束,但如果我随机选择一些坏方块作为O,它会告诉我X赢了,以此类推。因此,该算法工作,是缓慢的btw,但它的工作。它需要所有可能的方块,并宣布我的最佳尝试,但我想得到算法通往获胜状态的路径。好的,那么从获胜的叶子追溯到树上。
int minimaxWithMove(Board game, int depth, Point& choosen)
{
    assert (!game.IsFinished() && depth > 0); // not possible at root node
    int alpha = int.MinValue + 1;
    foreach (Point move in game.Generate_Moves())
    {
        Board currentBoard = game;
        currentBoard.Do_Move(move);
        int score = -minmax(currentBoard, depth-1);
        if (score > alpha)
        {
            alpha = score;
            choosen = move;
        }
    }
    return alpha;
}