From 9696f6c5f1d2bda871f1301cc620ae3705c2ed0c Mon Sep 17 00:00:00 2001 From: komissarovgo Date: Sun, 17 May 2026 13:38:32 +0300 Subject: [PATCH] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=20=D0=BA=D0=BE=D0=B4=20builders?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- komissarovgo/docs2/data2/maze_lab/builders.py | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 komissarovgo/docs2/data2/maze_lab/builders.py diff --git a/komissarovgo/docs2/data2/maze_lab/builders.py b/komissarovgo/docs2/data2/maze_lab/builders.py new file mode 100644 index 0000000..2724eae --- /dev/null +++ b/komissarovgo/docs2/data2/maze_lab/builders.py @@ -0,0 +1,59 @@ +from abc import ABC, abstractmethod +from typing import List +from models import Cell, Maze + + +class MazeBuilder(ABC): + + + @abstractmethod + def build_from_file(self, filename: str) -> Maze: + pass + + +class TextFileMazeBuilder(MazeBuilder): + + + def build_from_file(self, filename: str) -> Maze: + with open(filename, 'r', encoding='utf-8') as file: + lines = [line.rstrip('\n') for line in file.readlines()] + + if not lines: + raise ValueError("Файл пуст") + + height = len(lines) + width = max(len(line) for line in lines) + + maze = Maze(width, height) + cells = [] + + for y, line in enumerate(lines): + row = [] + for x in range(width): + if x < len(line): + char = line[x] + else: + char = ' ' + + cell = Cell(x, y) + + if char == '#': + cell.is_wall = True + elif char == 'S': + cell.is_start = True + elif char == 'E': + cell.is_exit = True + else: + cell.is_wall = False + + row.append(cell) + cells.append(row) + + maze.set_cells(cells) + + if maze.start is None: + raise ValueError("Нет стартовой клетки (S)") + if maze.exit is None: + raise ValueError("Нет выходной клетки (E)") + + return maze \ No newline at end of file