Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Tic-Tac-Toe-Alpha-Beta-Minimax_Java_Tic Tac Toe_Minimax_Alpha Beta Pruning - Fatal编程技术网

Java Tic-Tac-Toe-Alpha-Beta-Minimax

Java Tic-Tac-Toe-Alpha-Beta-Minimax,java,tic-tac-toe,minimax,alpha-beta-pruning,Java,Tic Tac Toe,Minimax,Alpha Beta Pruning,为了更好地理解minimax算法是如何工作的,我一直在做一个tic-tac-toe程序。以下实现无法正常工作,因为计算机可能会丢失游戏。如果程序运行正常,理论上这是不可能的 我在实施极大极小值或采取最佳措施时是否犯了错误? 我以前从未实现过该算法:s 评估功能 public static int evaluate(char[] board, char turn) { if (isWinFor('x', board)) { return -1; } else if

为了更好地理解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;
}
Minimax

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 int alphabeta(字符[]板,整数深度,字符翻转,整数alpha,整数beta){
如果(深度==0 | |游戏结束(棋盘)){
返回评估(板、轮);
}否则{
对于(内部移动:可能移动(板)){
makeMove(板、转、移动);
转弯=改变转弯(转弯);
int值=alphabeta(板、深度--、转角、alpha、beta);
makeMove(板,,,移动);
如果(转动='o'){
如果(值>alpha){
α=值;
}
如果(α>=β){
返回β;
}
}否则如果(旋转='x'){
如果(值<β){
β=值;
}
if(贝塔最佳值){
最佳价值=价值;
//开始代码编辑
选项。清除();
//结束代码编辑
选择。添加(移动);
}else if(值==最佳值){
选择。添加(移动);
}
}
makeMove(board、turn、choices.get(random.nextInt(choices.size()));
}

谢谢。

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

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

int value = alphabeta(board, 3, turn, -10000, 10000);        
把它改成

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

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

嗨xXliolauXx,不幸的是,它仍然是错误的不是玩一个完美的游戏。这肯定会有所不同。当value>bestValue时,我在添加新动作之前添加了选项。clear()。现在当我玩时,如果我在一行中放置两个“x”,计算机将阻止我获胜(以前没有这样做)但是,如果我将另外两个“x”排成一行,它不会再次阻止。在第二种情况下,它似乎倾向于将两个“o”排成一行,而不是阻止我,这意味着我仍然可以赢。评估分数有问题吗()函数?@user1334130尝试调试,-当cp出错时,您的选择列表正确吗?-值正确吗?然后我可能可以帮助您。查看所有内容并玩一些游戏,我可以看到以下内容。如果我正在玩一个游戏,并且连续有两个“x”,则选择数组将存储移动以阻止我与winni的接触ng,以及其他动作(我想他们的得分肯定是一样的),这意味着当计算机随机选择一个动作时,它有时会做出错误的选择并失去控制。理想情况下,如果计算机必须阻止我以防止获胜,这应该是唯一可用的动作。这是tic tac toe代码,gui code@user1334130 t感谢代码。到目前为止,我还没有发现错误。我建议实现一个函数来从文件中加载一个位置,然后让CP打印已经放置了7个x/O的位置的所有计算结果…您应该能够以这种方式调试它。。。
int value = alphabeta(board, 8, turn, -10000, 10000);