java - 扫雷程序递归错误

标签 java recursion stack-overflow

我正在用 java 为学校创建一个扫雷程序,但在清除旁边没有地雷的方 block 时遇到了问题,该方 block 应该被禁用,并且所有周围的方 block 都显示出来,如果还有一个没有碰到炸弹的方 block ,它会执行同样的操作。我收到堆栈溢出错误,我知道这与无限循环有关,但我找不到它在我的代码中卡住的位置。

我不知道出了什么问题,所以任何建议都会有所帮助。

下面是相关的代码(if语句是针对特殊情况,如果点击的方 block 在棋盘的边缘)

 private void doClear(int y, int x, JButton[][] bArray2, int gridy,int gridx)
{
    clicked--;
    bArray2[y][x].setBackground(lighterGray);
    bArray2[y][x].setEnabled(false);

    if (x > 0 && x<gridx-1 && y> 0 && y<gridy-1)
    {
        clearSquare(y-1, x-1,gridy, gridx, bArray2);
        clearSquare(y-1, x,gridy, gridx, bArray2);
        clearSquare(y-1, x+1,gridy, gridx, bArray2);
        clearSquare(y, x-1,gridy, gridx, bArray2);
        clearSquare(y, x+1,gridy, gridx, bArray2);
        clearSquare(y+1, x-1,gridy, gridx, bArray2);
        clearSquare(y+1, x,gridy, gridx, bArray2);
        clearSquare(y+1, x+1,gridy, gridx, bArray2);
    }
     if(y == 0 && x != 0 && x != gridx-1)  // top row check
                       {
                           clearSquare(y, x-1,gridy, gridx, bArray2);
                           clearSquare(y, x+1,gridy, gridx, bArray2);
                           clearSquare(y+1, x-1,gridy, gridx, bArray2);
                           clearSquare(y+1, x,gridy, gridx, bArray2);
                           clearSquare(y+1, x+1,gridy, gridx, bArray2);

                       } // ends top row check

                        if (y == 0 && x == 0) // corner check top left
                        {
                           clearSquare(y, x+1,gridy, gridx, bArray2);
                           clearSquare(y+1, x,gridy, gridx, bArray2);
                           clearSquare(y+1, x+1,gridy, gridx, bArray2);
                        } // ends top left corner check

                        if (y == 0 && x == gridx-1) // corner check top right row
                         {     
                           clearSquare(y, x-1,gridy, gridx, bArray2);
                           clearSquare(y+1, x-1,gridy, gridx, bArray2);
                           clearSquare(y+1, x,gridy, gridx, bArray2);                               
                        } // ends top right corner check

                        if (x == 0 && y != 0 && y != gridy-1)  //left column check
                        {
                           clearSquare(y-1, x,gridy, gridx, bArray2);
                           clearSquare(y-1, x+1,gridy, gridx, bArray2);
                           clearSquare(y, x+1,gridy, gridx, bArray2);
                           clearSquare(y+1, x,gridy, gridx, bArray2);
                           clearSquare(y+1, x+1,gridy, gridx, bArray2);  
                            } // ends left column check

                            if (x == gridx-1 && y != 0 && y != gridy-1)  // right column check
                            {
                           clearSquare(y-1, x-1,gridy, gridx, bArray2);
                           clearSquare(y-1, x,gridy, gridx, bArray2);
                           clearSquare(y, x-1,gridy, gridx, bArray2);
                           clearSquare(y+1, x-1,gridy, gridx, bArray2);
                           clearSquare(y+1, x,gridy, gridx, bArray2);
                            }// ends right column check

                       if(y == gridy-1 && x != 0 && x != gridx-1)
                       {
                           clearSquare(y-1, x-1,gridy, gridx, bArray2);
                           clearSquare(y-1, x,gridy, gridx, bArray2);
                           clearSquare(y-1, x+1,gridy, gridx, bArray2);
                           clearSquare(y, x-1,gridy, gridx, bArray2);
                           clearSquare(y, x+1,gridy, gridx, bArray2);
                       } // ends bottom row check

                       if (y == gridy-1 && x == 0)  // left bottom corner check
                       {
                           clearSquare(y-1, x,gridy, gridx, bArray2);
                           clearSquare(y-1, x+1,gridy, gridx, bArray2);
                           clearSquare(y, x+1,gridy, gridx, bArray2);

                        } // ends left bottom corner check

                        if (y == gridy-1 && x == gridx-1) // right bottom corner check
                        {
                           clearSquare(y-1, x-1,gridy, gridx, bArray2);
                           clearSquare(y-1, x,gridy, gridx, bArray2);
                           clearSquare(y, x-1,gridy, gridx, bArray2);
                        }//ends right bottom corner check
}

private void clearSquare(int y,int x, int gridy, int gridx, JButton[][] bArray2)
{
        int value = array[y][x];
        System.out.println(value);
        String text = bArray2[y][x].getText();
        if (text == "")
        {
        if (value == 0)
        {
            doClear(y, x, bArray2, gridy, gridx);
        }
        else{
            clicked--;
            bArray2[y][x].setText(""+value);
           }
       }

}

最佳答案

private void doClear(int y, int x, JButton[][] bArray2, int gridy,int gridx)
{
    if (...already cleared...) {
       return;
    }

    ...
}

如果不进行该检查,单元格 A 将清除邻居单元格 B,邻居单元格 B 将清除邻居单元格 A,邻居单元格 B 将清除邻居单元格 B,后者...

您发布的代码可以替换为以下内容:

private void handleClick(JButton[][] bGrid, int gridy, int gridx, int y, int x, bool realClick) {
    if (x < 0 || x >= gridx || y < 0 || y >= gridx) {
        return;
    }

    JButton button = bGrid[y][x];
    if (!button.isEnabled()) {
        return;
    }

    if (realClick) {
        --clicked;
    }

    button.setBackground(lighterGray);
    button.setEnabled(false);

    if (...is a mine...) {
        ...
    } else {
        button.setText(array[y][x]);

        if (value == 0) {
            handleClick(bGrid, gridy, gridx, y-1, x-1, false);
            handleClick(bGrid, gridy, gridx, y-1, x,   false);
            handleClick(bGrid, gridy, gridx, y-1, x+1, false);
            handleClick(bGrid, gridy, gridx, y,   x-1, false);
            handleClick(bGrid, gridy, gridx, y,   x+1, false);
            handleClick(bGrid, gridy, gridx, y+1, x-1, false);
            handleClick(bGrid, gridy, gridx, y+1, x,   false);
            handleClick(bGrid, gridy, gridx, y+1, x+1, false);
        }
    }
}

array”需要重命名为有意义的东西!

更新:添加了简化的代码。

关于java - 扫雷程序递归错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6272943/

相关文章:

list - 无法理解 Haskell 中的原始递归定义

haskell - Foldl/foldr 不会出现 stackoverflow

c++ - 你能举一个C++中堆栈溢出的例子吗?

c - 如何克服 Visual Studio 的堆栈大小问题(使用大数组运行 C 代码)

Java GUI - 添加文本字段

java - 从父类(super class)的数组调用子类的方法

mysql - 如何在 MySQL 中创建递归存储过程?

c - BNF 文法中的递归

java - 如何使用Mybatis和PostgreSQL创建一个空数组?

java - 为什么使用 DefaultHTTPClient 获取页面时出现乱码?