TicTacToe minimax算法。可以使用一些输入

时间:2014-04-09 19:46:19

标签: java search artificial-intelligence

我试图编写minimax函数,以便计算机始终获胜或联系。因此,我的算法已达到反作用的程度,并且大部分时间都与之相关(有时候胜利有时会失败)。这是我到目前为止所拥有的。

public int minimax(char[][] state, int depth, boolean maximizingPlayer){
    BoardState node = new BoardState(state);

    if(depth == 0 || new BoardState(state).terminalState()){
        return score(node);
    }

    if(maximizingPlayer){
        int bestValue = Integer.MIN_VALUE;
        ArrayList<int[]> moves = node.moves();

        for(int[] move : moves){
            state[move[0]][move[1]] = mark;

            int value = minimax(state, depth - 1, false);

            if(value > bestValue){
                bestValue = value;
                bestX = move[0];
                bestY = move[1];
            }

            state[move[0]][move[1]] = '-';
        }

        return bestValue;
    }
    else{
        int bestValue = Integer.MAX_VALUE;
        ArrayList<int[]> moves = node.moves();

        for(int[] move : moves){
            state[move[0]][move[1]] = context.getOpposingMark();

            int value = minimax(state, depth - 1, true);

            if(value < bestValue){
                bestValue = value;
                bestX = move[0];
                bestY = move[1];
            }

            state[move[0]][move[1]] = '-';
        }

        return bestValue;
    }
}


private int score(BoardState node){
    if(node.winner(mark)){
        return 10;
    }
    else if(node.winner(context.getOpposingMark())){
        return -10;
    }
    else if(node.winningPosition(mark)){
        return 1;
    }
    else if(node.winningPosition(context.getOpposingMark())){
        return -1;
    }
    else{
        return 0;
    }
}

我的函数调用看起来像这样。

minimax(state, 2, true);

我遇到的问题是,如果深度增加,计算机就不太可能阻止对手获胜。然而,由于深度只有两个,我不相信算法有足够的洞察力来阻止分叉移动(当对方玩家有一个移动,他们可以在两个位置移动以赢得比赛)。有没有人对如何修改算法有一些建议或指示?如有必要,我可以提供其他源代码。

1 个答案:

答案 0 :(得分:1)

你所有的非终端位置都有相同的0分。仔细看看终端前的位置,即一次移动可以立即获胜的位置。

例如,尝试为你在该位置的每个获胜动作获得+1分,并且为对手在该位置中获得的每个获胜动作获得-1或-2。这将使算法更容易修剪分支,其中对手有很多方法可以获胜并且你很少。

计算即时获胜动作应该相当便宜。当然,这基本上是一个内在的下降步骤,所以你的下降深度将是另一个。您可以减少初始允许深度。