diff --git a/SobolevNS/docs/data/task2_maze/demo.py b/SobolevNS/docs/data/task2_maze/demo.py new file mode 100644 index 0000000..623e5dc --- /dev/null +++ b/SobolevNS/docs/data/task2_maze/demo.py @@ -0,0 +1,54 @@ +""" +demo.py - короткая демонстрация всех паттернов на маленьком лабиринте. +""" + +from maze_solver import ( + TextFileMazeBuilder, MazeSolver, ConsoleView, + BFSStrategy, DFSStrategy, AStarStrategy, DijkstraStrategy, + Player, MoveCommand, CommandHistory, +) + + +def main(): + print("=== Builder: загружаем small_10x10.txt ===") + builder = TextFileMazeBuilder() + maze = builder.build_from_file("mazes/small_10x10.txt") + + view = ConsoleView(verbose=True) + view.update({"type": "maze_loaded", "maze": maze}) + + print("\nСам лабиринт:") + print(maze.render_text()) + + print("\n=== Strategy: пробуем все 4 алгоритма ===") + solver = MazeSolver(maze) + solver.attach(view) + + for cls in (BFSStrategy, DFSStrategy, AStarStrategy, DijkstraStrategy): + solver.set_strategy(cls()) + stats = solver.solve() + print(f"--- {stats['strategy']} путь длиной {stats['path_length']} ---") + print(maze.render_text(path=stats['path'])) + print() + + print("=== Command: пройдёмся вручную и сделаем undo ===") + player = Player(maze.start) + history = CommandHistory() + print(f"стартовая позиция: ({player.x},{player.y})") + + # Несколько шагов вправо + for d in "DDDD": + ok = history.do(MoveCommand(maze, player, d)) + print(f" move {d}: {'ok' if ok else 'blocked'} -> ({player.x},{player.y})") + + print("Откатываем 2 хода (undo, undo):") + history.undo() + history.undo() + print(f" теперь игрок в ({player.x},{player.y})") + + print("\nЛабиринт с игроком:") + print(maze.render_text(player=player)) + + +if __name__ == "__main__": + main()