Java 级联显示的扫雷舰递归算法
因此,我有一个方法,将在扫雷游戏级联显示的大部分。我有一个解决方案板和一个当前网格。但问题是,当我运行到0空间时,在递归调用时会出现堆栈溢出错误 有人有什么想法吗Java 级联显示的扫雷舰递归算法,java,minesweeper,Java,Minesweeper,因此,我有一个方法,将在扫雷游戏级联显示的大部分。我有一个解决方案板和一个当前网格。但问题是,当我运行到0空间时,在递归调用时会出现堆栈溢出错误 有人有什么想法吗 public static void revealCell(int row, int col, char[][] grid, char[][] answers) { System.out.println(row + " " + col); if(row < 0|| row > 4){ Sys
public static void revealCell(int row, int col, char[][] grid, char[][] answers) {
System.out.println(row + " " + col);
if(row < 0|| row > 4){
System.out.println("bad");
return;
}
if(col < 0|| col > 4){
System.out.println("bad");
return;
}
if(answers[row][col] == 'B'){
grid[row][col] = answers[row][col];
return;
}
if(answers[row][col] == '1'||answers[row][col] == '2'||answers[row][col] == '3'||answers[row][col] == '4'||answers[row][col] == '5'){
grid[row][col] = answers[row][col];
return;
}
if(answers[row][col] == '0'){
System.out.println("go");
grid[row][col] = answers[row][col];
for(int i = row-1; i <= row +1; i++){
for(int j = col-1; j<= col +1;j++){
revealCell(i,j, grid, answers);
}
}
}
}
publicstaticvoidrevealcell(int行、int列、char[][]网格、char[][]答案){
系统输出打印项次(行+列+列);
如果(行<0 | |行>4){
系统输出打印项次(“坏”);
返回;
}
if(col<0 | | col>4){
系统输出打印项次(“坏”);
返回;
}
如果(回答[行][col]==“B”){
网格[行][col]=答案[行][col];
返回;
}
如果(回答[行][col]=“1”|回答[行][col]=“2”|回答[行][col]=“3”|回答[行][col]=“4”|回答[行][col]=“5”){
网格[行][col]=答案[行][col];
返回;
}
如果(回答[行][col]=“0”){
System.out.println(“go”);
网格[行][col]=答案[行][col];
对于(int i=row-1;i这是因为围绕revalcell()
的for会一次又一次地强制为同一个0单元格调用它。您可以跟踪已经访问过的单元格,并在调用revalcell()
之前检查嵌套循环是否重复调用revalcell(row,col,…)
。重新构造循环,或者如果i!=row&&j!=col,只需插入一个
在这个更改之后,您可能仍然有无限递归。我编写扫雷游戏已经有一段时间了,但是IIRC我使用了四个不同的递归调用,以避免重复检查相同的单元格:一个调用从地雷碰撞点开始搜索板的左上象限(增加行,减少列),其中一个搜索了右上象限(增加行,增加列),等等。我想我找到了答案,我只是在递归调用另一个矩阵周围添加了if(grid[I][j]!=“0”)。