我一直在查看这个泛洪填充实现一段时间,并继续遇到可怕的堆栈溢出。我在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);
}
}
}
我的眼睛和大脑受伤了。我知道递归导致溢出,但我也知道这种实现可能以某种形式出现。因此,我做错了什么。提前谢谢。
答案 0 :(得分:0)
您需要在已找到匹配的部分上添加标记。然后你可以做一个循环来扩展你的匹配,直到你注意到没有更多的标记被标记。然后你可以停下来。