当前位置: 首页 > 知识库问答 >
问题:

井字游戏脚趾αβ极小值

路扬
2023-03-14

为了更好地理解minimax算法是如何工作的,我一直在做一个tic-tac-toe程序。以下实现无法正常工作,因为计算机可能会丢失游戏。如果程序运行正常,理论上这是不可能的。。。

我是否在实施极大极小值或采取最佳行动时犯了错误?

我以前从未实现过算法: s

评价函数

public static int evaluate(char[] board, char turn) {
    if (isWinFor('x', board)) {
        return -1;
    } else if (isWinFor('o', board)) {
        return 1;
    } 
    return 0;
}

极小极大

public static int alphabeta(char[] board, int depth, char turn, int alpha, int beta) {
    if (depth == 0 || gameOver(board)) {
        return evaluate(board, turn);
    } else {
        for (int move : possibleMoves(board)) {
            makeMove(board, turn, move);
            turn = changeTurn(turn);
            int value = alphabeta(board, depth--, turn, alpha, beta);   
            makeMove(board, ' ', move);
            if (turn == 'o') {
                if (value > alpha) {
                    alpha = value;
                }
                if (alpha >= beta) {
                    return beta;
                }
            } else if (turn == 'x') {
                if (value < beta) {
                    beta = value;
                }
                if (beta <= alpha) {
                    return alpha;
                }
            }               
        }
        if (turn == 'o') {
            return  alpha;
        } else {
            return  beta;
        }             
    }
}

找到最好的办法

public static void getBestMove(char[] board, char turn) {
    Random random  = new Random();
    int bestValue = -10000;
    List<Integer> choices = new ArrayList<Integer>();
    for (int move : possibleMoves(board)) {
        makeMove(board, turn, move);
        turn = changeTurn(turn);
        int value = alphabeta(board, 3, turn, -10000, 10000);   
        makeMove(board, ' ', move);
        if (value > bestValue) {
            bestValue = value;
            //start code edit
            choices.clear();
            //end code edit
            choices.add(move);
        } else if (value == bestValue) {
            choices.add(move);
        }
    }
    makeMove(board, turn, choices.get(random.nextInt(choices.size())));
}

非常感谢。

共有2个答案

邓翼
2023-03-14

除了前面的答案之外,我很确定你的GetBestMobile是错误的:每当一个移动更好或等于你当前最好的移动时,你都会添加一个选择。但是当最佳值改变时,你实际上并没有清除列表。这意味着你的选择列表中会有失败的动作。

卫嘉泽
2023-03-14

这很简单:一个完美的玩家必须搜索整棵树的最大深度(除了截断节点),但是你把你的程序限制为只有4层!

“寻找最佳移动”中有一个错误:

int value = alphabeta(board, 3, turn, -10000, 10000);        

把它改成

int value = alphabeta(board, 8, turn, -10000, 10000);
 类似资料:
  • 我已经使用alpha-beta-minimax实现了JavaScript。它适用于3x3板,但当我将板更改为4x4或更高时,程序似乎挂起。 更新:当可用移动超过10时,程序无效 下面是alpha-beta-minimax函数: CheckForWinner()返回: 0代表不平不赢 1换领带 2代表玩家获胜 3代表电脑获胜 谢谢你的帮助

  • 所以我为我的课做了一个抽动练习作业。我已经成功地创建了一个简单的Tic Tac Toe程序,但不知何故,检查绘制的方法有时并不正确。如果所有东西都填满了,但没有赢家,那就是平局。但如果除第0行第1列外,其他所有内容都已填满,则即使该框仍为空白,它仍将显示“Draw”。如果你不明白我的意思,就试着把所有的东西都填满,但不是赢,即使最后一个框没有填满,它也会说“平局”。我在代码中做错了什么????驱动

  • 我想我终于对minimax和Alpha-beta修剪有所了解了,但实现它完全是另一回事! 根据我的理解,基础是:您为某些动作分配一个启发式函数分数(Gomoku为例)。 如果一行有5个,我们应该分配一个高值,比如9999,因为这是一个胜利的举动 当我们必须在Java中实现这一点时,我的问题来了! 我有一块彩色[][]板(8x8),其中黑色是播放器1,白色是播放器2,null表示空白,我不知道我们应

  • 嗨,我正在编写一个井字游戏。我已经在代码中的注释中详细说明了我需要什么。我现在遇到的问题是制作一个getMobile方法。我想我需要在按下行和列后的if/else语句中调用getMobile方法? 我不确定如何从获取行/列编号并将其放入我的板上以获取用户输入的内容。 以下是我的代码:

  • 我正在制作一个名为SOS的游戏。这是一款3x3的棋盘游戏,与Tic Tac Toe的概念相同,但在这款游戏中,玩家无法选择是以X还是O的身份进行游戏,游戏中唯一的规则是形成“SOS”。 我们的项目应该在所有职位被填补后终止,每个组成的“SOS”将被添加到组成“SOS”的玩家中。 我的问题是关于得分。在第一行输入SOS后,即,我尝试在第二行第一列输入“O”,玩家2将递增。它不应该递增,因为它不满足我

  • 我用Java写了Tic-Tac-Toe。我似乎遇到的问题是,当(人类)播放器1和(计算机)播放器2之间出现平局时,GUI会冻结。我已经在“Buttonlistener”类和“Methods”中创建了一个tieCheck,以获得一个平局。 我的程序的工作方式是,当按下一个按钮时,它会将一个值传递给methods类中的数组。在这个数组中,1=玩家1,2=玩家2。 人类玩家总是先走,所以当人类玩家走了4