洪水填充算法发现所有区域(扫雷)
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;
}
我正在 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;
}