def prepare(self): self.load_data() self.menu.set_base(self) self.room.set_base(self) self.maze = Maze(8, 8)
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
def render(maze: Maze, solution: Solution = None, filename=None): lw = ImageMazeRenderer.line_width dlw = 2 * lw def convert(maze_coord): return dlw * maze_coord + dlw img_size = convert(maze.n) + lw image = Image.new('RGB', (img_size, img_size), color='black') drawer = ImageDraw.Draw(image) def as_box(e: Edge): xr = {convert(vtx.x) for vtx in e.v} yr = {convert(vtx.y) for vtx in e.v} return min(xr), min(yr), max(xr) + 1, max(yr) + 1 def draw(*edges, color='white'): for e in edges: drawer.rectangle(as_box(e), fill=color) entrance = Edge(Vertex(-1, 0), Vertex(0, 0)) the_exit = Edge(Vertex(maze.n - 1, maze.n - 1), Vertex(maze.n, maze.n - 1)) draw(*maze.get_all_edges()) draw(entrance, the_exit) if solution: solution_color = 'limegreen' draw(*solution.edges, color=solution_color) draw(entrance, the_exit, color=solution_color) image.save(build_output_path('jpg', file_name=filename), 'JPEG')
def prepare (self): self.load_data() self.menu.set_base(self) self.room.set_base(self) self.maze = Maze(8, 8)
def convert_from_dict_to_maze(data) -> Maze: """ Convert dict data to maze object\n Returns: Maze object """ maze = Maze( data["maze"], data["width"], data["height"], data["start_coords"], data["end_coords"], ) if "stats" in data: # if maze has stats, add Stats() object maze.Stats = Stats() for stat in data["stats"]: maze.Stats.solutions.append(stat) return maze
def __init__(self, maze: Maze, hand: Hand): position = path.Node(maze.start) direction = Direction.EAST turn_prio = [hand, lambda d: d, Hand.opposite(hand), turn_back] while position.val != maze.end: candidates = [turn(direction) for turn in turn_prio] neighbours = maze.get_accessible_neighbours(position.val) direction = next(c for c in candidates if c(position.val) in neighbours) position = position.create_child(direction(position.val)) self.solution = Solution.from_vertices(list(position.as_path()))
def render(maze: Maze, filename=None): n = 3 * maze.n board = [[]] * n for i in range(0, n): board[i] = [True] * n def convert(maze_coord): return 1 + 3 * maze_coord for edge in maze.get_all_edges(): xr = {convert(vtx.x) for vtx in edge.v} yr = {convert(vtx.y) for vtx in edge.v} for x in range(min(xr), max(xr) + 1): for y in range(min(yr), max(yr) + 1): board[x][y] = False board[0][1] = False board[n - 1][n - 2] = False with open(build_output_path('txt', file_name=filename), 'w') as f: f.write( nl.join([ ''.join(u"\u2588" if cell else ' ' for cell in row) for row in board ]))
class TheRoomsGame(Widget): # Set base values for # 1 - scales xScale = NumericProperty(1.0) yScale = NumericProperty(1.0) # 2 - font size fontSize = NumericProperty(64.0) # 3 - current state (0: menu; 1: game; 2: gameover) state = NumericProperty(0) # 4 - user data store directory dataDir = StringProperty('') # 4.1 - user data file name userData = StringProperty('') # 5 - game data score = NumericProperty(0) name = StringProperty('') time = NumericProperty(0) # Child widgets menu = ObjectProperty(None) room = ObjectProperty(None) def __init__(self, **kwargs): super(TheRoomsGame, self).__init__(**kwargs) # Define transitions # 1 - Out once self.transOut = Animation(opacity=0) self.transOut.bind(on_complete=self.remove_child) # 2 - In once self.transIn = Animation(opacity=1) # 3 - Inter rooms self.transRoom = Animation(opacity=0, d=1.5) + Animation(opacity=1) self.transRoom.bind(on_progress=self.prepare_room) # Data filename self.userData = 'stat.dat' # First screen to see is menu self.state = 0 def prepare(self): self.load_data() self.menu.set_base(self) self.room.set_base(self) self.maze = Maze(8, 8) def set_data_dir(self, dir): self.dataDir = dir + '//' def load_data(self): with open(self.dataDir + self.userData, 'r') as file: data = json.loads(file.readline()) self.score = data[0] self.name = data[1] self.time = data[2] def save_data(self): with open(self.dataDir + self.userData, 'w') as file: json.dump([self.score, self.name, self.time], file) def remove_child(self, anim, widget): widget.parent.remove_widget(widget) def prepare_room(self, anim, widget, progress): if progress > 0.5 and progress < 0.51: self.room.set_room(self.maze.load_curr_room_property()) def take_scale(self): retval = False xScale = self.width * 1.0 / self.room.WIDTH yScale = self.height * 1.0 / self.room.HEIGHT if self.xScale != xScale: self.xScale = xScale retval = True if self.yScale != yScale: self.yScale = yScale retval = True return retval def play(self): self.transOut.start(self.menu) self.state = 1 self.room.received = False self.maze.generate_rooms(8, 8) self.transRoom.start(self.room) def home(self): self.add_widget(self.menu) self.state = 0 self.maze.reset_maze() self.transIn.start(self.menu) ## # @brief intermethod between input on widget with its logic structure # # @param [in] code move direction (0: ahead; 1: right; 2: back; 3: left) # @return none # def go(self, code): self.maze.change_room(code) self.transRoom.start(self.room) def change_lamp_state(self, code, state): self.maze.change_lamp(code, state) def update(self, dt): self.take_scale() self.fontSize = 64.0 * self.yScale * 1.2 if self.state == 0: self.menu.update(self.width, self.height, self.fontSize) state = self.maze.game_state() if state != 0: self.state = 2 self.room.update(self.xScale, self.yScale, self.fontSize, state)
class TheRoomsGame(Widget): # Set base values for # 1 - scales xScale = NumericProperty(1.0) yScale = NumericProperty(1.0) # 2 - font size fontSize = NumericProperty(64.0) # 3 - current state (0: menu; 1: game; 2: gameover) state = NumericProperty(0) # 4 - user data store directory dataDir = StringProperty('') # 4.1 - user data file name userData = StringProperty('') # 5 - game data score = NumericProperty(0) name = StringProperty('') time = NumericProperty(0) # Child widgets menu = ObjectProperty(None) room = ObjectProperty(None) def __init__(self, **kwargs): super(TheRoomsGame, self).__init__(**kwargs) # Define transitions # 1 - Out once self.transOut = Animation(opacity = 0) self.transOut.bind(on_complete = self.remove_child) # 2 - In once self.transIn = Animation(opacity = 1) # 3 - Inter rooms self.transRoom = Animation(opacity = 0, d = 1.5) + Animation(opacity = 1) self.transRoom.bind(on_progress = self.prepare_room) # Data filename self.userData = 'stat.dat' # First screen to see is menu self.state = 0 def prepare (self): self.load_data() self.menu.set_base(self) self.room.set_base(self) self.maze = Maze(8, 8) def set_data_dir(self, dir): self.dataDir = dir + '//' def load_data(self): with open(self.dataDir + self.userData, 'r') as file: data = json.loads(file.readline()) self.score = data[0] self.name = data[1] self.time = data[2] def save_data(self): with open(self.dataDir + self.userData, 'w') as file: json.dump([self.score, self.name, self.time], file) def remove_child(self, anim, widget): widget.parent.remove_widget(widget) def prepare_room(self, anim, widget, progress): if progress > 0.5 and progress < 0.51: self.room.set_room(self.maze.load_curr_room_property()) def take_scale(self): retval = False xScale = self.width * 1.0 / self.room.WIDTH yScale = self.height * 1.0 / self.room.HEIGHT if self.xScale != xScale: self.xScale = xScale retval = True if self.yScale != yScale: self.yScale = yScale retval = True return retval def play(self): self.transOut.start(self.menu) self.state = 1 self.room.received = False self.maze.generate_rooms(8, 8) self.transRoom.start(self.room) def home(self): self.add_widget(self.menu) self.state = 0 self.maze.reset_maze() self.transIn.start(self.menu) ## # @brief intermethod between input on widget with its logic structure # # @param [in] code move direction (0: ahead; 1: right; 2: back; 3: left) # @return none # def go(self, code): self.maze.change_room(code) self.transRoom.start(self.room) def change_lamp_state(self, code, state): self.maze.change_lamp(code, state) def update(self, dt): self.take_scale() self.fontSize = 64.0 * self.yScale * 1.2 if self.state == 0: self.menu.update(self.width, self.height, self.fontSize) state = self.maze.game_state() if state != 0: self.state = 2 self.room.update(self.xScale, self.yScale, self.fontSize, state)
def __init__(self, n): self.n = n self.maze = Maze(n) self.random = Random()
def __init__(self, n, thresh=0.4): self.n = n self.thresh = thresh self.maze = Maze(n) self.random = Random()