0

私はこのフラッド フィルの実装をしばらく調べていて、恐ろしいスタック オーバーフローに遭遇し続けています。12x10 グリッドにピースをランダムにドロップし、ランダム ピースがドロップされるたびに checkMatches メソッドを呼び出して、3 つ以上のグループをチェックしているため、フラッド フィルを使用しています。

編集:コメントを参照

public void checkMatches(int x, int y, int type)
{
    if (x < 0 || x >= PIECES_WIDE || y < 0 || y >= PIECES_TALL || type == 0)
        return;
    if (grid[x][y].getType() != type)
        return;

    int checkL = x;
    while (checkL >= 0 && grid[checkL][y].getType() == type)
    {
        grid[checkL][y].setDestroy(true);
        numMatches++;
        checkL--;
    }
    checkL++;

    int checkR = x;
    while (checkR < PIECES_WIDE - 1 && grid[checkR][y].getType() == type)
    {
        grid[checkR][y].setDestroy(true);
        numMatches++;
        checkR++;
    }
    checkR--;

    for (int i = checkL; i <= checkR; i++)
    {
        if (y > 0 && grid[i][y - 1].getType() == type)
            checkMatches(i, y - 1, type);
        if (y < PIECES_TALL - 1 && grid[i][y + 1].getType() == type)
            checkMatches(i, y + 1, type);
    }

}

次に、メソッドを呼び出して、一致するピースが 3 つある場合にピースを破棄する関連コード:

    checkMatches(x, y, type);
    if (numMatches >= 3)
    {
        for (int i = 0; i < PIECES_WIDE; i++)
        {
            for (int j = 0; j < PIECES_TALL; j++)
            {
                if (grid[i][j].isDestroy())
                    destroyPiece(grid[i][j]);
            }
        }
    } else
    {
        numMatches = 0;
        for (int i = 0; i < PIECES_WIDE; i++)
        {
            for (int j = 0; j < PIECES_TALL; j++)
            {
                grid[i][j].setDestroy(false);
            }
        }
    }

目と脳が痛い。再帰がオーバーフローを引き起こしていることは知っていますが、この実装が何らかの形で可能であることも知っています。したがって、私は何か間違ったことをしています。前もって感謝します。

4

1 に答える 1

0

一致することがすでにわかっているピースにマークを付ける必要があります。次に、マークされたピースがなくなるまで、ループを作成してマッチングを拡張できます。その後、停止できます。

于 2013-09-22T06:52:10.077 に答える