2026-rff_mp/kolesovve/task2/docs/data/main.py
2026-09-05 01:23:16 +03:00

128 lines
3.1 KiB
Python

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Готово!")