我试图编写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);
我遇到的问题是,如果深度增加,计算机就不太可能阻止对手获胜。然而,由于深度只有两个,我不相信算法有足够的洞察力来阻止分叉移动(当对方玩家有一个移动,他们可以在两个位置移动以赢得比赛)。有没有人对如何修改算法有一些建议或指示?如有必要,我可以提供其他源代码。
答案 0 :(得分:1)
你所有的非终端位置都有相同的0分。仔细看看终端前的位置,即一次移动可以立即获胜的位置。
例如,尝试为你在该位置的每个获胜动作获得+1分,并且为对手在该位置中获得的每个获胜动作获得-1或-2。这将使算法更容易修剪分支,其中对手有很多方法可以获胜并且你很少。计算即时获胜动作应该相当便宜。当然,这基本上是一个内在的下降步骤,所以你的下降深度将是另一个。您可以减少初始允许深度。