import sys from maze_builder import TextFileMazeBuilder from pathfinding_strategies import BFSStrategy, DFSStrategy, AStarStrategy from maze_solver import MazeSolver from visualization import ConsoleView, GameController, EventType from experiments import ExperimentRunner, print_analysis from analysis import plot_results def create_sample_maze(): sample_maze = [ "S ##### ", "# # ### ", "# # # # ", "# # ### # ", "# # # ", "### # ### ", "# # # ", "# ####### ", "# E ", "##########" ] filename = "sample_maze.txt" with open(filename, 'w', encoding='utf-8') as f: f.write('\n'.join(sample_maze)) return filename def interactive_mode(): builder = TextFileMazeBuilder() filename = create_sample_maze() try: maze = builder.build_from_file(filename) print(f"Лабиринт загружен: {maze.width}x{maze.height}") except Exception as e: print(f"Ошибка загрузки: {e}") return view = ConsoleView() controller = GameController(maze, view) strategies = { '1': BFSStrategy(), '2': DFSStrategy(), '3': AStarStrategy(), } print("\nДоступные алгоритмы поиска пути:") print(" 1. BFS (поиск в ширину) - кратчайший путь") print(" 2. DFS (поиск в глубину) - быстрый, не оптимальный") print(" 3. A* - оптимальный с эвристикой") # Выбор стратегии while True: choice = input("\nВыберите алгоритм (1-3): ").strip() if choice in strategies: strategy = strategies[choice] break print("Неверный выбор. Попробуйте снова.") # Поиск пути print(f"\nИспользуем: {strategy.name}") print("Поиск пути...") solver = MazeSolver(maze, strategy) stats = solver.solve() if stats.path_found: print(f" Путь найден! Победа! Длина: {stats.path_length} шагов") print(f" Время: {stats.time_ms:.3f} мс") path = strategy.find_path(maze, maze.start, maze.exit) controller.set_path(path) # Интерактивное управление print("\nДемонстрация паттерна Command:") print(" Используйте W/A/S/D для перемещения") print(" Нажмите U для отмены последнего хода") print(" Нажмите Q для выхода") print("\nТочка '.' показывает найденный путь") print("Буква 'P' показывает текущую позицию игрока") controller._render() while True: key = input("\n> ").lower() if key == 'q': break elif key == 'w': from visualization import Direction controller.move(Direction.UP) elif key == 's': from visualization import Direction controller.move(Direction.DOWN) elif key == 'a': from visualization import Direction controller.move(Direction.LEFT) elif key == 'd': from visualization import Direction controller.move(Direction.RIGHT) elif key == 'u': controller.undo() print("Ход отменён!") else: print("Команды: W(вверх), S(вниз), A(влево), D(вправо), U(отмена), Q(выход)") else: print("Путь не найден, грустно") def experimental_mode(): print("эксперименты") print("Запуск экспериментов на лабиринтах разной сложности...") runner = ExperimentRunner() results = runner.run_all_experiments() print_analysis(results) #графики plot_results(results) def main(): print("\nВыберите режим работы:") print(" 1. Интерактивный режим (с визуализацией)") print(" 2. Экспериментальный режим (замеры производительности)") print(" 3. Выход") choice = input("\nВаш выбор (1-3): ").strip() if choice == '1': interactive_mode() elif choice == '2': experimental_mode() else: print("Adios!") sys.exit(0) if __name__ == "__main__": main()