1

Java でマインスイーパのようなゲームを作成しようとしていますが、ほとんどの作業は完了しています。私が助けを必要としているのは FloodFill です - http://en.wikipedia.org/wiki/Flood_fill

誰かがそれがどのように機能するか説明できますか? ネットで調べたのですが、説明がよくわからないのでこちらで聞いたほうがわかりやすいと思いました。

私のマインスイーパには次のものがあります。

JButton[] btn = new JButton[100]//buttons being clicked and displaying the values/bombs
int[] mines = new int[100];//int array holding the values for each button.

グリッドは 10x10 グリッドなので、クリックしたボタンが btn[14] だったとします。

btn[4]  // north of btn[14](14-10)
btn[24] // south of btn[14](14+10)
btn[13] //  west of btn[14](14-1)
btn[15] //  east of btn[14](14+1)

質問に戻りますが、誰か説明してもらえませんか?

編集: コードを 2D に変更したので、上記の代わりに今は

btn[1][4]//row one, column 4

ボタンがクリックされたときに、値を持つ mines[][] という変数をチェックして、値が 0 (最初にクリックされた前後) の場合は BG を変更します。

btn[x][y].setBackground(Color.GRAY);
4

2 に答える 2

8

再帰アルゴリズムです。2D グリッド [x,y] の開始位置から開始し、すべての方向を見て、可能であればそれらを塗りつぶします。(x,y) を埋めることができない場合は、戻ります。

void floodFill( int x, int y ) {
   if ( btn( x, y ) isFillable ) {
       fillBtn(x,y);
       floodFill( x+1, y );
       floodFill( x-1, y );
       floodFill( x, y-1 );
       floodFill( x, y+1 );
   } else {
       return;
   }
}

(グリッドの境界チェックは省略)

于 2012-12-28T21:39:19.597 に答える
2

主にフラッドフィルについて質問していると思います。実際には、単純で一般的な再帰アルゴリズムです。データ構造が 1D であろうと 2D であろうと、それを解決できます。2D バージョンについては、@RMoeller が回答しています。以前の 1D 宣言については、次のようにも似ています。

void floodFill( int pos ) {
   if ( btn( pos ) isFillable ) {
       fillBtn(pos);
       floodFill( pos+1 );
       floodFill( pos-1 );
       floodFill( pos+10 );
       floodFill( pos-10 );
   } else {
       return;
   }
}

覚えておくべきことの 1 つは、floodfill とほとんどすべての再帰アルゴリズムが境界をチェックする必要があるということです。そうしないと、無限ループに陥るか、間違った結果が得られる可能性があります。上記の例 (1D バージョン) では、以下を確認する必要があります: pos >= 1 && pos <= 100 チェックする 2D バージョンと同様: x >= 1 && x <= 10 && y>=1 && y <=10

お役に立てれば。

于 2012-12-29T01:34:38.910 に答える