【问题标题】:Minesweeper recursion for cascading reveal用于级联显示的扫雷递归
【发布时间】:2014-11-16 08:46:43
【问题描述】:

所以我有大部分方法可以在扫雷游戏中级联显示。我有一个解决方案板和一个当前网格。但问题是,当我遇到 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);
            }
        }
    }
}

【问题讨论】:

    标签: java minesweeper


    【解决方案1】:

    这是因为您在 revealCell() 周围的 fors 会一遍又一遍地为同一个 0 单元格调用它。您可以跟踪您已经访问过的单元格,并在致电 revealCell() 之前进行检查。

    【讨论】:

    • 我想我明白了,我只是在递归调用周围添加了 if(grid[i][j] != '0')
    • 我想是另一个矩阵。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-12
      • 1970-01-01
      相关资源
      最近更新 更多