【发布时间】:2014-04-09 19:46:18
【问题描述】:
我正在尝试编写 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);
我遇到的问题是,如果深度增加,计算机阻止对手获胜的可能性就会降低。然而,由于深度只有两个,我认为该算法没有足够的洞察力来阻止分叉动作(当对方玩家有一个动作时,他们可以在两个位置放置一个动作来赢得比赛)。有人对我如何修改算法有一些建议或指示吗?如有必要,我可以提供额外的源代码。
【问题讨论】:
标签: java search artificial-intelligence