【问题标题】:Stackoverflow exception in java minesweeper gamejava扫雷游戏中的Stackoverflow异常
【发布时间】:2011-07-12 14:23:02
【问题描述】:

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

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”。在我的方法调用中。感谢大家的帮助。

【问题讨论】:

  • 与您的问题无关:我认为您可以省略!m.isMine() 检查 - 如果adjacentMines == 0,这不应该发生。

标签: java recursion stack-overflow minesweeper


【解决方案1】:

您需要在相邻的矿井上调用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!
            }
        }
}

【讨论】:

    【解决方案2】:

    你在同一个矿而不是相邻的矿上调用 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);
                }
            }
    }
    

    【讨论】:

      【解决方案3】:

      好吧,我只能猜测 setClicked() 方法是 mine 的成员,但你不应该在你的条件中调用 m.setClicked(true) 而不仅仅是 setClicked(true)

      【讨论】:

      • 啊哈哈哈,非常感谢。我不知道我怎么没抓住这个。
      【解决方案4】:

      很难从您的代码 sn-p 中分辨出来,但我会说您不会遍历单元格。这意味着您正在一遍又一遍地递归检查同一个单元格(到无穷大和超越 woosh)。不过,周围的代码会非常有用。

      【讨论】:

        猜你喜欢
        • 2014-08-11
        • 1970-01-01
        • 2023-03-04
        • 1970-01-01
        • 1970-01-01
        • 2012-11-15
        • 1970-01-01
        • 2021-02-28
        • 1970-01-01
        相关资源
        最近更新 更多