Java 扫雷舰程序递归错误

Java 扫雷舰程序递归错误,java,recursion,stack-overflow,Java,Recursion,Stack Overflow,我正在用java为学校创建一个扫雷程序,在清除旁边没有地雷的方格时遇到了问题,方格应该被禁用,周围所有方格都显示出来,如果有另一个方格没有接触炸弹,它将执行相同的操作。我得到了一个堆栈溢出错误,我知道这与无限循环有关,但我找不到它在我的代码中卡住的地方 我不知道出了什么问题,所以任何建议都会有帮助 这是一段相对的代码(if语句用于特殊情况,如果单击的方块位于板的边缘) private void doClear(inty,intx,JButton[]]bArray2,intgridy,intgri

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

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

这是一段相对的代码(if语句用于特殊情况,如果单击的方块位于板的边缘)

private void doClear(inty,intx,JButton[]]bArray2,intgridy,intgridx)
{
点击--;
bArray2[y][x].退火场(lighterGray);
bArray2[y][x].setEnabled(false);
如果(x>0&&x 0&&y)
如果没有该检查,小区A将清除相邻小区B,这将清除相邻小区A,这将清除相邻小区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);
        }
    }
}
private void handleClick(JButton[]]bGrid、int gridy、int gridx、int y、int x、bool realClick){
如果(x<0 | | x>=gridx | | y<0 | | y>=gridx){
返回;
}
JButton button=bGrid[y][x];
如果(!button.isEnabled()){
返回;
}
如果(realClick){
--点击;
}
按钮。背景(lighterGray);
按钮。设置启用(错误);
如果(…是地雷…){
...
}否则{
button.setText(数组[y][x]);
如果(值==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
”需要重新命名为感官的东西


更新:添加了简化代码。

顺便说一句,如果在顶部和底部有一个额外的行,在左侧和右侧有一个额外的列,那么您需要的代码就会少得多。保持这些隐藏将其初始状态设置为清除。我已添加到我的答案中。事实证明,有另一种方法可以简化代码,而无需添加额外的行和列柱。
private void doClear(int y, int x, JButton[][] bArray2, int gridy,int gridx)
{
    if (...already cleared...) {
       return;
    }

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