【问题标题】:c# how to reveal the empty fields in minesweeperc#如何显示扫雷中的空字段
【发布时间】: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 &gt; 0)时,你为什么要做if (y - 1 &gt; -1)

标签: c# if-statement tail-recursion minesweeper


【解决方案1】:

你可以做这样的事情(伪代码):

queue = new Queue()
reveal clicked cell
enqueue(clicked cell)
while (queue is not empty)
{
    cell = dequeue()
    for each neighbor X of cell
    {
        if (X is revealed)
        {
            continue;
        }
        reveal X
        if X has no adjacent mine
        {
           enqueue X
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-25
    相关资源
    最近更新 更多