# Поиск выхода из лабиринта

Объектно-ориентированная реализация поиска пути в лабиринте с паттернами GoF:
Builder, Strategy, Observer и Command.

## Что реализовано

- модель `Cell` и `Maze`;
- загрузка лабиринта из текстового файла через `TextFileMazeBuilder`;
- стратегии поиска пути: BFS, DFS, A*, Дейкстра;
- `MazeSolver`, который измеряет время, число посещенных клеток и длину пути;
- консольный `Observer` для сообщений и отрисовки;
- `MoveCommand` и `Player` для ручного режима с undo;
- генератор тестовых лабиринтов;
- экспериментальный скрипт, CSV и SVG-графики;
- отчет: `reports/report.md`.

## Формат лабиринта

```text
# - стена
  - проход
S - старт
E - выход
2, 3, ~ - проходимые клетки с увеличенным весом
```

Все строки в файле лабиринта должны иметь одинаковую длину.

## Запуск

```bash
python3 scripts/generate_mazes.py
python3 main.py --maze data/mazes/small.txt --strategy astar --render
```

Доступные стратегии:

```text
bfs
dfs
astar
dijkstra
```

Ручной режим с командами `W/A/S/D`, undo через `Z`:

```bash
python3 main.py --maze data/mazes/small.txt --manual
```

## Эксперименты

```bash
python3 scripts/run_experiments.py
```

Скрипт перегенерирует лабиринты, запускает каждую стратегию 10 раз и сохраняет:

- `reports/results.csv`;
- SVG-графики в `reports/charts/`.

## Проверка

```bash
python3 -m unittest
```
