我正在尝试用 Java 编写一个简单的 m、n、k- 游戏。游戏设置在一个 10 x 10 的“棋盘”上,该“棋盘”以图形方式表示为具有 10 行和 10 列的网格。要赢得游戏,玩家必须选择水平、垂直或对角线的 5 个单元格。
我在编写检查某个玩家是否赢得游戏的算法时遇到问题。游戏“棋盘”在内部表示为一个称为矩阵的二维数组,每个维度有 10 个元素。由于它是一个 int 数组,因此最初用零填充。我将两个玩家表示为数字 1 和数字 2。我创建了一个名为 checkIfWinOrDraw
的方法,该方法具有 x 坐标、y 坐标和最后移动的玩家的输入参数。每次选择单元格时都会运行此操作。我目前正处于非常基本的第一步,检查最后选定单元格的列中是否有与玩家编号相对应的五个连续值。我已经编写了一些实现此检查的逻辑,但它不起作用,而且我发现自己无法弄清楚为什么,所以我希望这里有人可以帮助我。需要明确的是,我已经进行了相当广泛的搜索,但我只能找到与我的问题非常模糊相关的解决方案,并且我无法从中得出解决方案,因为我仍然是编程的业余爱好者一般来说。所以我的问题是:我做错了什么以及这个问题的正确解决方案是什么?
有问题的代码:
public void checkIfWinOrDraw(int x, int y, int player){
// check columns
for(int i = 0; i < 9; i++) {
int counter = 1;
if (matrix[x][i] == player){
if(matrix[x][i] == matrix[x][i+1]){
counter++;
}
if (counter == 5) {
if(player == 1) {
JOptionPane.showMessageDialog(null, "Game over, RED wins!");
} else {
JOptionPane.showMessageDialog(null, "Game over, BLUE wins!");
}
}
} else {
counter = 1;
}
}
}
注意:我没有在标题中提到 2D 数组,因为我现阶段仅使用 1 维进行操作。如果遗漏令人困惑,我深表歉意。
最佳答案
您需要检查穿过给定点的 4 条线(水平线、垂直线和 2 条对角线)。对于每条线,你都必须从该点向两个方向走。这会给你 8 个连续的检查循环:
public void checkIfWinOrDraw(int x, int y, int player){
int line = 0;
for (int i = y + 1; i < 10 && matrix[x][i] == player; i++, line++);
for (int i = y; i >= 0 && matrix[x][i] == player; i--, line++);
if (line == 5) {
win(player);
return;
}
line = 0;
for (int i = x + 1; i < 10 && matrix[i][y] == player; i++, line++);
for (int i = x; i >= 0 && matrix[i][y] == player; i--, line++);
if (line == 5) {
win(player);
return;
}
line = 0;
for (int i = x + 1, j = y + 1; i < 10 && j < 10 && matrix[i][j] == player; i++, j++, line++);
for (int i = x, j = y; i >= 0 && j >= 0 && matrix[i][j] == player; i--, j--, line++);
if (line == 5) {
win(player);
return;
}
line = 0;
for (int i = x - 1, j = y + 1; i >= 0 && j < 10 && matrix[i][j] == player; i--, j++, line++);
for (int i = x, j = y; i < 10 && j >= 0 && matrix[i][j] == player; i++, j--, line++);
if (line == 5) {
win(player);
}
}
为了方便起见,我将获胜消息放入单独的方法中:
private static void win(int player) {
if (player == 1) {
JOptionPane.showMessageDialog(null, "Game over, RED wins!");
} else {
JOptionPane.showMessageDialog(null, "Game over, BLUE wins!");
}
}
关于java - 检查数组中某个值是否连续重复 5 次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48845942/