扫雷洪水填充算法Python

时间:2017-12-02 05:46:39

标签: python flood-fill minesweeper

def floodfill(col,rowb,neigh,bombpos):
#neigh is number of bombs (neighbors) around the position (row,col)
try:
    neigh[rowb][col]
    bombpos[rowb][col]
    visit[rowb][col]
except IndexError:
    return
#if the position is an isolated position, i.e. there are no bombs adjacent to it;
if neigh[rowb][col] == 0:
    pygame.draw.rect(screen, (55, 55, 55), (1 + col * 30, 1 + rowb * 30, 28, 28))
    floodfill(col - 1, rowb, neigh, bombpos)
    floodfill(col, rowb - 1, neigh, bombpos)
    floodfill(col + 1, rowb, neigh, bombpos)
    floodfill(col, rowb + 1, neigh, bombpos)
    floodfill(col - 1, rowb-1, neigh, bombpos)
    floodfill(col+1, rowb + 1, neigh, bombpos)
    floodfill(col + 1, rowb-1, neigh, bombpos)
    floodfill(col-1, rowb + 1, neigh, bombpos)

我试图重新创建扫雷洪水填充算法,所以我有一个洪水填充功能,我在其中递归选择邻居值为0的那些周围的所有框,这意味着他们没有触及任何炸弹。我理解为什么这是一个无限递归,并且我必须以某种方式使用一个访问矩阵来检测哪个位置已经过测试,所以我最终可以结束递归。我试过实施一次"访问"如果在递归中使用该位置,则对于位置(行,col)将切换为true的矩阵,但我根本无法使其工作。我如何在此代码中实现访问矩阵以获得在扫雷中使用的正确的填充算法?

1 个答案:

答案 0 :(得分:1)

这是我发现的代码,以防任何人遇到与我相同的问题,我不知道为什么但是使用“try:”会停止某些情况下的递归,所以如果不是声明则转换为旧的时尚更好地设定边界。然后,只需将“打开”单元格时将访问矩阵设置为false即可。    如果不是(-1< rowb< size和-1< col< size):     返回 如果neigh [rowb] [col] == 0而不访问[rowb] [col]:     pygame.draw.rect(screen,(55,55,55),(1 + col * 30,1 + rowb * 30,28,28))     访问[rowb] [col] = True     floodfill(col - 1,rowb,neigh,bombpos)     floodfill(col,rowb - 1,neigh,bombpos)     floodfill(col + 1,rowb,neigh,bombpos)     floodfill(col,rowb + 1,neigh,bombpos)     floodfill(col - 1,rowb - 1,neigh,bombpos)     floodfill(col - 1,rowb + 1,neigh,bombpos)     floodfill(col + 1,rowb - 1,neigh,bombpos)     floodfill(col + 1,rowb + 1,neigh,bombpos)