0

最初に、小さなバブル クリッカー ゲームを作成しています。このゲームでは、バブル (オランダ語で「Bubbel」) をクリックすると、はじけるバブルに直接触れている同じ色のすべてのバブルがはじけます。

コードの一部に少し問題があり、なぜこれが続くのかわかりません。コードは次のとおりです。

public void checkIfNeighbors(int x, int y)
    {
        bool left = false;
        bool right = false;
        bool up = false;
        bool down = false;
            if(x != 0)
                left = Bubbels1[x - 1, y].GetType == Bubbels1[x, y].GetType && Bubbels1[x - 1, y].IsAlive;
            if(x != 11)
                right = Bubbels1[x + 1, y].GetType == Bubbels1[x, y].GetType && Bubbels1[x + 1, y].IsAlive;
            if(y != 0)
                up = Bubbels1[x, y - 1].GetType == Bubbels1[x, y].GetType && Bubbels1[x, y - 1].IsAlive;
            if(y != 11)
                down = Bubbels1[x, y + 1].GetType == Bubbels1[x, y].GetType && Bubbels1[x, y + 1].IsAlive;
            if (left)
            {
                pop = true;
                checkIfNeighbors(x - 1, y);
            }
            if (right)
            {
                pop = true;
                checkIfNeighbors(x + 1, y);
            }
            if (up)
            {
                pop = true;
                checkIfNeighbors(x, y - 1);
            }
            if (down)
            {
                pop = true;
                checkIfNeighbors(x, y + 1);
            }
            if (pop)
            {
                Bubbels1[x, y].IsAlive = false;
            }
    }

これをより迅速かつ効率的にする方法はありますか? また、常にスタックオーバーフローが発生しますが、「if」を1つの「if」に減らすと、そうではありません(バブルラインが同じバブルの長さの12であっても)

何をしたかはわかりませんが、以前は何とか機能していました...

4

1 に答える 1

1

5,4 と 5,5 に 2 つのアライブ バブルがあるとどうなるか考えてみてください。に電話するとしましょうcheckIfNeighbors(5,4)

右側の隣人を見て、 を呼び出して再帰checkIfNeighbors(5,5)します。

その呼び出しは、左側の隣人を処理する必要があることに気付きます ( checkIfNeighbors(5,4).

これは終わりのないサイクルになり、すぐにスタック オーバーフローエラーが表示されます。

修正は、近隣のいずれかを処理するに現在のバブルをポップすることです。

- -編集 - -

「隣人がいない」状態を 2 つの方法で処理する必要があります。

メイン プログラムから呼び出された場合、バブルはポップしません。

再帰の結果として呼び出された場合 (つまり、これがポップする最後のバブルである場合)、バブルをポップします。

修正はフラグを渡すことです:

public void checkIfNeighbors(int x, int y, bool inRecursion)
    {
        bool left = false;
        bool right = false;
        bool up = false;
        bool down = false;
            if(x != 0)
                left = Bubbels1[x - 1, y].GetType == Bubbels1[x, y].GetType && Bubbels1[x - 1, y].IsAlive;
            if(x != 11)
                right = Bubbels1[x + 1, y].GetType == Bubbels1[x, y].GetType && Bubbels1[x + 1, y].IsAlive;
            if(y != 0)
                up = Bubbels1[x, y - 1].GetType == Bubbels1[x, y].GetType && Bubbels1[x, y - 1].IsAlive;
            if(y != 11)
                down = Bubbels1[x, y + 1].GetType == Bubbels1[x, y].GetType && Bubbels1[x, y + 1].IsAlive;
            if (left)
            {
                Bubbels1[x, y].IsAlive = false;
                checkIfNeighbors(x - 1, y, true);
            }
            if (right)
            {
                Bubbels1[x, y].IsAlive = false;
                checkIfNeighbors(x + 1, y, true);
            }
            if (up)
            {
                Bubbels1[x, y].IsAlive = false;
                checkIfNeighbors(x, y - 1, true);
            }
            if (down)
            {
                Bubbels1[x, y].IsAlive = false;
                checkIfNeighbors(x, y + 1, true);
            }
            if (inRecursion)
            {
                Bubbels1[x, y].IsAlive = false;
            }
    }

最初の呼び出しで、 inRecursion をfalse :に設定しますcheckIfNeighbors(5,7,false)

于 2013-10-14T16:02:48.250 に答える