From 8ebd282344e8b8e858cd4bf204035bb167a294e4 Mon Sep 17 00:00:00 2001 From: BrychkinKA Date: Mon, 25 May 2026 15:23:54 +0300 Subject: [PATCH] task2 --- BrychkinKA/docs/class_diagram.mmd | 47 ++++++ BrychkinKA/docs/conclusion.md | 135 ++++++++++++++++++ BrychkinKA/docs/diagrams.md | 21 +++ BrychkinKA/experiments/benchmark.py | 65 +++++++++ BrychkinKA/experiments/plot_graphs.py | 76 ++++++++++ BrychkinKA/experiments/plot_path.png | Bin 0 -> 36019 bytes BrychkinKA/experiments/plot_time.png | Bin 0 -> 39055 bytes BrychkinKA/experiments/plot_visited.png | Bin 0 -> 38187 bytes BrychkinKA/experiments/results.csv | 16 +++ BrychkinKA/mazes/big.txt | 13 ++ BrychkinKA/mazes/empty.txt | 1 + BrychkinKA/mazes/medium.txt | 5 + BrychkinKA/mazes/no_exit.txt | 3 + BrychkinKA/mazes/small.txt | 3 + BrychkinKA/src/builder/maze_builder.py | 7 + .../src/builder/text_file_maze_builder.py | 36 +++++ BrychkinKA/src/main.py | 101 +++++++++++++ BrychkinKA/src/model/cell.py | 19 +++ BrychkinKA/src/model/maze.py | 23 +++ BrychkinKA/src/solver/maze_solver.py | 32 +++++ BrychkinKA/src/solver/search_stats.py | 8 ++ BrychkinKA/src/strategy/astar_strategy.py | 43 ++++++ BrychkinKA/src/strategy/bfs_strategy.py | 29 ++++ BrychkinKA/src/strategy/dfs_strategy.py | 27 ++++ .../src/strategy/path_finding_strategy.py | 9 ++ BrychkinKA/src/ui/command.py | 10 ++ BrychkinKA/src/ui/console_view.py | 33 +++++ BrychkinKA/src/ui/move_command.py | 17 +++ BrychkinKA/src/ui/observer.py | 6 + BrychkinKA/src/ui/player.py | 8 ++ 30 files changed, 793 insertions(+) create mode 100644 BrychkinKA/docs/class_diagram.mmd create mode 100644 BrychkinKA/docs/conclusion.md create mode 100644 BrychkinKA/docs/diagrams.md create mode 100644 BrychkinKA/experiments/benchmark.py create mode 100644 BrychkinKA/experiments/plot_graphs.py create mode 100644 BrychkinKA/experiments/plot_path.png create mode 100644 BrychkinKA/experiments/plot_time.png create mode 100644 BrychkinKA/experiments/plot_visited.png create mode 100644 BrychkinKA/experiments/results.csv create mode 100644 BrychkinKA/mazes/big.txt create mode 100644 BrychkinKA/mazes/empty.txt create mode 100644 BrychkinKA/mazes/medium.txt create mode 100644 BrychkinKA/mazes/no_exit.txt create mode 100644 BrychkinKA/mazes/small.txt create mode 100644 BrychkinKA/src/builder/maze_builder.py create mode 100644 BrychkinKA/src/builder/text_file_maze_builder.py create mode 100644 BrychkinKA/src/main.py create mode 100644 BrychkinKA/src/model/cell.py create mode 100644 BrychkinKA/src/model/maze.py create mode 100644 BrychkinKA/src/solver/maze_solver.py create mode 100644 BrychkinKA/src/solver/search_stats.py create mode 100644 BrychkinKA/src/strategy/astar_strategy.py create mode 100644 BrychkinKA/src/strategy/bfs_strategy.py create mode 100644 BrychkinKA/src/strategy/dfs_strategy.py create mode 100644 BrychkinKA/src/strategy/path_finding_strategy.py create mode 100644 BrychkinKA/src/ui/command.py create mode 100644 BrychkinKA/src/ui/console_view.py create mode 100644 BrychkinKA/src/ui/move_command.py create mode 100644 BrychkinKA/src/ui/observer.py create mode 100644 BrychkinKA/src/ui/player.py diff --git a/BrychkinKA/docs/class_diagram.mmd b/BrychkinKA/docs/class_diagram.mmd new file mode 100644 index 0000000..59ae838 --- /dev/null +++ b/BrychkinKA/docs/class_diagram.mmd @@ -0,0 +1,47 @@ +classDiagram + class Maze { + +width + +height + +cells + +start + +exit + +get_neighbors() + } + + class Cell { + +x + +y + +is_wall + +is_start + +is_exit + } + + class MazeBuilder { + <> + +build_from_file() + } + + class TextFileMazeBuilder { + +build_from_file() + } + + class PathFindingStrategy { + <> + +find_path() + } + + class BFSStrategy + class DFSStrategy + class AStarStrategy + + class MazeSolver { + +solve() + } + + Maze --> Cell + TextFileMazeBuilder ..|> MazeBuilder + BFSStrategy ..|> PathFindingStrategy + DFSStrategy ..|> PathFindingStrategy + AStarStrategy ..|> PathFindingStrategy + MazeSolver --> PathFindingStrategy + MazeSolver --> Maze \ No newline at end of file diff --git a/BrychkinKA/docs/conclusion.md b/BrychkinKA/docs/conclusion.md new file mode 100644 index 0000000..c508b2f --- /dev/null +++ b/BrychkinKA/docs/conclusion.md @@ -0,0 +1,135 @@ +# Отчёт по заданию №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 с результатами +- Диаграммы diff --git a/BrychkinKA/docs/diagrams.md b/BrychkinKA/docs/diagrams.md new file mode 100644 index 0000000..8c2a542 --- /dev/null +++ b/BrychkinKA/docs/diagrams.md @@ -0,0 +1,21 @@ +# Диаграммы проекта + +## 1. Диаграмма классов + +См. файл `class_diagram.mmd`. + +## 2. Структура каталогов + +``` +vinichukan/ +├── src/ +├── mazes/ +├── experiments/ +└── docs/ +``` + +## 3. Логика работы алгоритмов + +- BFS — поиск в ширину +- DFS — поиск в глубину +- A\* — эвристический поиск с манхэттенской метрикой diff --git a/BrychkinKA/experiments/benchmark.py b/BrychkinKA/experiments/benchmark.py new file mode 100644 index 0000000..f903979 --- /dev/null +++ b/BrychkinKA/experiments/benchmark.py @@ -0,0 +1,65 @@ +import os +import sys +import csv +from time import perf_counter + +# Добавляем корневую папку BrychkinKA в sys.path +sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +from src.builder.text_file_maze_builder import TextFileMazeBuilder +from src.strategy.bfs_strategy import BFSStrategy +from src.strategy.dfs_strategy import DFSStrategy +from src.strategy.astar_strategy import AStarStrategy +from src.solver.maze_solver import MazeSolver + + +def run_experiments(): + builder = TextFileMazeBuilder() + + strategies = { + "BFS": BFSStrategy(), + "DFS": DFSStrategy(), + "A*": AStarStrategy() + } + + # Папка с лабиринтами относительно корня + root_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + maze_dir = os.path.join(root_dir, "mazes") + + files = [f for f in os.listdir(maze_dir) if f.endswith(".txt")] + + results = [] + + for maze_file in files: + maze_path = os.path.join(maze_dir, maze_file) + maze = builder.build_from_file(maze_path) + + for name, strategy in strategies.items(): + solver = MazeSolver(maze, strategy) + + t0 = perf_counter() + stats = solver.solve() + t1 = perf_counter() + + results.append([ + maze_file, + name, + stats.time_ms, + stats.visited, + stats.path_len + ]) + + print(f"{maze_file} | {name} | {stats}") + + # Сохраняем results.csv в папку experiments + output_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "results.csv") + with open(output_path, "w", newline="", encoding="utf-8") as f: + writer = csv.writer(f) + writer.writerow(["maze", "algorithm", "time_ms", "visited", "path_len"]) + writer.writerows(results) + + print(f"\nРезультаты сохранены в {output_path}") + + +if __name__ == "__main__": + run_experiments() \ No newline at end of file diff --git a/BrychkinKA/experiments/plot_graphs.py b/BrychkinKA/experiments/plot_graphs.py new file mode 100644 index 0000000..babf4cd --- /dev/null +++ b/BrychkinKA/experiments/plot_graphs.py @@ -0,0 +1,76 @@ +import csv +import matplotlib.pyplot as plt +import os + +def plot_results(): + # Определяем правильный путь к results.csv + script_dir = os.path.dirname(os.path.abspath(__file__)) + csv_path = os.path.join(script_dir, "results.csv") + + results = [] + with open(csv_path, "r", encoding="utf-8") as f: + reader = csv.DictReader(f) + for row in reader: + row['time_ms'] = float(row['time_ms']) + row['visited'] = int(row['visited']) + row['path_len'] = int(row['path_len']) + results.append(row) + + mazes = sorted(set(r['maze'] for r in results)) + algorithms = sorted(set(r['algorithm'] for r in results)) + + x_labels = [] + for m in mazes: + for a in algorithms: + x_labels.append(f"{m.replace('.txt','')}\n{a}") + + # График 1: Время выполнения + plt.figure(figsize=(12, 6)) + times = [] + for m in mazes: + for a in algorithms: + val = [r['time_ms'] for r in results if r['maze'] == m and r['algorithm'] == a] + times.append(val[0] if val else 0) + plt.bar(x_labels, times) + plt.ylabel("Время (мс)") + plt.title("Сравнение времени выполнения алгоритмов") + plt.xticks(rotation=45, ha='right') + plt.tight_layout() + plt.savefig(os.path.join(script_dir, "plot_time.png"), dpi=150) + plt.close() + print("Сохранён: experiments/plot_time.png") + + # График 2: Посещённые клетки + plt.figure(figsize=(12, 6)) + visited_list = [] + for m in mazes: + for a in algorithms: + val = [r['visited'] for r in results if r['maze'] == m and r['algorithm'] == a] + visited_list.append(val[0] if val else 0) + plt.bar(x_labels, visited_list) + plt.ylabel("Посещено клеток") + plt.title("Сравнение количества посещённых клеток") + plt.xticks(rotation=45, ha='right') + plt.tight_layout() + plt.savefig(os.path.join(script_dir, "plot_visited.png"), dpi=150) + plt.close() + print("Сохранён: experiments/plot_visited.png") + + # График 3: Длина пути + plt.figure(figsize=(12, 6)) + path_list = [] + for m in mazes: + for a in algorithms: + val = [r['path_len'] for r in results if r['maze'] == m and r['algorithm'] == a] + path_list.append(val[0] if val else 0) + plt.bar(x_labels, path_list) + plt.ylabel("Длина пути") + plt.title("Сравнение длины найденного пути") + plt.xticks(rotation=45, ha='right') + plt.tight_layout() + plt.savefig(os.path.join(script_dir, "plot_path.png"), dpi=150) + plt.close() + print("Сохранён: experiments/plot_path.png") + +if __name__ == "__main__": + plot_results() \ No newline at end of file diff --git a/BrychkinKA/experiments/plot_path.png b/BrychkinKA/experiments/plot_path.png new file mode 100644 index 0000000000000000000000000000000000000000..ac4db908d0b0f9fca55e9f58bbe0f3d9a3de0338 GIT binary patch literal 36019 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 Qirj&wy3U1MRm+F}2kK!(i~s-t literal 0 HcmV?d00001 diff --git a/BrychkinKA/experiments/plot_time.png b/BrychkinKA/experiments/plot_time.png new file mode 100644 index 0000000000000000000000000000000000000000..afd7d049a886845c3f4c943b326124462266e9e6 GIT binary patch literal 39055 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 literal 0 HcmV?d00001 diff --git a/BrychkinKA/experiments/plot_visited.png b/BrychkinKA/experiments/plot_visited.png new file mode 100644 index 0000000000000000000000000000000000000000..a125b1436a624bc583c5127efff981c3b417ca6d GIT binary patch literal 38187 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�uKv(d$z!D!u+$!Fj{F)L4tk@5Yz%L{drV!wV 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 Maze: + pass \ No newline at end of file diff --git a/BrychkinKA/src/builder/text_file_maze_builder.py b/BrychkinKA/src/builder/text_file_maze_builder.py new file mode 100644 index 0000000..d483646 --- /dev/null +++ b/BrychkinKA/src/builder/text_file_maze_builder.py @@ -0,0 +1,36 @@ +from src.model.cell import Cell +from src.model.maze import Maze + +class TextFileMazeBuilder: + def build_from_file(self, filename): + with open(filename, "r", encoding="utf-8") as f: + lines = [line.rstrip("\n") for line in f] + + height = len(lines) + width = max(len(line) for line in lines) + + cells = [] + start = None + exit_ = None + + for y, line in enumerate(lines): + row = [] + for x, ch in enumerate(line.ljust(width)): + is_wall = (ch == "#") + is_start = (ch == "S") + is_exit = (ch == "E") + + cell = Cell(x, y, is_wall, is_start, is_exit) + row.append(cell) + + if is_start: + start = cell + if is_exit: + exit_ = cell + + cells.append(row) + + if start is None: + raise ValueError("Файл должен содержать S (старт)") + + return Maze(width, height, cells, start, exit_) \ No newline at end of file diff --git a/BrychkinKA/src/main.py b/BrychkinKA/src/main.py new file mode 100644 index 0000000..043e173 --- /dev/null +++ b/BrychkinKA/src/main.py @@ -0,0 +1,101 @@ +from src.builder.text_file_maze_builder import TextFileMazeBuilder +from src.strategy.bfs_strategy import BFSStrategy +from src.strategy.dfs_strategy import DFSStrategy +from src.strategy.astar_strategy import AStarStrategy +from src.solver.maze_solver import MazeSolver +from src.ui.console_view import ConsoleView +from src.ui.player import Player +from src.ui.move_command import MoveCommand + + +def choose_maze(): + mazes = { + "1": ("small.txt", "Small — маленький лабиринт"), + "2": ("medium.txt", "Medium — средний лабиринт"), + "3": ("big.txt", "Big — большой лабиринт(тупиковый)"), + "4": ("empty.txt", "Empty — пустой лабиринт"), + "5": ("no_exit.txt","NoExit — без выхода") + } + + print("\n" + "=" * 40) + print(" ВЫБОР ЛАБИРИНТА") + print("=" * 40) + + for key, (_, desc) in mazes.items(): + print(f" {key}. {desc}") + + print("=" * 40) + + choice = input("Введите номер: ").strip() + + if choice not in mazes: + print("Неверный выбор, загружаю small.txt") + return "small.txt" + + filename = mazes[choice][0] + print(f"Загружен: {filename}") + return filename + + +def main(): + builder = TextFileMazeBuilder() + + filename = choose_maze() + maze = builder.build_from_file(f"mazes/{filename}") + + view = ConsoleView() + view.update(f"Maze '{filename}' loaded") + + strategies = { + "bfs": BFSStrategy(), + "dfs": DFSStrategy(), + "astar": AStarStrategy() + } + + print("\nВыберите алгоритм:") + print(" bfs — поиск в ширину") + print(" dfs — поиск в глубину") + print(" astar — A*") + algo = input("Введите название: ").strip().lower() + + strategy = strategies.get(algo, BFSStrategy()) + + solver = MazeSolver(maze, strategy) + stats = solver.solve() + print(stats) + + path, visited = strategy.find_path(maze, maze.start, maze.exit) + view.render(maze, None, path) + + player = Player(maze.start) + + while True: + cmd = input("Ход (w/a/s/d) или q для выхода: ").strip().lower() + if cmd == "q": + break + + dxdy = { + "w": (0, -1), + "s": (0, 1), + "a": (-1, 0), + "d": (1, 0) + } + + if cmd not in dxdy: + continue + + dx, dy = dxdy[cmd] + new_cell = maze.get_cell(player.current_cell.x + dx, + player.current_cell.y + dy) + + if not new_cell or not new_cell.is_passable(): + print("Там стена, туда нельзя.") + continue + + move = MoveCommand(player, new_cell) + move.execute() + view.render(maze, player.current_cell, path) + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/BrychkinKA/src/model/cell.py b/BrychkinKA/src/model/cell.py new file mode 100644 index 0000000..5fad247 --- /dev/null +++ b/BrychkinKA/src/model/cell.py @@ -0,0 +1,19 @@ +class Cell: + def __init__(self, x, y, is_wall=False, is_start=False, is_exit=False): + self.x = x + self.y = y + self.is_wall = is_wall + self.is_start = is_start + self.is_exit = is_exit + + def __repr__(self): + return f"Cell({self.x},{self.y})" + + def __hash__(self): + return hash((self.x, self.y)) + + def __eq__(self, other): + return isinstance(other, Cell) and self.x == other.x and self.y == other.y + + def is_passable(self): + return not self.is_wall \ No newline at end of file diff --git a/BrychkinKA/src/model/maze.py b/BrychkinKA/src/model/maze.py new file mode 100644 index 0000000..398d737 --- /dev/null +++ b/BrychkinKA/src/model/maze.py @@ -0,0 +1,23 @@ +class Maze: + def __init__(self, width, height, cells, start, exit_): + self.width = width + self.height = height + self.cells = cells + self.start = start + self.exit = exit_ + + def get_cell(self, x, y): + return self.cells[y][x] + + def get_neighbors(self, cell): + dirs = [(1,0), (-1,0), (0,1), (0,-1)] + result = [] + + for dx, dy in dirs: + nx, ny = cell.x + dx, cell.y + dy + if 0 <= nx < self.width and 0 <= ny < self.height: + n = self.get_cell(nx, ny) + if not n.is_wall: + result.append(n) + + return result \ No newline at end of file diff --git a/BrychkinKA/src/solver/maze_solver.py b/BrychkinKA/src/solver/maze_solver.py new file mode 100644 index 0000000..7bceabb --- /dev/null +++ b/BrychkinKA/src/solver/maze_solver.py @@ -0,0 +1,32 @@ +from src.solver.search_stats import SearchStats + +class MazeSolver: + def __init__(self, maze, strategy): + self.maze = maze + self.strategy = strategy + + def solve(self): + import time + t0 = time.perf_counter() + + if self.maze.exit is None: + t1 = time.perf_counter() + return SearchStats( + time_ms=(t1 - t0) * 1000, + visited=0, + path_len=0 + ) + + path, visited = self.strategy.find_path( + self.maze, + self.maze.start, + self.maze.exit + ) + + t1 = time.perf_counter() + + return SearchStats( + time_ms=(t1 - t0) * 1000, + visited=len(visited), + path_len=len(path) if path else 0 + ) \ No newline at end of file diff --git a/BrychkinKA/src/solver/search_stats.py b/BrychkinKA/src/solver/search_stats.py new file mode 100644 index 0000000..1248a28 --- /dev/null +++ b/BrychkinKA/src/solver/search_stats.py @@ -0,0 +1,8 @@ +class SearchStats: + def __init__(self, time_ms, visited, path_len): + self.time_ms = time_ms + self.visited = visited + self.path_len = path_len + + def __repr__(self): + return f"SearchStats(time={self.time_ms:.2f}ms, visited={self.visited}, path={self.path_len})" \ No newline at end of file diff --git a/BrychkinKA/src/strategy/astar_strategy.py b/BrychkinKA/src/strategy/astar_strategy.py new file mode 100644 index 0000000..bdc1bc2 --- /dev/null +++ b/BrychkinKA/src/strategy/astar_strategy.py @@ -0,0 +1,43 @@ +import heapq + +def manhattan(a, b): + return abs(a.x - b.x) + abs(a.y - b.y) + +class AStarStrategy: + def find_path(self, maze, start, exit_): + g = {start: 0} + parent = {start: None} + + counter = 0 + open_heap = [(0, counter, start)] + in_open = {start} + visited = set() + + while open_heap: + _, _, cur = heapq.heappop(open_heap) + in_open.discard(cur) + visited.add(cur) + + if cur == exit_: + return self._reconstruct(parent, start, exit_), visited + + for n in maze.get_neighbors(cur): + tentative = g[cur] + 1 + if tentative < g.get(n, float('inf')): + g[n] = tentative + parent[n] = cur + f = tentative + manhattan(n, exit_) + if n not in in_open: + counter += 1 + heapq.heappush(open_heap, (f, counter, n)) + in_open.add(n) + + return None, visited + + def _reconstruct(self, parent, start, exit_): + path = [] + cur = exit_ + while cur: + path.append(cur) + cur = parent[cur] + return list(reversed(path)) \ No newline at end of file diff --git a/BrychkinKA/src/strategy/bfs_strategy.py b/BrychkinKA/src/strategy/bfs_strategy.py new file mode 100644 index 0000000..650b710 --- /dev/null +++ b/BrychkinKA/src/strategy/bfs_strategy.py @@ -0,0 +1,29 @@ +from collections import deque + +class BFSStrategy: + def find_path(self, maze, start, exit_): + queue = deque([start]) + parent = {start: None} + visited = {start} + + while queue: + cur = queue.popleft() + + if cur == exit_: + return self._reconstruct(parent, start, exit_), visited + + for n in maze.get_neighbors(cur): + if n not in visited: + visited.add(n) + parent[n] = cur + queue.append(n) + + return None, visited + + def _reconstruct(self, parent, start, exit_): + path = [] + cur = exit_ + while cur: + path.append(cur) + cur = parent[cur] + return list(reversed(path)) \ No newline at end of file diff --git a/BrychkinKA/src/strategy/dfs_strategy.py b/BrychkinKA/src/strategy/dfs_strategy.py new file mode 100644 index 0000000..cfd7da2 --- /dev/null +++ b/BrychkinKA/src/strategy/dfs_strategy.py @@ -0,0 +1,27 @@ +class DFSStrategy: + def find_path(self, maze, start, exit_): + stack = [start] + parent = {start: None} + visited = {start} + + while stack: + cur = stack.pop() + + if cur == exit_: + return self._reconstruct(parent, start, exit_), visited + + for n in maze.get_neighbors(cur): + if n not in visited: + visited.add(n) + parent[n] = cur + stack.append(n) + + return None, visited + + def _reconstruct(self, parent, start, exit_): + path = [] + cur = exit_ + while cur: + path.append(cur) + cur = parent[cur] + return list(reversed(path)) \ No newline at end of file diff --git a/BrychkinKA/src/strategy/path_finding_strategy.py b/BrychkinKA/src/strategy/path_finding_strategy.py new file mode 100644 index 0000000..a38f321 --- /dev/null +++ b/BrychkinKA/src/strategy/path_finding_strategy.py @@ -0,0 +1,9 @@ +from abc import ABC, abstractmethod +from typing import List +from src.model.cell import Cell +from src.model.maze import Maze + +class PathFindingStrategy(ABC): + @abstractmethod + def find_path(self, maze: Maze, start: Cell, exit_: Cell) -> List[Cell]: + pass \ No newline at end of file diff --git a/BrychkinKA/src/ui/command.py b/BrychkinKA/src/ui/command.py new file mode 100644 index 0000000..ec15f03 --- /dev/null +++ b/BrychkinKA/src/ui/command.py @@ -0,0 +1,10 @@ +from abc import ABC, abstractmethod + +class Command(ABC): + @abstractmethod + def execute(self): + pass + + @abstractmethod + def undo(self): + pass \ No newline at end of file diff --git a/BrychkinKA/src/ui/console_view.py b/BrychkinKA/src/ui/console_view.py new file mode 100644 index 0000000..f174b34 --- /dev/null +++ b/BrychkinKA/src/ui/console_view.py @@ -0,0 +1,33 @@ +import os +from typing import List +from src.model.cell import Cell +from src.model.maze import Maze +from .observer import Observer + +class ConsoleView(Observer): + def update(self, event: str): + print(f"[EVENT] {event}") + + def render(self, maze: Maze, player_pos: Cell = None, path: List[Cell] = None): + os.system('cls' if os.name == 'nt' else 'clear') + + path_set = set(path) if path else set() + + for y in range(maze.height): + row = "" + for x in range(maze.width): + cell = maze.get_cell(x, y) + + if cell.is_wall: + row += "#" + elif cell.is_start: + row += "S" + elif cell.is_exit: + row += "E" + elif player_pos and cell.x == player_pos.x and cell.y == player_pos.y: + row += "@" + elif cell in path_set: + row += "*" + else: + row += " " + print(row) \ No newline at end of file diff --git a/BrychkinKA/src/ui/move_command.py b/BrychkinKA/src/ui/move_command.py new file mode 100644 index 0000000..1933d47 --- /dev/null +++ b/BrychkinKA/src/ui/move_command.py @@ -0,0 +1,17 @@ +from src.model.cell import Cell +from .command import Command +from .player import Player + +class MoveCommand(Command): + def __init__(self, player: Player, new_cell: Cell): + self.player = player + self.new_cell = new_cell + self.prev_cell = None + + def execute(self): + self.prev_cell = self.player.current_cell + self.player.move_to(self.new_cell) + + def undo(self): + if self.prev_cell: + self.player.move_to(self.prev_cell) \ No newline at end of file diff --git a/BrychkinKA/src/ui/observer.py b/BrychkinKA/src/ui/observer.py new file mode 100644 index 0000000..0a3ee88 --- /dev/null +++ b/BrychkinKA/src/ui/observer.py @@ -0,0 +1,6 @@ +from abc import ABC, abstractmethod + +class Observer(ABC): + @abstractmethod + def update(self, event: str): + pass \ No newline at end of file diff --git a/BrychkinKA/src/ui/player.py b/BrychkinKA/src/ui/player.py new file mode 100644 index 0000000..69af18d --- /dev/null +++ b/BrychkinKA/src/ui/player.py @@ -0,0 +1,8 @@ +from src.model.cell import Cell + +class Player: + def __init__(self, start_cell: Cell): + self.current_cell = start_cell + + def move_to(self, cell: Cell): + self.current_cell = cell \ No newline at end of file