c#如何揭示扫雷中的空场

时间:2015-02-18 12:45:18

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

我目前正致力于创造一个可玩的扫雷艇,基础已经准备就绪,但我想让它变得完美。我的问题是,现在如果你点击任何一个字段,它就会显示它的内容,即使它是一个空的,点击所有字段感觉有点烦,我想让它像真正的扫雷一样工作。因此,如果你点击一个空的字段,我想尽可能地揭示ist周围。 目前它看起来像这样:

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个领域。我做了很多&#39;如果&#39;功能,以避免跑出场的错误(但它感觉非常笨拙,所以我想知道是否有更好的方法来做到这一点)。 现在我想制作某种递归方法,以便它继续在该字段中寻找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);
        }

这就像我预期的那样有效!

1 个答案:

答案 0 :(得分:0)

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

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
        }
    }
}