2017-01-01 41 views
0

我正在寫Java掃雷艇克隆,我一直在計算周圍炸彈數量的部分麻煩。出於某種原因,有些細胞可以檢測到其他炸彈,或者根本沒有炸彈(甚至奇怪,有些細胞工作正常)。有人可以幫忙嗎?謝謝!掃雷周邊礦山工程的一半時間

注:key[][]int[][]陣列記錄所述炸彈的位置,指定爲9.

0表示一個空的空間

int count表示處於圍繞每個8個細胞炸彈的量細胞(這就是爲什麼我也有8 try-catch代碼迴路佔邊境細胞)

PS:抱歉壞格式

編輯:我想通在哪裏我的問題是(我打電話給我兩次)。任何關於如何讓代碼更簡單更高效的建議?

private void numberSet() { 

    int count = 0; 
    for (int i = 0; i < key.length; i++) { 
     for (int a = 0; a < key[0].length; a++) { 

      if (key[i][a] == 0) { 

       try { 
        if (key[i + 1][a] == 9) { 
         count++; 
        } 

       } catch (java.lang.ArrayIndexOutOfBoundsException e) { 
        continue; 
       } 
       try { 
        if (key[i - 1][a] == 9) { 
         count++; 
        } 

       } catch (java.lang.ArrayIndexOutOfBoundsException e) { 
        continue; 
       } 
       try { 
        if (key[i][a + 1] == 9) { 
         count++; 
        } 

       } catch (java.lang.ArrayIndexOutOfBoundsException e) { 
        continue; 
       } 
       try { 
        if (key[i][a - 1] == 9) { 
         count++; 
        } 

       } catch (java.lang.ArrayIndexOutOfBoundsException e) { 
        continue; 
       } 
       try { 
        if (key[i + 1][a + 1] == 9) { 
         count++; 
        } 

       } catch (java.lang.ArrayIndexOutOfBoundsException e) { 
        continue; 
       } 
       try { 
        if (key[i - 1][a + 1] == 9) { 
         count++; 
        } 

       } catch (java.lang.ArrayIndexOutOfBoundsException e) { 
        continue; 
       } 
       try { 
        if (key[i + 1][a - 1] == 9) { 
         count++; 
        } 

       } catch (java.lang.ArrayIndexOutOfBoundsException e) { 
        continue; 
       } 
       try { 
        if (key[i - 1][i - 1] == 9) { 
         count++; 

        } 

       } catch (java.lang.ArrayIndexOutOfBoundsException e) { 
        continue; 
       } 
       key[i][a] = count; 
      } 
      count = 0; 
     } 
    } 

} 
+5

我覺得你應該擺脫所有的try/catch塊。它應該以這樣的方式進行編碼,即數組索引越界不會發生,如果它仍然發生*然後*您想拋出異常,以便程序爆炸並且您知道您沒有正確寫入。 –

+1

關於代碼片段的一個小提示:如果你不使用它,讓自己一個合適的IDE - 像IntelliJ https://www.jetbrains.com/idea/download/ - 並使用「重新格式化代碼」來帶上你的代碼在將其粘貼到論壇或StackOverflow中之前保持良好狀態。如果你的代碼更容易閱讀,人們更可能幫助你。 –

+0

喜歡測試,看看我或一個是0先? –

回答

2

我會認真考慮完全放棄你這樣做的方式。當我第一次開始編寫代碼時,我也做了一個掃雷遊戲,並且我做了你正在做的事情。經過一些修改後,我能夠將它全部放入幾個循環中。我試着在我的代碼中足夠評論,告訴你每一行的功能。這段代碼沒有經過測試,所以它可能不會馬上工作,完全誠實。但是,我仔細觀察了幾次,看起來好像會對我有用。我建議你拿這個代碼,並嘗試使其工作。試一試。

//For every Cell on the board 
for (int i = 0; i < key.length; i++){ 
    for (int a = 0; a < key[0].length; a++){ 

     //If it Is not a mine 
     if (key[i][a] == 0){ 
      int count = 0; 

      //Position of cells around key[i][a] relative to key[i][a] 
      for (int x = -1; x < 2; x++){ 
       for (int y = -1; y < 2; y++){ 

        //Storing x and y test points 
        int testX = i + x;//testX = i-1, i, and i+1 
        int testY = i + y;//testY = i-1, y, and y+1 

        //If the testX and testY values are within the range of the array 
        if ((testX >= 0 && testX < key[0].length) && testY >= 0 && testY < key.length){ 

         //If there is a mine 
         if (key[testX][testY] == 9){ 
          count++; 
         } 
        } 
       } 
      } 

      key[i][a] = count; 

      //count = 0; This is redundant. Line 7 count gets set to 0. 
     } 
    } 
} 
+0

順便說一下,如果您對上面的代碼有任何疑問,請隨時詢問 –

+0

它看起來好像計數上的增量不會使其到循環的末尾 –

+0

您已完全對,我的不好。 @Brian Lee我修復了這部分內容。仍然不能保證它的作品。 –

2

看起來你是濫用continue聲明,它將執行回遷for循環,因此無法完成各種檢查,以增加count

catch聲明中,您應該不做任何事情。

+0

這是真的。如果你刪除所有的「繼續」語句,你可能會好起來的。 –

1
if(key[i-1][i-1] == 9){ 

這看起來不同於你所有的其他人,其中有我和一個。這一個使用我兩次。也許這是你的問題?

+0

也許你應該使用for循環或其他東西,所以你不會重複8次基本相同的事情。這就是這種錯誤可能發生的原因。 –

+0

OH我沒有看到 –