0

私の友人はマインスイーパのクローンを作成しています。彼は、鉱山以外/数字以外の「空白」の正方形をクリックすると、隣接するすべての空白が表示される部分を手伝ってくれるように頼まれました。以下は私が書いたコードです。なぜ解決しないのか理解できません。

私の基本的なケースは、for ループが完全に実行され、if ステートメントが決して true を返さない場合です。

足りないものはありますか?

ちなみに、これはJavaです。また、私は彼に、ボタンの状態の変化全体をメソッドに割り当てる必要があると言いました:p

public void revealAdjacentNulls(int r, int c)
{
    int ir, ic;

    //literal edge cases :P

    int rmax = (r == 15) ? r : r + 1;
    int cmax = (c == 15) ? c : c + 1;

    //check all spaces around button at r,c

    for(ir = (r==0) ? 0 : r-1; ir <= rmax; ir++){

        for (ic = (c==0) ? 0 : c-1; ic <= cmax; ic++){

            //if any are blank and uncovered, reveal them, then check again around the blanks

            if (buttons[ir][ic].value == 0 && buttons[ir][ic].isCovered == false)
            {
                buttons[ir][ic].setEnabled(false);  //number uncovered
                buttons[ir][ic].setBackground(Color.blue);
                buttons[ir][ic].setText(Character.toString(buttons[ir][ic].value));
                buttons[ir][ic].isCovered = false;
                revealAdjacentNulls(ir, ic);
            }
        }
    }

}
4

3 に答える 3

2

と の場合を考えてr==0みましょc==0う。buttons[0][0].value == 0buttons[0][0].isCovered == false

ループの最初の繰り返しで、関数は同じ引数 と と の状態を変更せずに自分自身を呼び出し0, 0ます。これは即座に無限再帰につながります。valueisCovered

PS他のフラッド フィル アルゴリズムについては、ウィキペディアの記事を参照してください。

于 2012-02-20T20:47:38.087 に答える
0

別のケース: r == 15 の場合、ループは 14 (r - 1) から 15 (rmax) になります。if ステートメントが true の場合、無限再帰が発生します。c.についても同様です。

于 2012-02-20T20:56:08.243 に答える
0

一つには、それは常に の再帰を続けrevealAdjacentNulls(r, c)ます。あなたの条件はそれisCoveredが偽でなければならないということですが、あなたも偽に設定 isCoveredしています。あなたは書くつもりでしたか:

buttons[ir][ic].isCovered = true;

? または、おそらくチェックは次のようになります。

if (buttons[ir][ic].value == 0 && buttons[ir][ic].isCovered)

(「カバーされている」の意味によって異なります。)

于 2012-02-20T20:49:23.680 に答える