我正在尝试用Java编写一个简单的m,n,k-游戏。游戏设置在10×10“板”上,图形表示为10行10列的网格。要赢得游戏,玩家必须水平,垂直或对角选择5个单元格。
我在编写一个算法时遇到问题,该算法会检查某个玩家是否赢得了游戏。游戏“board”在内部表示为名为matrix
的二维数组,每个维度有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维操作。如果疏忽令人困惑,我道歉。
答案 0 :(得分:1)
您的代码在for
循环的每一步中都使用1初始化计数器变量,因此每次进入下一列时,它都会将计数器重置为1.从{{1}中删除int counter = 1
身体。
答案 1 :(得分: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);
}
}
为方便起见,我已将win消息放入单独的方法中:
private static void win(int player) {
if (player == 1) {
JOptionPane.showMessageDialog(null, "Game over, RED wins!");
} else {
JOptionPane.showMessageDialog(null, "Game over, BLUE wins!");
}
}