【问题标题】:How can i extract my best move from Min Max in TicTacToe?如何从井字游戏中的 Min Max 中提取我的最佳移动?
【发布时间】:2012-02-10 13:38:30
【问题描述】:
        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;
        }

问题是这个小功能告诉我游戏是赢、输还是平,但是我怎样才能得到让我赢的动作呢?我的 Point 类是一个简单的类,有 2 个坐标 X、Y,我想得到一个点的答案,所以我可以稍后说类似 game.Do_Move(myPoint) 的内容。

如果某些功能不明显:

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

game.Score(turn) - 返回 -1/0/1 以防玩家在下一步行动中输/平/赢

game.Generate_Moves() - 返回一个包含可用动作的列表

game.Do_Move() - 将移动应用于游戏的无效

game.Undo_Move() - 自言自语

【问题讨论】:

    标签: artificial-intelligence tic-tac-toe minmax


    【解决方案1】:

    如果在博弈树的根节点上调用的 minimax 函数同时返回选择的移动和得分就足够了。对于博弈树的所有其他节点,该函数只需要返回分数。因此,通常的方法是实现两个略有不同的极小极大函数——Look at Note #2 in the description to this NegaMax Framework
    应用于您的极小极大接口,您将拥有以下附加功能:

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

    请注意,我已经删除了对 Undo_Move 的调用,因为您不需要在每次迭代中复制 game

    【讨论】:

      【解决方案2】:

      您需要申请minimax theorem.

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

      【讨论】:

      • 这个想法是我的程序有效,并告诉我我(与两名玩家)是否有机会获胜/平局或其他玩家可以获胜。在我用 X 迈出第一步后,它告诉我它会以平局告终,但是如果我为 O 选择一个随机的坏格子,它会告诉我它是 X 的胜利等等。因此,该算法有效,顺便说一句很慢,但它有效。它采用所有可能的方格并宣布我的最佳尝试,但我想获得算法通往获胜状态的路径。
      • 对,所以从获胜的叶子往上追溯。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多