2

我一直在研究井字游戏,以便更好地理解极小极大算法的工作原理。以下实现无法正常工作,因为计算机可能会丢失游戏。如果程序正常运行,理论上这应该是不可能的......

我在执行极小极大或获得最佳移动方面犯了错误吗?

我以前从未实现过该算法: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())));
}

谢谢你。

4

2 回答 2

0

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

find best move 有错误:

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

只需将其更改为

int value = alphabeta(board, 8, turn, -10000, 10000);
于 2015-08-29T07:17:35.047 回答
0

除了前面的答案,我很确定你的 GetBestMove 是错误的:只要移动更好或等于你当前最好的移动,你就会添加一个选择。但是当最佳值发生变化时,您实际上并没有清除列表。这意味着您的选择列表中将出现失败的动作。

于 2015-08-29T19:18:56.443 回答