洪水填充算法发现所有区域(扫雷)

Flood fill algorithm uncovers all area (Minesweeper)

我正在 C++ 上为扫雷游戏实现洪水填充算法,一切都很好,但我不喜欢它的工作结果。它会发现除炸弹以外的所有区域,而在正确的版本中,它需要用数字发现一些区域,代表附近的炸弹数量。

void floodfill(int x, int y)
{
    if (x < 0 || y < 0 || x >= cellsX || y >= cellsY) // Check game field borders
        return;
    if (closedMap[x][y] == EMPTY && !visited[x][y]) // If this cell is empty and not visited...
    {
        openedMap[x][y] = closedMap[x][y];
        visited[x][y] = true;
        floodfill(x + 1, y);
        floodfill(x, y + 1);
        floodfill(x - 1, y);
        floodfill(x, y - 1);
    }
    else if (closedMap[x][y] > EMPTY && closedMap[x][y] < CLOSED && !visited[x][y]) // If this cell is contains number and not visited...
    {
        openedMap[x][y] = closedMap[x][y];
        visited[x][y] = true;
        floodfill(x + 1, y);
        floodfill(x, y + 1);
        floodfill(x - 1, y);
        floodfill(x, y - 1);
    }
    return;
}

一些简单理解的矩阵:

How it is (* means covered): 
   [1][2][3][4][5]
[1]    1  *  2  *
[2]    1  2  4  2
[3]    2  *  3  *
[4]    2  *  4  2
[5]    1  1  2  *
How it must be:
   [1][2][3][4][5]
[1]    1  *  *  *
[2]    1  *  *  *
[3]    2  *  *  *
[4]    2  *  *  *
[5]    1  *  *  *

我看你把填有数字的 spaced 当作空白 space 对待。如果您为图块分配一个数字,则不需要 floodfill() 过去。

问题在于,我只是将数字图块填充为间隔图块,这只是发现了除地雷以外的所有区域,而不仅仅是一些区域。现在,如果函数找到一个数字,它就会停止并绘制数字。

    else if (closedMap[x][y] > EMPTY && closedMap[x][y] < CLOSED) // If this cell is contains number...
    {
        openedMap[x][y] = closedMap[x][y];
        return;
    }