有人可以帮忙解释一下此python代码吗

时间:2019-10-18 11:58:39

标签: python

这是要创建一个随机的迷宫,但由于有人会解释正在发生的事情而使用的列表理解方法,所以我真的不太了解正在发生的事情。谢谢。

from random import shuffle, randrange

def make_maze(w = 20, h = 20):
    vis = [[0] * w + [1] for _ in range(h)] + [[1] * (w + 1)]
    ver = [["|  "] * w + ['|'] for _ in range(h)] + [[]]
    hor = [["+--"] * w + ['+'] for _ in range(h + 1)]

    def walk(x, y):
        vis[y][x] = 1

        d = [(x - 1, y), (x, y + 1), (x + 1, y), (x, y - 1)]
        shuffle(d)
        for (xx, yy) in d:
            if vis[yy][xx]: continue
            if xx == x: hor[max(y, yy)][x] = "+  "
            if yy == y: ver[y][max(x, xx)] = "   "
            walk(xx, yy)

    walk(randrange(w), randrange(h))

    s = ""
    for (a, b) in zip(hor, ver):
        s += ''.join(a + ['\n'] + b + ['\n'])
    return s

if __name__ == '__main__':
    print(make_maze())

1 个答案:

答案 0 :(得分:0)

让我们分解第一行:

vis = [[0] * w + [1] for _ in range(h)] + [[1] * (w + 1)]

[0] * w + [1]列出由全零组成的长度w的列表,然后在末尾附加单个1。这是一行。

for _ in range(h)表示它重复该过程h次以创建h行。

+ [[1] * (w + 1)]表示它将附加由全1组成的另一行(w + 1)

vis基本上是一个与迷宫相同大小的网格,用于跟踪访问的空间,因此随机游走(如下所述)不会两次碰到同一点


另外两个列表推导verhor的工作方式相似,基本上构成了一个巨大的网格,具有如下所示的行(尚未迷宫)

+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |

然后walk(x, y)用空格替换随机墙。

即它会从网格中随机删除 --| 个字符以打开迷宫

此外,walk()递归地调用自己以在被移除的壁附近创建更多的壁来移除更多的壁


然后,它仅使用.join()函数将垂直和水平字符行组合为单个字符串。