0

所以我有一种方法可以在扫雷游戏中级联显示。我有一个解决方案板和一个当前网格。但问题是,当我遇到 0 个空格时,递归调用时会出现堆栈溢出错误。

有没有人有任何想法?

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);
            }
        }
    }
}
4

2 回答 2

0

这是因为您的 forsrevealCell()迫使它一遍又一遍地被称为同一个 0 单元格。您可以跟踪您已经访问过的单元格,并在调用之前进行检查revealCell()

于 2013-04-12T05:11:25.103 回答
0

您的嵌套循环重复调用revealCell(row, col, ...). 要么重组你的循环,要么简单地插入一个if i!=row && j!=col警卫。

在此更改之后,您可能仍然有无限递归。自从我编写扫雷游戏以来已经有一段时间了,但是 IIRC 我使用了四种不同的递归调用以避免重复检查相同的单元格:一个调用从地雷碰撞点搜索了棋盘的左上象限(增加-行,递减列),一个搜索右上象限(递增行,递增列)等。

于 2013-04-12T05:13:59.407 回答