【发布时间】:2015-04-19 11:28:55
【问题描述】:
我目前正在制作一款可玩的扫雷游戏,基础知识已经准备就绪,但我想让它变得完美。我的问题是,现在如果您单击任何字段,即使它是空的,它也会显示其内容,并且单击所有字段感觉有点烦人,我想让它像真正的扫雷一样工作。因此,如果您单击一个空白字段,我想尽可能地显示周围的环境。 目前它看起来像这样:
if (grid[x, y] == 0)
{
if (x + 1 < lenght)
{ //Right
btn_grid[x + 1, y].Visible = false;
}
if (x - 1 > 0)
{ //Left
btn_grid[x - 1, y].Visible = false;
}
if (y + 1 < height )
{ //Upper
btn_grid[x, y + 1].Visible = false;
}
if (y - 1 > 0)
{ //Lower
btn_grid[x, y - 1].Visible = false;
}
if (x + 1 < sz && y + 1 < m)
{ //Right-Upper
btn_grid[x + 1, y + 1].Visible = false;
}
if (x + 1 < lenght && y - 1 > 0)
{ //Right-Lower
btn_grid[x + 1, y - 1].Visible = false;
}
if (x - 1 > 0 && y + 1 < height)
{ //Left-Upper
btn_grid[x - 1, y + 1].Visible = false;
}
if (x - 1 > 0 && y - 1 > 0)
{ //Left-Lower
btn_grid[x - 1, y - 1].Visible = false;
}
}
这基本上揭示了其他 8 个字段。我做了很多'if'函数来避免跑出字段的错误(但是感觉真的很笨拙所以我想知道是否有更好的方法来做到这一点)。 现在我想制作某种递归方法,以便它继续在该领域中寻找 0 值(空格)并继续在其附近进行。
我尝试了类似的方法:
void emptyspace(int x, int y)
{
if (grid[x, y] == 0 && x + 1 < lenght && x - 1 > 0 && y + 1 < height && y - 1 > 0)
{
btn_grid[x, y].Visible = false;
emptyspace(x - 1, y - 1);
emptyspace(x, y - 1);
emptyspace(x + 1, y - 1);
emptyspace(x + 1, y);
emptyspace(x + 1, y + 1);
emptyspace(x, y + 1);
emptyspace(x - 1, y + 1);
emptyspace(x - 1, y);
}
}
然后我在 buttonclick 动作上邀请了这个方法,如下所示:
emptyspace(x,y);
但它什么也没做,所以我想知道我是否应该用不同的方式来称呼它,或者它只是一个愚蠢的想法。
所以我想了一会儿,问我的亲人是否可以提供帮助,但我们现在的情况差不多就是这样。 所以任何想法都会有所帮助。 非常感谢和抱歉我的英语不好。
编辑:我终于想通了,解决方案看起来像这样:
public void emptyspace(int x, int y)
{
btn_grid[x, y].Visible = false;
count++;
if (grid[x, y] == 0)
{
if (x + 1 < sz)
if (btn_grid[x + 1, y].Visible != false)
emptyspace(x + 1, y);
if (y + 1 < m)
if (btn_grid[x, y + 1].Visible != false)
emptyspace(x, y + 1);
if (x - 1 > -1)
if (btn_grid[x - 1, y].Visible != false)
emptyspace(x - 1, y);
if (y - 1 > -1)
if (btn_grid[x, y - 1].Visible != false)
emptyspace(x, y - 1);
if (x + 1 < sz && y + 1 < m)
if (btn_grid[x + 1, y + 1].Visible != false)
emptyspace(x + 1, y + 1);
if (x - 1 > -1 && y + 1 < m)
if (btn_grid[x - 1, y + 1].Visible != false)
emptyspace(x - 1, y + 1);
if (x + 1 < sz && y - 1 > -1)
if (btn_grid[x + 1, y - 1].Visible != false)
nullas(x + 1, y - 1);
if (x - 1 > -1 && y - 1 > -1)
if (btn_grid[x - 1, y - 1].Visible != false)
emptyspace(x - 1, y - 1);
}
这正如我所愿!
【问题讨论】:
-
你的递归方法对我来说似乎很好,如果你只为 4 个直接邻居(而不是对角线的邻居)调用递归方法,它甚至应该足够了。您是否尝试过使用调试器单步执行代码并检查 if 条件是否为真?
-
您的代码总体上看起来不错。不过有几点:1)在 if 语句中,确保当前字段不可见 - 2)“x - 1 > 0 && y - 1 > 0”应该是“x - 1 >= 0 && y - 1 >= 0" 因为数组中的第一项位于位置 0 - 3),正如 Hinek 所说,调试。一种简单的方法是在 if 语句中打印一些内容。另外,不应该是“btn_grid[x, y].Visible = true;” (而不是假的)?
-
当你可以做
if (y > 0)时,你为什么要做if (y - 1 > -1)?
标签: c# if-statement tail-recursion minesweeper