java - Bubble Shooter 游戏中的 Flood-Fill 算法

标签 java algorithm stack-overflow

我在玩泡泡射击游戏。当我用相同颜色的射击泡泡击中泡泡时,我必须删除泡泡,然后我尝试使用洪水填充算法搜索我应该删除哪个泡泡。当射手泡泡碰到另一个泡泡时,我有一个错误:

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,这意味着它永远不会到达它实际标记的阶段一个地方为空。它会匹配其中一个条件,然后再次调用自己,然后它会匹配其中一个条件,并再次调用自己。它永远不会达到任何可以阻止它的地步。

最好将当前位置tabc的值作为参数传递给该方法,这样就可以标记为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/

相关文章:

c++ - 如何找到 2 组的交集?

将 C 代码转换为 MIPS 汇编 - 使用递归的组合函数

c - 查找堆栈缓冲区溢出

java - 如何在应用程序加载时在 ListView 上显示从 Firebase 实时数据库检索的内容

Java 全部替换,每出现两次就替换一次

java - 将一行文本转换为 int 值

java - 为什么这会发出未经检查的强制转换警告?

javascript - 在选择菜单中建议选项以获得更好的用户界面

c++ - log(n) std::find_if 可能吗?

java - 为什么下面的java代码会出现StackOverflow错误?