From eab701c3817815357fa1c2a20eb9b57806ec9331 Mon Sep 17 00:00:00 2001 From: komissarovgo Date: Sun, 17 May 2026 16:44:35 +0300 Subject: [PATCH] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=B3=D0=BB=D0=B0=D0=B2=D0=BD=D0=B0=D1=8F=20?= =?UTF-8?q?=D0=BF=D1=80=D0=BE=D0=B3=D1=80=D0=B0=D0=BC=D0=BC=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- komissarovgo/docs2/data2/maze_lab/main.py | 146 ++++++++++++++++++++++ 1 file changed, 146 insertions(+) create mode 100644 komissarovgo/docs2/data2/maze_lab/main.py diff --git a/komissarovgo/docs2/data2/maze_lab/main.py b/komissarovgo/docs2/data2/maze_lab/main.py new file mode 100644 index 0000000..6ff1604 --- /dev/null +++ b/komissarovgo/docs2/data2/maze_lab/main.py @@ -0,0 +1,146 @@ +import sys +from pathlib import Path + +from builders import TextFileMazeBuilder +from solver import MazeSolver +from strategies import BFSStrategy, DFSStrategy, AStarStrategy +from visualization import ConsoleView +from experiments import ExperimentRunner + + +def create_test_maze_file(filename: str, maze_data: list): + Path("mazes").mkdir(exist_ok=True) + with open(f"mazes/{filename}", 'w', encoding='utf-8') as f: + f.write('\n'.join(maze_data)) + + +def setup_test_mazes(): + + small_maze = [ + "##########", + "#S #", + "# ####### #", + "# # #", + "##### # # #", + "# # #", + "# ### ### #", + "# # #", + "# #### E#", + "##########" + ] + create_test_maze_file("small_maze.txt", small_maze) + + simple_maze = [ + "##########", + "#S #", + "# #", + "# #", + "# #", + "# #", + "# #", + "# #", + "# E#", + "##########" + ] + create_test_maze_file("simple_maze.txt", simple_maze) + + no_exit_maze = [ + "##########", + "#S #", + "# ####### #", + "# # #", + "##### # # #", + "# # #", + "# ### ### #", + "# # #", + "# #######", + "##########" + ] + create_test_maze_file("no_exit_maze.txt", no_exit_maze) + + +def interactive_mode(): + + print("=" * 50) + print("Интерактивный режим") + print("=" * 50) + + builder = TextFileMazeBuilder() + view = ConsoleView() + + maze_file = input("Введите путь к файлу (по умолчанию: mazes/small_maze.txt): ") + if not maze_file: + maze_file = "mazes/small_maze.txt" + + try: + maze = builder.build_from_file(maze_file) + view.update("maze_loaded", {"maze": maze}) + except Exception as e: + print(f"Ошибка: {e}") + return + + print("\nСтратегии:") + print("1. BFS") + print("2. DFS") + print("3. A*") + + choice = input("Выберите (1-3): ") + strategies = {"1": BFSStrategy(), "2": DFSStrategy(), "3": AStarStrategy()} + strategy = strategies.get(choice, BFSStrategy()) + + print(f"\nВыбрана: {strategy.name}") + + solver = MazeSolver(maze, strategy) + path, stats = solver.solve() + + if path: + view.update("path_found", {"path": path, "maze": maze}) + print(f"\n{stats}") + else: + view.update("path_not_found", {}) + print("Путь не найден!") + + +def experiment_mode(): + + print("\n" + "=" * 50) + print("Экспериментальное сравнение") + print("=" * 50) + + setup_test_mazes() + + runner = ExperimentRunner() + maze_files = ["mazes/small_maze.txt", "mazes/simple_maze.txt", "mazes/no_exit_maze.txt"] + results = runner.run_all_experiments(maze_files, runs=10) + + print("\n" + "=" * 50) + print("Результаты:") + print("=" * 50) + print(f"{'Лабиринт':<15} {'Стратегия':<8} {'Ср. время (мс)':<15} {'Длина пути':<10}") + print("-" * 50) + + for r in results: + print(f"{r['maze']:<15} {r['strategy']:<8} {r['avg_time_ms']:<15.3f} {r['path_length']:<10}") + + +def main(): + print("\n" + "=" * 50) + print("Лабораторная: Поиск выхода из лабиринта") + print("Паттерны: Builder, Strategy, Observer, Command") + print("=" * 50) + + print("\n1. Интерактивный режим") + print("2. Экспериментальный режим") + + choice = input("\nВыберите (1-2): ") + + if choice == "1": + interactive_mode() + elif choice == "2": + experiment_mode() + else: + print("Неверный выбор!") + + +if __name__ == "__main__": + main() \ No newline at end of file