146 lines
4.6 KiB
Python
146 lines
4.6 KiB
Python
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() |