gpt4 book ai didi

java - Java 中的 Minimax 不起作用

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:20:01 25 4
gpt4 key购买 nike

我正在尝试让我的极小极大算法适用于 8x8 五子棋棋盘,我必须连续匹配 5 个/列/对角线才能获胜!我的算法似乎没有正常工作,我无法查明哪里出错了!

我的 generateMoves() 方法工作正常,它生成所有合法的移动,所以我知道它不是那样的。 minimax 返回 -1,-1 作为最佳着法,但那当然会引发 illegalMove 错误,因为你不能在从 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 语句时,您会惊讶地发现您的代码没有介入。您将仔细查看所比较的值,然后意识到您的错误。

关于java - Java 中的 Minimax 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35674119/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com