class Generator: def __init__(self, n): self.n = n self.maze = Maze(n) self.random = Random() def generate(self): stack = deque([Vertex(0, 0)]) visited = set() def dive(vtx): visited.add(vtx) next_candidates = [n for n in self._get_neighbours(vtx) if n not in visited] if not next_candidates: return nxt = self.random.choice(next_candidates) self.maze.add_edge(Edge(vtx, nxt)) stack.append(nxt) dive(nxt) while stack: dive(stack.pop()) return self.maze def _get_neighbours(self, vtx: Vertex): adj = [] for delta in [[0, 1], [0, -1], [1, 0], [-1, 0]]: adj.append(Vertex(vtx.x + delta[0], vtx.y + delta[1])) if not self.maze.contains(adj[-1]): del adj[-1] return adj
class MazeGenerator: def __init__(self, n, thresh=0.4): self.n = n self.thresh = thresh self.maze = Maze(n) self.random = Random() def generate(self): prev = Eller.PrevRowSummary() for i in range(self.n): prev = Eller.RowGenerator(self, i, prev).generate() self.finalize(prev) return self.maze def finalize(self, last_row_summary): """satisfying last row post-conditions: no isolated regions should be left""" row = last_row_summary for j in range(1, len(row.vertices)): le, ri = row.vertices[j - 1], row.vertices[j] if not row.uf.connected(le, ri): row.uf.connect(le, ri) self.maze.add_edge(Edge(le, ri)) def will_connect(self): return self.random.random() > self.thresh