from builders import TextFileMazeBuilder from strategies import BFSStrategy, DFSStrategy, AStarStrategy from solver import MazeSolver from observer_command import ConsoleView, Player, MoveCommand import os import sys def clear_screen(): os.system('cls' if os.name == 'nt' else 'clear') script_dir = os.path.dirname(os.path.abspath(__file__)) builder = TextFileMazeBuilder() print("Выбери лабиринт:") print("1 - small_maze.txt") print("2 - medium_maze.txt") print("3 - big_maze.txt") print("4 - no_exit_maze.txt") print("5 - no_wall_maze.txt") print("0 - выход") choice_maze = input("> ") if choice_maze == "0": sys.exit() elif choice_maze == "1": filename = "small_maze.txt" elif choice_maze == "2": filename = "medium_maze.txt" elif choice_maze == "3": filename = "big_maze.txt" elif choice_maze == "4": filename = "no_exit_maze.txt" elif choice_maze == "5": filename = "no_wall_maze.txt" else: print("Неверный выбор") sys.exit() file_path = os.path.join(script_dir, filename) maze = builder.buildFromFile(file_path) clear_screen() print("Лабиринт:") maze.printMaze() print("\nВыбери алгоритм:") print("1 - BFS") print("2 - DFS") print("3 - A*") print("0 - выход") choice = input("> ") if choice == "0": sys.exit() elif choice == "1": strategy = BFSStrategy() elif choice == "2": strategy = DFSStrategy() elif choice == "3": strategy = AStarStrategy() else: print("Неверный выбор") sys.exit() clear_screen() solver = MazeSolver(maze, strategy) view = ConsoleView() solver.addObserver(view) stats = solver.solve() print("Результат:") print(stats) path, _ = strategy.findPath(maze, maze.start, maze.exit) if not path: print("\nПуть не найден") sys.exit() print(f"\nНайден путь, длина: {len(path)} шагов") print("\nКак пройти лабиринт?") print("1 - пошагово") print("2 - скипнуть путь") print("0 - выход") mode = input("> ") if mode == "0": sys.exit() elif mode == "2": clear_screen() print("Весь путь:") player = Player(maze.start) view.render(maze, player, path) print(f"\nДлина пути: {len(path)} шагов") sys.exit() print("\nИдём пошагово, Enter - следующий шаг, 0 - скип") player = Player(maze.start) passed_path = [maze.start] view.render(maze, player, passed_path) for i, cell in enumerate(path[1:], 1): print(f"\nШаг {i}/{len(path)-1}") user_input = input("> ") if user_input == "0": clear_screen() print("Пропускаем...") for remaining_cell in path[i:]: cmd = MoveCommand(player, remaining_cell) cmd.execute() passed_path.append(remaining_cell) clear_screen() view.render(maze, player, path) print(f"\nДлина пути: {len(path)} шагов") sys.exit() cmd = MoveCommand(player, cell) cmd.execute() passed_path.append(cell) clear_screen() view.render(maze, player, passed_path) print("\nГотово!")