128 lines
3.1 KiB
Python
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Готово!") |