diff --git a/novikovsd/maze.py b/novikovsd/maze.py index 21ded02..cb9c6dd 100644 --- a/novikovsd/maze.py +++ b/novikovsd/maze.py @@ -490,4 +490,79 @@ def run_experiment(): plt.close() print(f"Графики сохранены в папку {RESULTS_DIR}") except ImportError: - print("matplotlib не установлен. Графики не построены.") \ No newline at end of file + print("matplotlib не установлен. Графики не построены.") + +def demo_interactive(): + ensure_results_dir() + builder = TextFileMazeBuilder() + filename = input("Введите имя файла с лабиринтом (например, maze_small.txt): ").strip() + if not os.path.exists(filename) and not os.path.exists(os.path.join(RESULTS_DIR, filename)): + print(f"Файл {filename} не найден. Создаю тестовый лабиринт small в папке {RESULTS_DIR}") + generate_test_maze_file("demo_maze.txt", "small") + filename = os.path.join(RESULTS_DIR, "demo_maze.txt") + elif os.path.exists(os.path.join(RESULTS_DIR, filename)): + filename = os.path.join(RESULTS_DIR, filename) + + maze = builder.build_from_file(filename) + view = ConsoleView() + view.update("maze_loaded", {"maze": maze}) + + print("Выберите алгоритм поиска:") + print("1. BFS") + print("2. DFS") + print("3. A*") + choice = input("Ваш выбор: ") + if choice == "1": + strategy = BFSStrategy() + elif choice == "2": + strategy = DFSStrategy() + else: + strategy = AStarStrategy() + + solver = MazeSolver(maze, strategy) + solver.attach(view) + path, stats = solver.solve() + print(f"Поиск завершён. Статистика: {stats}") + + if path: + print("Найден путь. Хотите пройти по нему пошагово? (y/n): ", end="") + ans = input().lower() + if ans == 'y': + player = Player(maze.start) + cmd_history = [] + for step_cell in path[1:]: + dx = step_cell.x - player.current_cell.x + dy = step_cell.y - player.current_cell.y + if dx == 1: + dir_char = 'd' + elif dx == -1: + dir_char = 'a' + elif dy == 1: + dir_char = 's' + else: + dir_char = 'w' + cmd = MoveCommandImpl(player, dir_char, maze) + if cmd.execute(): + cmd_history.append(cmd) + view.update("player_moved", {"player_cell": player.current_cell}) + input("Нажмите Enter для следующего шага...") + print("Вы достигли выхода!") + print("Отменить последний шаг? (y/n): ", end="") + if input().lower() == 'y' and cmd_history: + cmd_history[-1].undo() + view.update("player_moved", {"player_cell": player.current_cell}) + print("Последний шаг отменён.") + else: + print("Путь не найден.") + +if __name__ == "__main__": + print("Лабораторная работа: Поиск выхода из лабиринта") + print("1. Запустить эксперименты (сравнение алгоритмов)") + print("2. Интерактивный режим (загрузка своего лабиринта)") + mode = input("Выберите режим (1 или 2): ") + if mode == "1": + run_experiment() + elif mode == "2": + demo_interactive() + else: + print("Неверный выбор.") \ No newline at end of file