我的洪水填充方法:
public void fillNeighbours(int x, int y) {
for(int i = -1; i < 2; i++) {
for(int j = -1; j < 2; j++) {
try {
visible[x+i][y+j] = true;
if(num[x+i][y+j] == 0) {
fillNeighbours(x+i, y+j);
}
} catch (ArrayIndexOutOfBoundsException ignored) {}
}
}
}
catch (ArrayIndexOutOfBoundsException ignored) {}
用于避免x和/或y位置超出数组。数组大小是30比30.我正在像游戏一样进行扫雷。所以你可能知道为什么我需要这个方法以及它应该如何工作。如果你不知道什么是扫雷,那么这里有关于该游戏的快速视频:Introduction to minesweeper
答案 0 :(得分:1)
代码重新访问已设置为可见的字段。
尝试类似
的内容if(!visible[x+i][y+j]){
visible[x+i][y+j] = true;
if(num[x+i][y+j] == 0) {
fillNeighbours(x+i, y+j);
}
}
答案 1 :(得分:0)
看起来你没有任何突破子句(基本情况)递归调用fillNeighbours
,所以调用填满了堆栈。
递归的树定律是
答案 2 :(得分:0)
一旦fillNeighbours找到一个单元并自行调用,当i和j等于零时,下一个循环将始终调用另一个循环。所以它永远不会退出,并在堆栈装满后崩溃。
除此之外,它会生成一个非常深的树,因为它没有跟踪哪些单元格被递归,并且会多次在同一个单元格上调用fillNeighbours。