libgdx开发中flood fill算法仅消除右侧同色块无递归是什么原因?
问题核心原因
你的代码缺少对blockSprites[x][y]是否为null的前置判断,导致递归过程中触发空指针异常,直接中断了整个递归流程。只有先执行的右侧递归分支能跑完,剩下的左、上、下分支还没来得及执行就因为异常终止,所以只会出现右侧同色方块被消除的情况。
原理说明
你可以对应这个场景理解:假设点击的是最左侧的同色块,代码会先递归处理右侧所有相邻同色格子,当递归到某个格子需要回溯检查左侧已经被置为null的已处理格子时,会直接调用blockSprites[x][y].getColor(),触发空指针异常,整个递归栈直接崩溃停止,因此你只能看到右侧的方块被消除。
修复后代码
private static void floodfill(int x,int y, Color color) { if (x>=10 || y>=15 || x<0 || y<0) { System.out.println("sap"); return; } // 新增空判断,避免访问已消除的格子触发空指针 if (blockSprites[x][y] == null) { return; } if (!blockSprites[x][y].getColor().equals(color)) { System.out.println("sas"); return; } blockSprites[x][y]=null; floodfill(x+1,y,color); //right floodfill(x-1,y,color); //left floodfill(x,y-1,color); //down floodfill(x,y+1,color); //up }
可选优化建议
调用floodfill时的入参color,建议直接从点击的方块实例取blockSprites[点击X坐标][点击Y坐标].getColor()传入,避免Color引用意外变化导致颜色匹配失效。
内容的提问来源于stack exchange,提问作者JellySword
相关产品推荐
相关产品推荐

