2012-07-10 40 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]; 

你當然不得不做,如果你在板的邊緣邊界檢查,但它更有意義,因爲對正在發生的事情。