From 2e68f1a389c0da82681302ed68756e50d6285c2b Mon Sep 17 00:00:00 2001 From: semyanovra Date: Sun, 24 May 2026 14:54:57 +0000 Subject: [PATCH] =?UTF-8?q?[2]=20feat=20-=20Observer=20=D0=B8=20=D0=BA?= =?UTF-8?q?=D0=BE=D0=BD=D1=81=D0=BE=D0=BB=D1=8C=D0=BD=D0=B0=D1=8F=20=D0=B2?= =?UTF-8?q?=D0=B8=D0=B7=D1=83=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0=D1=86=D0=B8?= =?UTF-8?q?=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- semyanovra/scr/maze.py | 66 +++++++++++++++++++++++++++++++++++------- 1 file changed, 56 insertions(+), 10 deletions(-) diff --git a/semyanovra/scr/maze.py b/semyanovra/scr/maze.py index c5779a4..8d1f340 100644 --- a/semyanovra/scr/maze.py +++ b/semyanovra/scr/maze.py @@ -271,6 +271,8 @@ class Pathfinder: t1 = time.perf_counter() elapsed_ms = (t1 - t0) * 1000 + self.notify("path_found", path) + return PerformanceData(elapsed_ms, self._algorithm.visited_nodes(), len(path)) @@ -281,19 +283,63 @@ class PerformanceData: self.path_length = length +# ----------------------------- Наблюдатель и отображение ----------------------------- +class EventListener: + def update(self, event_type, data): + raise NotImplementedError + + +class ConsoleDisplay(EventListener): + def __init__(self): + self._last_path = None + + def update(self, event_type, data): + if event_type == "maze_loaded": + self._render_maze(data) + elif event_type == "path_found": + self._last_path = data + self._render_path(data) + + def _render_maze(self, maze): + os.system('cls' if os.name == 'nt' else 'clear') + print("=" * (maze.width * 2 + 4)) + print(" LABYRINTH") + print("=" * (maze.width * 2 + 4)) + + for y in range(maze.height): + print(" ", end='') + for x in range(maze.width): + cell = maze.cell_at(x, y) + if cell == maze.start: + print('S', end=' ') + elif cell == maze.exit: + print('E', end=' ') + elif cell.is_wall: + print('#', end=' ') + else: + print('.', end=' ') + print() + print("=" * (maze.width * 2 + 4)) + print(" S - start E - exit # - wall . - path") + + def _render_path(self, path): + if not path: + print("\n Path not found!") + return + print(f"\n Path found! Length: {len(path)}") + + if __name__ == "__main__": builder = TxtLabyrinthBuilder() maze = builder.build_from_file("maze/level1.txt") + view = ConsoleDisplay() + view.update("maze_loaded", maze) + pf = Pathfinder(maze) - pf.set_algorithm(BFS()) - stats = pf.solve() - print(f"BFS: {stats.time_ms:.3f}ms, visited={stats.visited_cells}, length={stats.path_length}") + pf.attach(view) - pf.set_algorithm(DFS()) - stats = pf.solve() - print(f"DFS: {stats.time_ms:.3f}ms, visited={stats.visited_cells}, length={stats.path_length}") - - pf.set_algorithm(AStar()) - stats = pf.solve() - print(f"A*: {stats.time_ms:.3f}ms, visited={stats.visited_cells}, length={stats.path_length}") \ No newline at end of file + for algo, name in [(BFS(), "BFS"), (DFS(), "DFS"), (AStar(), "A*")]: + pf.set_algorithm(algo) + stats = pf.solve() + print(f"{name}: {stats.time_ms:.3f}ms, visited={stats.visited_cells}, length={stats.path_length}") \ No newline at end of file