Ejemplo n.º 1
0
    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
Ejemplo n.º 2
0
    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