2017-10-20 5 views
-3

私の塗りつぶし方法:catch (ArrayIndexOutOfBoundsException ignored) {}は、アレイの外に行くから、xおよび/またはy位置を避けるためにそこにあるシンプル塗りつぶし方法はStackOverflowのエラーが発生し

public void fillNeighbours(int x, int y) { 
    for(int i = -1; i < 2; i++) { 
     for(int j = -1; j < 2; j++) { 
      try { 
       visible[x+i][y+j] = true; 

       if(num[x+i][y+j] == 0) { 
        fillNeighbours(x+i, y+j); 
       } 
      } catch (ArrayIndexOutOfBoundsException ignored) {} 
     } 
    } 
} 

こと。配列のサイズは30で30です。私は地雷のようなゲームを作っています。だから、なぜこの方法が必要なのか、それがどう動くべきかを知っているかもしれません。もしあなたが魚雷が何であるのか分からなければ、そのゲームに関するビデオは以下のようになります。Introduction to minesweeper

+1

のようなものを試してみてください。 –

+0

1.境界を計算し、arrayIndexOutofBoundsExceptionsを使用しないでください! 2.コードスニペットから、ループを終了させるものは見えません。 fillNeighboursを呼び出し続けます。あなたのnum [x + i] [y + j]が0以外の値に変更されているかどうかを確認してください。 –

答えて

1

コードは、visibleに既に設定されているフィールドを再訪します。

は、あなたがそのような例外を飲み込む/無視することはほとんどないはずです

if(!visible[x+i][y+j]){ 
    visible[x+i][y+j] = true; 
    if(num[x+i][y+j] == 0) { 
    fillNeighbours(x+i, y+j); 
    } 
} 
+0

OPコードが1つの変数をチェックしているような、if(!visible [x + i] [y + j]しかし別のものを設定してください。つまり、塗りつぶす面積が大きければ、スタックはまだオーバーフローする可能性があります。 – Persixty

+0

@Persixty現在のデータ表現には両方のチェックが必要です。コードがその場で隣人を数えれば、-1(言いましょう)はvisible = falseをエンコードでき、0 ... 8はvisible = trueを表すことができます。 – tevemadar

+0

あなたは正しいかもしれません。 OPの中でモデルが何であるかははっきりしていません。 – Persixty

0

コールがスタックを満たすように、再帰的にfillNeighboursをブレークアウト句(基本ケース)なしで呼び出すようです。再帰の

Wikistack

からツリー法は、再帰的なアルゴリズムは、基本ケースを持っている必要があります

  1. です。
  2. 再帰アルゴリズム は、状態を変更してベースケースに移動する必要があります。
  3. 再帰的アルゴリズム アルゴリズムは、自身を再帰的に呼び出す必要があります。
0

fillNeighboursがセルを見つけてそれ自身を呼び出すと、次のループは、iとjがゼロに等しいときに常に別のループを呼び出すことになります。スタックがいっぱいになると、それは決して終了せず、クラッシュします。

これとは別に、どのセルが再帰されたかを追跡していないため、非常に深いツリーが生成され、同じセルでfillNeighboursが複数回呼び出されます。

関連する問題