示例#1
0
    def _fill_maze(self):
        for x in range(0, self.XSize):
            for y in range(0, self.YSize):
                ordinal_values = self.Map.get_ordinal_values(x,y,0)
                if ordinal_values.get(self.Ground, 0) > 0 and self.Map.get_value(x, y, 0) == -1:
                    self.Map.set_value(x, y, 1, 1)
        maze_regions = []
        for x in range(0, self.XSize):
            for y in range(0, self.YSize):
                if self.Map.get_value(x, y, 0) == -1 and self.Map.get_value(x, y, 1) == -1:
                    is_in_region = False
                    for region in maze_regions:
                        if region.contains((x, y)):
                            is_in_region = True
                    if not is_in_region:
                        r = self.Map.build_cardinal_region_on_point(x, y, 1, [-1])
                        maze_regions.append(r)
        self.Map.clear_layer(1)

        for region in maze_regions:
            region_points = copy.deepcopy(region.Points)
            while len(region_points) > 0:
                eligible_points = []
                start_point = Common.pop_random(region_points)

                if self.Map.get_cardinal_values(start_point[0], start_point[1], 1).get(self.Ground, 0) <= 1 and 0 < \
                        start_point[0] > self.XSize - 1 and 0 < start_point[1] > self.YSize - 1:
                    self.Map.set_value(start_point[0], start_point[1], 1, self.Ground)
                    eligible_points += region.get_cardinal_points(start_point)
                    while len(eligible_points) > 0:
                        candidate = Common.pop_random(eligible_points)
                        if self.Map.get_cardinal_values(candidate[0], candidate[1], 1).get(self.Ground, 0) == 1:
                            if 0 < candidate[0] > self.XSize-1 and 0 < candidate[1] > self.YSize-1:
                                self.Map.set_value(candidate[0], candidate[1], 1, self.Ground)
                                cards_in_region = region.get_cardinal_points(candidate)
                                for cardPoint in cards_in_region:
                                    if self.Map.get_value(cardPoint[0], cardPoint[1], 1) == -1 and \
                                       self.Map.get_cardinal_values(cardPoint[0], cardPoint[1], 1).get(self.Ground, 0) == 1:
                                        eligible_points.append(cardPoint)

                        if candidate in region_points: region_points.remove(candidate)