"""迷宫生成代码"""
importrandomfrom wall importWalldef generate_maze(size_x, size_y, density=0.9):"""生成一个给定大小的迷宫,以"右墙"数组的形式返回迷宫
"底墙"。
例如,以下迷宫:
+---+---+---+
| | |
+---+ + +
| |
+ +---+---+
| |
+---+---+---+
# 00010
# 11010
# 00000
# 00000
将表示为:
right_walls: [
[f, t],
[f, f],
[f, f]
]
bottom_walls: [
[t, f, f],
[f, t, t]
]
(where t = True, f = False)."""
classNode:def __init__(self, group_id, position):
self.group_id=group_id
self.position=positionclassEdge:"""这个类用来做保存两个节点间的单个连接的数据结构"""
def __init__(self, orientation, position, enabled):
self.orientation=orientation
self.position=position
self.enabled=enabled
nodes= [Node(i + j *size_x, (i, j))for j inrange(size_y)for i inrange(size_x)]
edges=[
Edge("r", (i, j), True)for j inrange(size_y)for i in range(size_x - 1)
]+[
Edge("b", (i, j), True)for j in range(size_y - 1)for i inrange(size_x)
]
random.shuffle(edges)for edge inedges:if edge.orientation == "r":
parent_nodes= [nodes[edge.position[0] + size_x * edge.position[1]],
nodes[edge.position[0]+ 1 + size_x * edge.position[1]]]else:
parent_nodes= [nodes[edge.position[0] + size_x * edge.position[1]],
nodes[edge.position[0]+ size_x * (edge.position[1] + 1)]]if parent_nodes[0].group_id != parent_nodes[1].group_id:
edge.enabled=False
dead_group_id= parent_nodes[1].group_idfor node innodes:if node.group_id ==dead_group_id:
node.group_id=parent_nodes[0].group_id
enabled_edges= list(filter(lambdaedge: edge.enabled, edges))
random.shuffle(enabled_edges)for i in range(round((size_x - 1) * (size_y - 1) * (1 -density))):
enabled_edges[i].enabled=False
right_edges= [[True for i in range(size_x - 1)] for i inrange(size_y)]
bottom_edges= [[True for i in range(size_x)] for i in range(size_y - 1)]for edge inedges:if edge.orientation == "r":
right_edges[edge.position[1]][edge.position[0]] =edge.enabledif edge.orientation == "b":
bottom_edges[edge.position[1]][edge.position[0]] =edge.enabledreturn(right_edges, bottom_edges)defgenerate_walls_from_maze(width, height, maze):"""把右墙/底墙中给定的墙转换为宽度正确的矩形墙。"""walls=[]#Edges
walls.append(Wall.generate_horizontal_wall(0, 0, width))
walls.append(
Wall.generate_horizontal_wall(0, height, width)
)
walls.append(Wall.generate_vertical_wall(0, 0, height))
walls.append(Wall.generate_vertical_wall(width, 0, height))
(right_walls, bottom_walls)=maze#水平墙
for y in range(height - 1):
x=0
current_wall_start_x=0
current_wall_length=0while x
x+= 1current_wall_length+= 1
if current_wall_length >0:
walls.append(
Wall.generate_horizontal_wall(
current_wall_start_x,
y+ 1,
current_wall_length
)
)
x+= 1current_wall_start_x=x
current_wall_length=0#竖直墙
for x in range(width - 1):
y=0
current_wall_start_y=0
current_wall_length=0while y
y+= 1current_wall_length+= 1
if current_wall_length >0:
walls.append(
Wall.generate_vertical_wall(
x+ 1,
current_wall_start_y,
current_wall_length
)
)
y+= 1current_wall_start_y=y
current_wall_length=0returnwallsdefprint_maze(walls):"""终端打印迷宫"""right_walls, bottom_walls=walls
size_x=len(bottom_walls[0])
size_y=len(right_walls)print("+---" * size_x + "+")for y inrange(size_y):print("|", end="")for x in range(size_x - 1):ifright_walls[y][x]:print("|", end="")else:print(" ", end="")print("|")if y != size_y - 1:for x inrange(size_x):ifbottom_walls[y][x]:print("+---", end="")else:print("+", end="")print("+")print("+---" * size_x + "+")if __name__ == "__main__":#print_maze(generate_maze(10, 10, density=0.9))
print(len(generate_maze(10, 10, density=0.9)))