0

一段时间以来,我一直在研究这种洪水填充实现,并一直遇到可怕的堆栈溢出。我在 12x10 网格上随机放置碎片,并在每个随机碎片掉落后调用 checkMatches 方法来检查三个或更多的组,因此使用洪水填充。

编辑:见评论

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);
    }

}

然后调用该方法的相关代码,如果有三个匹配的部分,则销毁这些部分:

    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 回答