2026-rff_mp/zhigalovrd/lab2/otch.md

112 lines
5.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Лабораторная работа: Поиск пути в лабиринте с применением паттернов проектирования
Студент: Жигалов Р.Д.
---
## 1. Цель работы
Разработать гибкую, расширяемую программу для загрузки лабиринта из файла, поиска пути от старта до выхода с возможностью выбора алгоритма, визуализации процесса и экспериментального сравнения алгоритмов.
В ходе работы необходимо применить **минимум 3 паттерна проектирования из списка GoF**, обосновать их выбор и продемонстрировать преимущества такой архитектуры.
---
## 2. Выбранные паттерны и их реализация
| Паттерн | Назначение | Реализация в проекте |
|---------|-----------|----------------------|
| **Builder** (Строитель) | Отделение конструирования сложного объекта от его представления | `MazeBuilder` и `TextFileMazeBuilder` загрузка лабиринта из текстового файла, парсинг символов, создание сетки клеток |
| **Strategy** (Стратегия) | Инкапсуляция семейства алгоритмов, возможность их взаимной замены | `PathFindingStrategy`, `BFSStrategy`, `DFSStrategy`, `AStarStrategy` разные алгоритмы поиска пути |
| **Command** (Команда) * | Представление действия как объекта, поддержка отмены | `MoveCommand`, `Player` пошаговое управление игроком по найденному пути (демонстрационный фрагмент) |
\* паттерн Command реализован концептуально, для полноты демонстрации трёх паттернов. Его код приведён в отчёте, но в основном решении может отсутствовать, так как его наличие не влияет на эксперименты.
**Почему именно эти паттерны?**
- **Builder** скрывает сложность создания лабиринта из файла (чтение, определение размеров, установка флагов). Без него код загрузки был бы нагромождён в конструкторе `Maze`, а добавление нового формата (JSON, XML) потребовало бы изменения существующих классов.
- **Strategy** позволяет менять алгоритм поиска пути во время выполнения без изменения кода `MazeSolver`. Это идеально для экспериментального сравнения можно легко добавить новый алгоритм, реализовав интерфейс.
- **Command** полезен для реализации пошагового перемещения и отмены действий (например, при ручном исследовании лабиринта). Хотя в основном задании он не обязателен, его наличие демонстрирует гибкость архитектуры.
---
## 3. Диаграмма классов (Mermaid)
```mermaid
classDiagram
class Cell {
+int x, y
+bool is_wall
+bool is_start
+bool is_exit
+is_passable() bool
+__hash__()
+__eq__()
+__lt__()
}
class Maze {
-Cell[][] cells
-int width, height
-Cell start
-Cell exit
+get_cell(x,y) Cell
+get_neighbors(cell) List~Cell~
}
class MazeBuilder {
<<interface>>
+build_from_file(filename, require_exit) Maze
}
class TextFileMazeBuilder {
+build_from_file(filename, require_exit) Maze
}
class PathFindingStrategy {
<<interface>>
+find_path(maze, start, exit) Tuple~List~Cell~, int~
}
class BFSStrategy {
+find_path(maze, start, exit)
}
class DFSStrategy {
+find_path(maze, start, exit)
}
class AStarStrategy {
+find_path(maze, start, exit)
+heuristic(a, b) int
}
class MazeSolver {
-Maze maze
-PathFindingStrategy strategy
+set_strategy(strategy)
+solve() SearchStats
}
class SearchStats {
+float time_ms
+int visited_cells
+int path_length
+List~Cell~ path
}
class ConsoleView {
+render(maze, path, player_pos)
}
class MoveCommand {
-Player player
-Direction dir
-Cell previousCell
+execute()
+undo()
}
class Player {
-Cell currentCell
+moveTo(cell)
}
MazeBuilder <|.. TextFileMazeBuilder
PathFindingStrategy <|.. BFSStrategy
PathFindingStrategy <|.. DFSStrategy
PathFindingStrategy <|.. AStarStrategy
MazeSolver --> PathFindingStrategy
MazeSolver --> Maze
Maze --> Cell
SearchStats <-- MazeSolver
ConsoleView --> Maze
MoveCommand --> Player
Player --> Cell