2

我正在为 Java 上的 Andoid 开发游戏“扫雷”,打开单元格时遇到问题。如何确保我单击单元格打开相邻的空单元格?(如何在 Miner for Windows 中完成)。简介:我有一个从蓝牙套接字流接收的数组。像这样的数组:

1 9 1 0
1 1 1 0
0 0 0 0
0 0 0 0

9-是地雷 0-是空白单元格 1-最近的地雷数

之后我计算游戏场

array = Model.getGameField();
int size = array.length;
for (int i = 0; i < size; i++)
for (int j = 0; j < size; j++)
{
    ((TableRow) table.getChildAt(i)).getChildAt(j).setTag(array[i][j] + "");
}

OnClick 功能:

if (iWantToSetFlag == 0)
                {
                    tmpBtn = ((Button) v);
                    if (!(tmpBtn.getTag().equals("9")))
                    {
                        OpenButtons(tmpBtn.getId() / 10,     tmpBtn.getId() % 10);
                        recreateTable();
                    }
                    else
                        startLose();
            }
            else
            {
                if (((Button) v).getText().equals("M"))
                    ((Button) v).setText("");
                else
                    ((Button) v).setText("M");
            }

我有一个功能

    private void OpenButtons(int x, int y)
    {
        array[x][y] = -1;
                    for (int k = -1; k < 2; k++)
        {
            for (int k1 = 1; k1 >= -1; k1--)
            {
                    if (x + k >= 0 && x + k < array.length && y - k1 >= 0 && y - k1 < array[x + k].length)
                        if (array[x + k][y - k1] == 0)
                            OpenButtons(x + k, y - k1);
            }
        }

    }

递归打开单元格,但我有 StackOverFlow 错误。请帮忙。

4

1 回答 1

2

您应该使用更改的参数调用递归:

if (array[x + k][y - k1] == 0)
    OpenButtons(x + k, y - k1);

当然,正如问题评论中提到的那样,您应该自己检查数组边界,而不是仅仅忽略异常:

if (x + k >= 0 && x + k < array.length &&
    y - k1 >= 0 && y - k1 < array[x + k].length) { ...

放在你的其他if- 子句之前只会检查实际存在的字段。摆脱你的恶意空虚try-catch


由于递归算法仍然会导致StackOverflowException大字段,迭代算法可能更适合这里。

private void OpenButtons(int x, int y) {
    Queue<Point> toOpen = new LinkedBlockingQueue<>();
    toOpen.add(new Point(x, y));
    array[x][y] = -1;
    while (!toOpen.isEmpty()) {
        Point p = toOpen.poll();
        x = p.x;
        y = p.y;
        for (int k = -1; k < 2; k++) {
            for (int k1 = 1; k1 >= -1; k1--) {
                if (x + k >= 0 && x + k < array.length && y - k1 >= 0
                        && y - k1 < array[x + k].length)
                    if (array[x + k][y - k1] == 0) {
                        array[x + k][y - k1] = -1;
                        toOpen.add(new Point(x + k, y - k1));
                    }
            }
        }
    }
}
于 2013-07-07T19:56:21.950 回答