java minesweeper游戏中的Stackoverflow异常

时间:2011-07-12 14:23:02

标签: java recursion stack-overflow minesweeper

我试图用Java制作一个扫雷游戏,但我一直遇到这个错误。此函数设置要单击的当前方块和要单击的任何相邻方块,并以递归方式继续。当它用完正方形时它应该停止,但即使我用0地雷将字段大小设置为2x2,它也会溢出。

public void setClicked(boolean clicked){
    this.clicked = clicked;
    if(adjacentMines == 0)
        for(mine m : adjacent){
            if(!m.isClicked() && !m.isMine()){
                setClicked(true); //Should be m.setClicked(true);
            }
        }
}

问题解决了,我错过了“m”。在我的方法调用中。感谢大家的帮助。

4 个答案:

答案 0 :(得分:4)

你需要在相邻的矿井上拨打setClicked,而不是在原矿上,否则,你会被setClicked(true)一次又一次地叫来源矿井

public void setClicked(boolean clicked){
    this.clicked = clicked;
    if(adjacentMines == 0)
        for(mine m : adjacent){
            if(!m.isClicked() && !m.isMine()){
                m.setClicked(true); // setClicked should be called on the adjacent mine, not on itself!
            }
        }
}

答案 1 :(得分:1)

你在同一个矿井而不是相邻矿井上调用setClicked。

更改为:

public void setClicked(boolean clicked){
    this.clicked = clicked;
    if(adjacentMines == 0)
        for(mine m : adjacent){
            if(!m.isClicked() && !m.isMine()){
                //missing the "m."
                m.setClicked(true);
            }
        }
}

答案 2 :(得分:0)

好吧,我只能猜测setClicked()方法是mine的成员,但是你不应该在你的情况下调用m.setClicked(true)而不仅仅是setClicked(true)吗?

答案 3 :(得分:0)

很难从你的代码片段中分辨出来,但我会说你不会迭代细胞。这意味着你一遍又一遍地递归检查同一个单元格(到无穷大和超出 woosh )。但是,周围的代码非常有用。