我需要为我的项目制作一个简单的(标准)扫雷。 我想检查二维数组的随机(或特定)元素的周围元素。
假设我有一个像这样的数组
boolean board[5][5]
我想查看
的周围元素 board[0][0]
我写道:
public int numberChecker(int h, int w) {
int checker = 0;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
int he = h - 1 + i;
int wi = w - 1 + i; <---- this i should be j that was the issue
if (board.getHeight() > he && he >= 0
&& wi >= 0 && board.getWidth() > wi) {
if (boomChecker(he, wi)) {
if (w != (wi) && h != (he)) {
checker++;
}
}
}
}
}
return checker;
}
问题是我认为它只检查“\”方式(不知道如何用文字表示)
例如:
(输出#表示未覆盖的数字表示周围的地雷)
揭露4-2
######
######
0#####
#0####
##0### <-- unlocking this one
###0##
或
揭开0-0
0#####
#0####
##0###
###### <-- there is a mine at check spot
######
######
代码本身并不重要(我知道我解释自己有点复杂)
我需要的是围绕检查循环(或任何东西)的工作
提前致谢
问题解决了 简单的愚蠢错误 int he = h - 1 + i; int wi = w - 1 + i; &lt; ---我应该是j 感谢
答案 0 :(得分:3)
我认为你的错误在于这两行:
int he = h - 1 + i;
int wi = w - 1 + i;
您将i的值添加到高度AND宽度。 所以你只需要检查3个对角线的每个区域3次。 我认为应该是
int he = h - 1 + i;
int wi = w - 1 + j;
所以你真的遍历了所有9个可能的领域,而不仅仅是通过对角线。
希望有所帮助!
答案 1 :(得分:0)
我打算写下我的回答,好像回答了一个家庭作业问题
现在你应该做的是,对于阵列中的每个单元,还有8个其他单元要检查。所以像:
count += board[i-1][j-1] ? 1 : 0;
count += board[i-1][j] ? 1 : 0;
count += board[i-1][j+1] ? 1 : 0;
count += board[i][j-1] ? 1 : 0;
etc.
确保包含一些机制来阻止您访问数组边界之外的元素。
另外,如果您想知道?
和:
是什么意思,请查看Ternary Operator它在各种情况下都很有用。
答案 2 :(得分:0)
顺便说一句,你可能最好明确检查8个可能的周围细胞中的每一个。 JVM可能会自动展开你的循环,但我不明白为什么你不会只是明确地检查它们。它会更快,更容易理解。
boolean upleft = board[row-1][column-1];
boolean up = board[row-1][column];
boolean upright = board[row-1][column+1];
boolean left = board[row][column-1];
boolean right = board[row][column+1];
boolean downleft = board[row+1][column-1];
boolean dow = board[row+1][column];
boolean downright = board[row+1][column+1];
你当然必须做界限检查你是否在董事会的边缘,但是对于发生的事情更有意义。