我在玩泡泡射击游戏。当我用相同颜色的射击泡泡击中泡泡时,我必须删除泡泡,然后我尝试使用洪水填充算法搜索我应该删除哪个泡泡。当射手泡泡碰到另一个泡泡时,我有一个错误:
Exception in thread "Thread-1" java.lang.StackOverflowError
我对 Flood-Fill 算法的实现:
public void floodFill(int disX, int disY){
//up
if(tab[disX][disY - 1] != null){
if (tab[disX][disY - 1].c == tab[disX][disY].c){
floodFill(disX, disY - 1);
tab[disX][disY - 1] = null;
}
}
//right
if(tab[disX + 1][disY] != null){
if (tab[disX + 1][disY].c == tab[disX][disY].c){
floodFill(disX + 1, disY);
tab[disX + 1][disY] = null;
}
}
//left
if(tab[disX - 1][disY] != null){
if (tab[disX - 1][disY].c == tab[disX][disY].c){
floodFill(disX - 1, disY);
tab[disX - 1][disY] = null;
}
}
//down
if(tab[disX][disY +1] != null){
if (tab[disX][disY +1].c == tab[disX][disY].c){
floodFill(disX, disY + 1);
tab[disX][disY + 1] = null;
}
}
}
气泡上下左右自碰。
你知道我做错了什么吗?
最佳答案
因为您仅在 递归调用该方法之后才将 tab
中的位置标记为 null,这意味着它永远不会到达它实际标记的阶段一个地方为空。它会匹配其中一个条件,然后再次调用自己,然后它会匹配其中一个条件,并再次调用自己。它永远不会达到任何可以阻止它的地步。
最好将当前位置tab
中c
的值作为参数传递给该方法,这样就可以标记为null 在您继续搜索之前。例如:
public void floodFill(int disX, int disY, int currentColor){
//up
if(tab[disX][disY - 1] != null){
if (tab[disX][disY - 1].c == currentColor ){
tab[disX][disY - 1] = null;
floodFill(disX, disY - 1, currentColor);
}
}
...
}
关于java - Bubble Shooter 游戏中的 Flood-Fill 算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30668475/