Java中的Minimax不工作
我想让我的minimax算法适用于8x8 Gomoku板,我必须匹配5行/ col /对角才能赢得胜利!我的算法似乎没有正常工作,我无法确定它出错的位置!Java中的Minimax不工作
我的generateMoves()方法工作正常,它会生成所有合法的移动,所以我知道不是这样。最小最大值返回-1,-1作为最佳移动,但当然会抛出一个非法移动错误,因为从0,0到7,7板上不能有-1,-1。
任何帮助表示赞赏。谢谢。
private int[] minimax(int depth, Color [][] board) {
List<int[]> nextMoves = generateMoves(board);
int bestScore = (me == Color.WHITE) ? Integer.MIN_VALUE : Integer.MAX_VALUE;
int currentScore;
int bestRow = -1;
int bestCol = -1;
if (nextMoves.isEmpty() || depth == 0) {
bestScore = evaluateBoard(board);
} else {
for (int[] move : nextMoves) {
System.out.println(move[0]+","+move[1]+" THIS WAS ATTEMPTED");
board[move[0]][move[1]] = Color.WHITE;
if (me == Color.BLACK) {
currentScore = minimax(depth - 1, board)[0];
if (currentScore > bestScore) {
bestScore = currentScore;
bestRow = move[0];
bestCol = move[1];
}
} else { // oppSeed is minimizing player
currentScore = minimax(depth - 1, board)[0];
if (currentScore < bestScore) {
bestScore = currentScore;
bestRow = move[0];
bestCol = move[1];
}
}
board[move[0]][move[1]] = null;
}
}
return new int[] {bestRow, bestCol};
}
public int evaluateBoard(Color[][] board) {
int score = 0;
// Check all the rows
for (int i = 0; i < 8; i++) {
int blank = 0;
int black = 0;
int white = 0;
for (int j = 0; j < 8 - 5; ++j) {
if (board[i][j] == Color.black) {
black++;
if (board[i][j + 1] == Color.BLACK) {
black++;
if (board[i][j + 2] == Color.BLACK) {
if (board[i][j + 3] == Color.BLACK) {
black++;
if (board[i][j + 4] == Color.BLACK) {
black++;
}
}
}
}
} else if (board[i][j] == Color.WHITE) {
white++;
if (board[i][j + 1] == Color.WHITE) {
white++;
if (board[i][j + 2] == Color.WHITE) {
white++;
if (board[i][j + 3] == Color.WHITE) {
white++;
if (board[i][j + 4] == Color.WHITE) {
white++;
}
}
}
}
}
}
System.out.println(black);
score += scoreChange(black, white);
}
// Check all the columns
for (int j = 0; j < 8; ++j) {
int blank = 0;
int black = 0;
int white = 0;
for (int i = 0; i < 8 - 5; ++i) {
if (board[i][j] == Color.black) {
black++;
if (board[i + 1][j] == Color.BLACK) {
black++;
if (board[i + 2][j] == Color.BLACK) {
black++;
if (board[i + 3][j] == Color.BLACK) {
black++;
if (board[i + 4][j] == Color.BLACK) {
black++;
}
}
}
}
} else if (board[i][j] == Color.WHITE) {
white++;
if (board[i + 1][j] == Color.WHITE) {
white++;
if (board[i + 2][j] == Color.WHITE) {
white++;
if (board[i + 3][j] == Color.WHITE) {
white++;
if (board[i + 4][j] == Color.WHITE) {
white++;
}
}
}
}
}
}
score += scoreChange(black, white);
}
int black = 0;
int white = 0;
// Check diagonal (Second)
for (int i = 7, j = 0; i > 3; --i, ++j) {
if (board[i][j] == Color.black) {
black++;
if (board[i - 1][j + 1] == Color.black) {
black++;
if (board[i - 2][j + 2] == Color.black) {
black++;
if (board[i - 3][j + 3] == Color.black) {
black++;
if (board[i - 4][j + 4] == Color.black) {
black++;
}
}
}
}
} else if (board[i][j] == Color.white) {
white++;
if (board[i - 1][j + 1] == Color.white) {
white++;
if (board[i - 2][j + 2] == Color.white) {
white++;
if (board[i - 3][j + 3] == Color.white) {
white++;
if (board[i - 4][j + 4] == Color.white) {
white++;
}
}
}
}
}
}
score += scoreChange(black, white);
black = 0;
white = 0;
// Check Diagonal (First)
for (int i = 0, j = 0; i < 4; ++i, ++j) {
if (board[i][j] == Color.black) {
black++;
if (board[i + 1][j + 1] == Color.black) {
black++;
if (board[i + 2][j + 2] == Color.black) {
black++;
if (board[i + 3][j + 3] == Color.black) {
black++;
if (board[i + 4][j + 4] == Color.black) {
black++;
}
}
}
}
} else if (board[i][j] == Color.white) {
white++;
if (board[i + 1][j + 1] == Color.white) {
white++;
if (board[i + 2][j + 2] == Color.white) {
white++;
if (board[i + 3][j + 3] == Color.white) {
white++;
if (board[i + 4][j + 4] == Color.white) {
white++;
}
}
}
}
}
}
score += scoreChange(black, white);
return score;
}
private int scoreChange(int black, int white) {
int change;
if (black == 5) {
change = -10000;
} else if (black == 4 && white == 0) {
change = -1000;
} else if (black == 3 && white == 0) {
change = -100;
} else if (black == 2 && white == 0) {
change = -10;
} else if (black == 1 && white == 0) {
change = -1;
} else if (white == 5) {
change = 10000;
} else if (white == 4 && black == 0) {
change = 1000;
} else if (white == 3 && black == 0) {
change = 100;
} else if (white == 2 && black == 0) {
change = 10;
} else if (white == 1 && black == 0) {
change = 1;
} else {
change = 0;
}
return change;
}
如果玩家是黑人,最好的分数是Integer.Max。目前的分数永远不会比这大,所以最好的举动从未设置。对于白人来说,问题是一致的:最好的分数是Integer.Min,现在的分数永远不会更小。
用调试器找到像这样的错误要容易得多。设置一个断点,您将移动设置为-1,然后前进。当你看到这些if语句时,如果代码没有进入,你会感到惊讶。你将仔细看看被比较的值,然后意识到你的错误。
所以我基本定currentScore 南辕北辙,我已经没有固定的,但它似乎并没有被卫冕也不以为聪明还是 – Aceboy1993
我不玩游戏,我没有你所有的代码,所以我无法评估你的代码不工作的原因。 (我也不应该)但是我怀疑你想要bestScore代表的不是“最好的得分”,而是“我发现到现在为止的最好成绩”。改变你的比较方向只是接受*每一个*举动。你也可以用调试器解决问题。 –
你有你的错...... – elyashiv