2017-01-01 15 views
0

私はJavaで掃海艇クローンを書いています。周囲の爆弾数が計算される部分に問題がありました。何らかの理由で、一部の細胞が追加の爆弾を検出するか、爆弾が全く検出されません(奇妙なことに、一部の細胞は正常に機能します)。助けてもらえますか?ありがとう!鉱山周りの鉱山は半分の時間で動作します

注:key[][] 9.

0として指定された爆弾の位置を記録int[][]アレイは、それぞれを取り囲む8個の細胞である爆弾の量を表す

int count空きスペースを表しますセル(私も8のtry-catchが境界セルを考慮するために、ループを持っている理由です)

PS:悪いフォーマット

EDITのため申し訳ありません:私は考え出し私の問題がどこにあったか(私は私に二度電話した)。どのように私はこのコードをより簡単で効率的にすることができるかについての提案はありますか?

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

コードスニペットに関する小さなヒント:既に使用していない場合は、IntelliJ https://www.jetbrains.com/idea/download/のような適切なIDEを取得し、コードを使用するために「再フォーマットコード」を使用してください良い形でそれをフォーラムやStackOverflowに貼り付ける前に。コードを読みやすくすると、人々があなたを助けてくれる可能性が高くなります。 –

+0

iかaが最初に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){ 

これは、iとaを持つ他のすべてのものとは異なります。これはiを2回使用します。多分それはあなたの問題ですか?

+0

多分、あなたはforループなどを使う必要があります。したがって、基本的に同じことを8回繰り返すわけではありません。それがこの種の間違いが起こる方法です。 –

+0

オハイオ州私はそれを参照してください –

関連する問題