2012-07-10 34 views
0

我需要为我的项目制作一个简单的(标准)扫雷。 我想检查一个2d数组的随机(或特定)元素的周围元素。检查数组元素周围的单元格java

可以说我有这样的

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; < ---我应该Ĵ 感谢

+0

项目?这是'家庭作业'的代码?如果是这样,请添加一个作业标签。哦,和“\”的方式被称为“对角线” – TheZ 2012-07-10 21:52:12

+0

但只有\方式对角线 /这也是一个对角线,这就是为什么我没有说对角线:) – 2012-07-10 21:54:25

+1

我会用东南(“\”)和南 - 西方(“/”)方向术语。 – user845279 2012-07-10 21:57:19

回答

3

我认为你错就错在这2条线:

int he = h - 1 + i; 
int wi = w - 1 + i; 

您添加的高度和在宽度i的值。 所以你只要检查3个对角线场的每一个3次。 我觉得应该是

int he = h - 1 + i; 
int wi = w - 1 + j; 

让您真正通过所有9个可能的领域,而不是仅仅通过diagonale迭代。

希望有帮助!

+0

该死的。那是我今天第九次愚蠢的错误。非常感谢。我需要睡 – 2012-07-10 21:57:52

+0

没问题的兄弟;-) – DrLudwig3 2012-07-10 22:01:07

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它在各种情况下都很有用。

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]; 

你当然不得不做,如果你在板的边缘边界检查,但它更有意义,因为对正在发生的事情。