填充由元胞自动机生成的洞穴上的孔



我正在为游戏生成洞穴。洞穴是由元胞自动机构建的 50x50 矩阵,其中 0(紫色(是墙壁,1(黄色(是空白空间(玩家可以移动的地方(。这是我的输出示例

我用红色圆圈指出了我的问题。墙壁上有玩家无法到达的"洞"。我试图填补这个漏洞,但我不能。基本上我想把 0 包围的 1 变成 0。

我尝试使用这种方法使用洪水填充来做到这一点:

首先,我计算从起点 x,y 开始用洪水填充绘制的单元格数量。如果这个计数小于 16 且大于 1,那么我实际上绘制了单元格。

for x in range(0, WIDTH - 1):
for y in range(0, HEIGHT - 1):
number_cells_paint = floodfill_count(cellmap, x, y, number_cells_paint)
if 16 > len(number_cells_paint) > 1:
floodfill(cellmap, x, y)
number_cells_paint = []

number_cells_paint是一个数组,我在其中附加了我在floodfill_count访问的每个单元格。这就是我认为在递归算法中计数的方式,也可能是我的错误所在。

这是floodfill_count:

def floodfill_count(cellmap, x, y, number_cells_paint):
cellmap_aux = cellmap
if len(number_cells_paint) > 16:
return number_cells_paint
if cellmap_aux[x, y] == 1:
cellmap_aux[x, y] = 0
number_cells_paint.append(cellmap[x, y])
if x > 0 and cellmap[x - 1, y] == 1:
floodfill_count(cellmap_aux, x - 1, y, number_cells_paint)
if x < WIDTH - 1 and cellmap[x + 1, y] == 1:
floodfill_count(cellmap_aux, x + 1, y, number_cells_paint)
if y > 0 and cellmap[x, y - 1] == 1:
floodfill_count(cellmap_aux, x, y - 1, number_cells_paint)
if y < HEIGHT - 1 and cellmap[x, y + 1] == 1:
floodfill_count(cellmap_aux, x, y + 1, number_cells_paint)
if x < WIDTH - 1 and y < HEIGHT - 1 and cellmap[x + 1, y + 1] == 1:
floodfill_count(cellmap_aux, x + 1, y + 1, number_cells_paint)
if x > 0 and y < HEIGHT - 1 and cellmap[x - 1, y + 1] == 1:
floodfill_count(cellmap_aux, x - 1, y + 1, number_cells_paint)
if x < WIDTH - 1 and y < HEIGHT - 1 and cellmap[x + 1, y - 1] == 1:
floodfill_count(cellmap_aux, x + 1, y - 1, number_cells_paint)
if x > 0 and y < HEIGHT - 1 and cellmap[x - 1, y - 1] == 1:
floodfill_count(cellmap_aux, x - 1, y - 1, number_cells_paint)

return number_cells_paint

和洪水填充:

def floodfill(cellmap, x, y):
if cellmap[x, y] == 1:
cellmap[x, y] = 0
if x > 0 and cellmap[x - 1, y] == 1:
floodfill(cellmap, x - 1, y)
if x < WIDTH - 1 and cellmap[x + 1, y] == 1:
floodfill(cellmap, x + 1, y)
if y > 0 and cellmap[x, y - 1] == 1:
floodfill(cellmap, x, y - 1)
if y < HEIGHT - 1 and cellmap[x, y + 1] == 1:
floodfill(cellmap, x, y + 1)
if x < WIDTH - 1 and y < HEIGHT - 1 and cellmap[x + 1, y + 1] == 1:
floodfill(cellmap, x + 1, y + 1)
if x > 0 and y < HEIGHT - 1 and cellmap[x - 1, y + 1] == 1:
floodfill(cellmap, x - 1, y + 1)
if x < WIDTH - 1 and y < HEIGHT - 1 and cellmap[x + 1, y - 1] == 1:
floodfill(cellmap, x + 1, y - 1)
if x > 0 and y < HEIGHT - 1 and cellmap[x - 1, y - 1] == 1:
floodfill(cellmap, x - 1, y - 1)

return cellmap

这种洪水填充工程的实施,我以前尝试过,所以我的问题floodfill_count。

有了这段代码,我就有了这个最终输出

问题出在这行代码cellmap_aux = cellmap。Python 分配了列表作为参考,因此对cellmap_aux的任何更改都将是cellmap中的更改(因此floodfill_count绘制所有字段(。 应改用cellmap_aux = cellmap.copy()

相关内容

  • 没有找到相关文章

最新更新