# Этап 7. Отчёт

## Описание задачи

Разработать программу для загрузки лабиринта из файла, поиска пути с выбором алгоритма и сравнения их эффективности. Применены четыре паттерна GoF:

|Паттерн|Где применён|
|---|---|
|**Builder**|`TextFileBuilder`|
|**Strategy**|`BFSStrategy`, `DFSStrategy`, `AStarStrategy`|
|**Observer**|`ConsoleView`|
|**Command**|`MoveCommand`, `CommandHistory`|

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

```{mermaid}
classDiagram
    class Cell {
        +int x, y
        +bool is_wall, is_start, is_exit
        +is_possible() bool
    }
    class Maze {
        +get_cell(x, y) Cell
        +get_neighbors(x, y) list
        +start, exit, shape
    }
    class MazeBuilder { <<abstract>> }
    class TextFileBuilder
    class PathFindingStrategy {
        <<abstract>>
        +find_path(maze, start, exit) list
    }
    class BFSStrategy
    class DFSStrategy
    class AStarStrategy
    class MazeSolver {
        +set_strategy(strategy)
        +solve() SearchStats
    }
    class ConsoleView {
        +update(event)
        +render(maze, player, path)
    }
    class MoveCommand {
        +execute() bool
        +undo()
    }
    class CommandHistory {
        +push(command)
        +undo() bool
    }

    Maze *-- Cell
    MazeBuilder <|-- TextFileBuilder
    TextFileBuilder ..> Maze : creates
    PathFindingStrategy <|-- BFSStrategy
    PathFindingStrategy <|-- DFSStrategy
    PathFindingStrategy <|-- AStarStrategy
    MazeSolver --> PathFindingStrategy
    MazeSolver --> Maze
    MoveCommand --> Maze
    CommandHistory --> MoveCommand
```

## Результаты экспериментов

| Лабиринт          | Быстрее всех  | Кратчайший путь |
| ----------------- | ------------- | --------------- |
| 10×10 path        | все одинаково | все одинаково   |
| 50×50 deadends    | BFS           | BFS = A*        |
| 100×100 spaghetti | DFS           | BFS = A*        |
| 30×30 empty       | DFS           | BFS = A*        |

**BFS** — надёжный выбор, всегда кратчайший путь.  
**DFS** — быстрый, но путь длиннее. На 100×100 обошёл в 10 раз больше клеток.  
**A*** — лучший на больших лабиринтах с препятствиями, проигрывает на простых из-за накладных расходов на `heapq`.

## Выводы

Паттерны сделали код расширяемым: новый алгоритм — один класс, новый формат файла — один класс, новый способ отображения — один класс. Без паттернов каждое такое изменение потребовало бы правки существующего кода.