I was looking for ways to create a maze in python.
I came across the code below at rosettacode.
I know the code use recursion to build the maze.
I understand the code lines and know what i'm reading and I want to use that code but i'm missing a key understanding of this code.
我一直在寻找在python中创建迷宫的方法。我在rosettacode看到了下面的代码。我知道代码使用递归来构建迷宫。我理解代码行,知道我正在阅读什么,我想使用该代码,但我错过了对此代码的一个关键理解。
How exactly dose the recursive function in this code knows when to stop?
这段代码中递归函数的准确剂量知道何时停止?
from random import shuffle, randrange
def make_maze(w = 16, h = 8):
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 个解决方案
#1
0
Applied debug printing to your code:
对您的代码应用调试打印:
from random import shuffle, randrange
def make_maze(w = 3, h =3):
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 debugPrint():
print("-"*16)
s = ""
for (a, b) in zip(hor, ver):
s += ''.join(a + ['\n'] + b + ['\n'])
print(s )
for r in vis:
print(r)
def walk(x, y):
debugPrint()
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())
to visualize whats happening:
想象一下发生的事情:
----------------
+--+--+--+
| | | |
+--+--+--+
| | | |
+--+--+--+
| | | |
+--+--+--+
[0, 0, 0, 1]
[0, 0, 0, 1]
[0, 0, 0, 1]
[1, 1, 1, 1]
----------------
+--+--+--+
| | | |
+--+--+--+
| | | |
+ +--+--+
| | | |
+--+--+--+
[0, 0, 0, 1]
[1, 0, 0, 1]
[0, 0, 0, 1]
[1, 1, 1, 1]
----------------
+--+--+--+
| | | |
+--+--+--+
| | | |
+ +--+--+
| | |
+--+--+--+
[0, 0, 0, 1]
[1, 0, 0, 1]
[1, 0, 0, 1]
[1, 1, 1, 1]
----------------
+--+--+--+
| | | |
+--+--+--+
| | | |
+ +--+--+
| |
+--+--+--+
[0, 0, 0, 1]
[1, 0, 0, 1]
[1, 1, 0, 1]
[1, 1, 1, 1]
----------------
+--+--+--+
| | | |
+--+--+--+
| | | |
+ +--+ +
| |
+--+--+--+
[0, 0, 0, 1]
[1, 0, 0, 1]
[1, 1, 1, 1]
[1, 1, 1, 1]
----------------
+--+--+--+
| | | |
+--+--+ +
| | | |
+ +--+ +
| |
+--+--+--+
[0, 0, 0, 1]
[1, 0, 1, 1]
[1, 1, 1, 1]
[1, 1, 1, 1]
----------------
+--+--+--+
| | |
+--+--+ +
| | | |
+ +--+ +
| |
+--+--+--+
[0, 0, 1, 1]
[1, 0, 1, 1]
[1, 1, 1, 1]
[1, 1, 1, 1]
----------------
+--+--+--+
| |
+--+--+ +
| | | |
+ +--+ +
| |
+--+--+--+
[0, 1, 1, 1]
[1, 0, 1, 1]
[1, 1, 1, 1]
[1, 1, 1, 1]
----------------
+--+--+--+
| |
+--+ + +
| | | |
+ +--+ +
| |
+--+--+--+
[1, 1, 1, 1]
[1, 0, 1, 1]
[1, 1, 1, 1]
[1, 1, 1, 1]
Final output:
+--+--+--+
| |
+--+ + +
| | | |
+ +--+ +
| |
+--+--+--+
#1
0
Applied debug printing to your code:
对您的代码应用调试打印:
from random import shuffle, randrange
def make_maze(w = 3, h =3):
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 debugPrint():
print("-"*16)
s = ""
for (a, b) in zip(hor, ver):
s += ''.join(a + ['\n'] + b + ['\n'])
print(s )
for r in vis:
print(r)
def walk(x, y):
debugPrint()
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())
to visualize whats happening:
想象一下发生的事情:
----------------
+--+--+--+
| | | |
+--+--+--+
| | | |
+--+--+--+
| | | |
+--+--+--+
[0, 0, 0, 1]
[0, 0, 0, 1]
[0, 0, 0, 1]
[1, 1, 1, 1]
----------------
+--+--+--+
| | | |
+--+--+--+
| | | |
+ +--+--+
| | | |
+--+--+--+
[0, 0, 0, 1]
[1, 0, 0, 1]
[0, 0, 0, 1]
[1, 1, 1, 1]
----------------
+--+--+--+
| | | |
+--+--+--+
| | | |
+ +--+--+
| | |
+--+--+--+
[0, 0, 0, 1]
[1, 0, 0, 1]
[1, 0, 0, 1]
[1, 1, 1, 1]
----------------
+--+--+--+
| | | |
+--+--+--+
| | | |
+ +--+--+
| |
+--+--+--+
[0, 0, 0, 1]
[1, 0, 0, 1]
[1, 1, 0, 1]
[1, 1, 1, 1]
----------------
+--+--+--+
| | | |
+--+--+--+
| | | |
+ +--+ +
| |
+--+--+--+
[0, 0, 0, 1]
[1, 0, 0, 1]
[1, 1, 1, 1]
[1, 1, 1, 1]
----------------
+--+--+--+
| | | |
+--+--+ +
| | | |
+ +--+ +
| |
+--+--+--+
[0, 0, 0, 1]
[1, 0, 1, 1]
[1, 1, 1, 1]
[1, 1, 1, 1]
----------------
+--+--+--+
| | |
+--+--+ +
| | | |
+ +--+ +
| |
+--+--+--+
[0, 0, 1, 1]
[1, 0, 1, 1]
[1, 1, 1, 1]
[1, 1, 1, 1]
----------------
+--+--+--+
| |
+--+--+ +
| | | |
+ +--+ +
| |
+--+--+--+
[0, 1, 1, 1]
[1, 0, 1, 1]
[1, 1, 1, 1]
[1, 1, 1, 1]
----------------
+--+--+--+
| |
+--+ + +
| | | |
+ +--+ +
| |
+--+--+--+
[1, 1, 1, 1]
[1, 0, 1, 1]
[1, 1, 1, 1]
[1, 1, 1, 1]
Final output:
+--+--+--+
| |
+--+ + +
| | | |
+ +--+ +
| |
+--+--+--+