【发布时间】:2014-01-10 05:47:59
【问题描述】:
我几天前刚接触 Java,开始编写扫雷游戏。问题是,当我尝试级联周围的块并显示块时,无论是空白还是带有取决于相邻炸弹数量的数字,我的递归失败并给我一个堆栈溢出错误。我的代码如下:
public void revealCell(int row, int col)
{
if(mAnswerBoard.get (row, col).equals ("1")||mAnswerBoard.get (row, col).equals("2")||
mAnswerBoard.get (row, col).equals("3")||mAnswerBoard.get (row, col).equals("4")||
mAnswerBoard.get (row, col).equals("5"))
{
mMinesweeperBoard.set (row, col, mAnswerBoard.get (row, col));
return;
}
else if(mAnswerBoard.get (row, col).equals("0"))
{
mMinesweeperBoard.set (row, col, " ");
for(int i = row - 1; i <= row + 1; i++)
{
if (i == -1)
{
i = 0;
}
for(int j = col - 1; j <= col + 1; j++)
{
if (j == -1)
{
j = 0;
}
if (mAnswerBoard.get (i, j).equals ("0") == false)
{
mMinesweeperBoard.set (i, j, mAnswerBoard.get (i, j));
}
else if (mAnswerBoard.get (i, j).equals (("0")))
{
if (mMinesweeperBoard.get (j, i).equals ("."))
{
mMinesweeperBoard.set(i, j, " ");
revealCell(i, j);
}
}
}
}
}
}
我已经盯着这个看了好几个小时了,我真的无法理解为什么它不会停止循环。 我最初的游戏板持有“。”在未显示的位置中,如果为 0,则棋盘将保留一个空格。我尝试检查答案键是否当场为 0,如果是,实际棋盘是否仍为“。”在现场,我可以设置一个空格。出于某种原因,revealCell 被一遍又一遍地调用,我真的想不通。 我做错了什么吗?
旁注:如果 i 和 j 为 -1,我必须将它们设置为 0,因为我的代码允许用户输入 0,0 作为有效坐标。
感谢您的帮助,如果答案就在我面前,我很抱歉......
【问题讨论】:
-
您需要递归解决方案吗?我认为您的迭代方法在这里可能更容易。
-
我不一定需要递归解决方案,但我想我认为递归解决方案会更吸引眼球。但就我而言,代码已经失去了吸引力。迭代方法会更容易吗?
-
你在使用调试器吗?递归问题通常很容易通过一些战略断点解决。
-
您正在检查递归是否超出了板的左侧和顶部,而不是底部或右侧。这可能是以后的问题。
-
@DrewBuckley 我已经尝试调试了一段时间。我会继续前进,看看我是否能查明问题所在。可能需要休息一下......也许我一直在寻找过去。
标签: java recursion minesweeper