# Отчёт по заданию №2

### Реализация поиска пути в лабиринте с использованием паттернов проектирования

---

## 1. Цель работы

Разработать архитектуру и реализацию системы поиска пути в лабиринте, применив паттерны:

- Builder — построение лабиринта из файла
- Strategy — выбор алгоритма поиска
- Observer — отображение состояния
- Command — управление игроком

Также провести экспериментальное сравнение алгоритмов BFS, DFS и A\*.

---

## 2. Архитектура проекта

Структура каталогов:

```
BrychkinKA/
│
├── src/
│   ├── builder/
│   ├── model/
│   ├── solver/
│   ├── strategy/
│   └── ui/
│
├── mazes/
├── experiments/
└── docs/
```

---

## 3. Используемые паттерны

### 3.1 Builder

Абстрагирует процесс построения лабиринта из текстового файла.

### 3.2 Strategy

Позволяет переключать алгоритмы поиска пути без изменения остального кода.

### 3.3 Observer

Используется для отображения состояния лабиринта в консоли.

### 3.4 Command

Реализует управление игроком и пошаговое перемещение.

---

## 4. Диаграмма классов

Диаграмма находится в файле: `class_diagram.mmd`

---

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

Эксперименты проводились на пяти лабиринтах:

- small.txt — простой, проходимый
- medium.txt — средний по сложности
- empty.txt — полностью свободное поле
- no_exit.txt — отсутствует выход
- big.txt — большой лабиринт, путь отсутствует

Алгоритмы:

- BFS
- DFS
- A\*

---

## 6. Результаты

### 6.1 Таблица результатов

| Файл        | Алгоритм | Посещено | Длина пути |
| ----------- | -------- | -------- | ---------- |
| big.txt     | BFS      | 27       | 0          |
| big.txt     | DFS      | 27       | 0          |
| big.txt     | A\*      | 27       | 0          |
| empty.txt   | BFS      | 10       | 10         |
| empty.txt   | DFS      | 10       | 10         |
| empty.txt   | A\*      | 10       | 10         |
| medium.txt  | BFS      | 21       | 17         |
| medium.txt  | DFS      | 19       | 17         |
| medium.txt  | A\*      | 21       | 17         |
| no_exit.txt | BFS      | 0        | 0          |
| no_exit.txt | DFS      | 0        | 0          |
| no_exit.txt | A\*      | 0        | 0          |
| small.txt   | BFS      | 7        | 7          |
| small.txt   | DFS      | 7        | 7          |
| small.txt   | A\*      | 7        | 7          |

---

## 7. Графики

Графики находятся в файле:

`experiments/plot_graphs.py`

- время работы алгоритмов
- количество посещённых клеток

---

## 8. Выводы

1. A\* показывает лучшие результаты на средних и больших лабиринтах, но имеет небольшой накладной расход.
2. DFS посещает меньше клеток, но не гарантирует кратчайший путь.
3. BFS всегда находит кратчайший путь, но исследует больше пространства.
4. На лабиринтах без выхода все алгоритмы корректно возвращают `path_len = 0`.
5. Архитектура с паттернами позволяет легко расширять проект и добавлять новые алгоритмы.

---

## 9. Приложения

- Исходный код
- Лабиринты
- CSV с результатами
- Диаграммы
