【发布时间】:2016-03-25 13:54:00
【问题描述】:
我正在写一个扫雷游戏。下面是扫雷中 3 种方法的代码。第一种方法是检查按下按钮周围的所有空间并计算周围有多少炸弹。下一个方法将被递归调用,以便如果用户按下一个周围有 0 个按钮的按钮,它将打开所有也表示它周围有 0 个方块的方块。第三种方法是检查它是否会在检查中绑定。空格递归调用给我一个stackoverflow错误,我做错了什么?
谢谢!
private int GameLogicChecker(int x, int y)
{
int count = 0;
if (_grid[x, y] != -1)
{
if (x + 1 < SizeX)
{ //Right
if (_grid[x + 1, y] == -1)
count++;
}
if (x - 1 > 0)
{ //Left
if (_grid[x - 1, y] == -1)
count++;
}
if (y + 1 < SizeY)
{ //Upper
if (_grid[x, y + 1] == -1)
count++;
}
if (y - 1 > 0)
{ //Lower
if (_grid[x, y - 1] == -1)
count++;
}
if (x + 1 < SizeX && y + 1 < SizeY)
{ //Right-Upper
if (_grid[x + 1, y + 1] == -1)
count++;
}
if (x + 1 < SizeX && y - 1 > 0)
{ //Right-Lower
if (_grid[x + 1, y - 1] == -1)
count++;
}
if (x - 1 > 0 && y + 1 < SizeY)
{ //Left-Upper
if (_grid[x - 1, y + 1] == -1)
count++;
}
if (x - 1 > 0 && y - 1 > 0)
{ //Left-Lower
if (_grid[x - 1, y - 1] == -1)
count++;
}
}
return count;
}
void OpenEmptySpace(int x, int y)
{
for (var k = -1; k <= 1; k++)
{
for (var l = -1; l <= 1; l++)
{
if (CheckBounds(x + k, y + l) && GameLogicChecker(x + k, y + l) == 0)
{
_buttons[x + k, y + l].Text = "0";
OpenEmptySpace(x + k, y + l);
}
}
}
}
private bool CheckBounds(int x, int y)
{
return x >= 0 && x < SizeX && y >= 0 && y < SizeY;
}
【问题讨论】:
-
您是否尝试过单步执行代码以观察其行为和瞬态值?
-
当 k 为 0 且 l 为 0 且 if 检查为真时,您将使用初始 x 和 y 值再次调用 OpenEmtpySpace,并创建一个无限循环。
-
确实,
OpenEmptySpace被编码为永远不会结束递归......不太清楚你为什么会期待其他情况。 -
当
l和k都为零时,除了跳过明显的递归步骤之外,您还应该跟踪已经发现的位置,以防止振荡递归。
标签: c# recursion stack-overflow minesweeper