From 8c230c900c6d6ffcb23dd608685dbe432058d196 Mon Sep 17 00:00:00 2001 From: Pavel Date: Mon, 18 May 2026 00:40:59 +0300 Subject: [PATCH] builder --- romanovpv/task 2/docs/data/builders.py | 70 ++++++++++++++++++++++++++ romanovpv/task 2/docs/data/main.py | 13 ++++- romanovpv/task 2/docs/data/maze.txt | 5 ++ romanovpv/task 2/docs/data/model.py | 15 +++++- 4 files changed, 101 insertions(+), 2 deletions(-) create mode 100644 romanovpv/task 2/docs/data/builders.py create mode 100644 romanovpv/task 2/docs/data/maze.txt diff --git a/romanovpv/task 2/docs/data/builders.py b/romanovpv/task 2/docs/data/builders.py new file mode 100644 index 0000000..157d7e8 --- /dev/null +++ b/romanovpv/task 2/docs/data/builders.py @@ -0,0 +1,70 @@ +from abc import ABC, abstractmethod +from model import Maze, Cell + +class MazeBuilder(ABC): + @abstractmethod + def buildFromFile(self, filename): + pass + +class TextFileMazeBuilder(MazeBuilder): + def buildFromFile(self, filename): + with open( + filename, + "r", + encoding="utf-8" + ) as file: + lines = [ + line.rstrip("\n") + for line in file + ] + height = len(lines) + width = len(lines[0]) + maze = Maze( + width, + height + ) + start_count = 0 + exit_count = 0 + for x, line in enumerate(lines): + row = [] + for y, symbol in enumerate(line): + if symbol == "#": + cell = Cell( + x, + y, + is_wall=True + ) + elif symbol == "S": + cell = Cell( + x, + y, + is_start=True + ) + start_count += 1 + elif symbol == "E": + cell = Cell( + x, + y, + is_exit=True + ) + exit_count += 1 + elif symbol == " ": + cell = Cell( + x, + y + ) + else: + raise ValueError( + f"Неизвестный символ: {symbol}" + ) + row.append(cell) + maze.add_row(row) + if start_count != 1: + raise ValueError( + "Должен быть ровно один старт S" + ) + if exit_count != 1: + raise ValueError( + "Должен быть ровно один выход E" + ) + return maze \ No newline at end of file diff --git a/romanovpv/task 2/docs/data/main.py b/romanovpv/task 2/docs/data/main.py index 811c29f..fca2567 100644 --- a/romanovpv/task 2/docs/data/main.py +++ b/romanovpv/task 2/docs/data/main.py @@ -1 +1,12 @@ -import model.py \ No newline at end of file +import model +from builders import (TextFileMazeBuilder) + +builder = TextFileMazeBuilder() +maze = builder.buildFromFile("maze.txt") +maze.printMaze() +print() +print("Старт:") +print(maze.start) +print() +print("Выход:") +print(maze.exit) \ No newline at end of file diff --git a/romanovpv/task 2/docs/data/maze.txt b/romanovpv/task 2/docs/data/maze.txt new file mode 100644 index 0000000..14998ce --- /dev/null +++ b/romanovpv/task 2/docs/data/maze.txt @@ -0,0 +1,5 @@ +########## +#S # # +# ### # +# ##E # +########## \ No newline at end of file diff --git a/romanovpv/task 2/docs/data/model.py b/romanovpv/task 2/docs/data/model.py index a424c2e..273455c 100644 --- a/romanovpv/task 2/docs/data/model.py +++ b/romanovpv/task 2/docs/data/model.py @@ -73,4 +73,17 @@ class Maze: and neighbor.isPassable() ): neighbors.append(neighbor) - return neighbors \ No newline at end of file + return neighbors + def printMaze(self): + for row in self.cells: + line = "" + for cell in row: + if cell.isStart: + line += "S" + elif cell.isExit: + line += "E" + elif cell.isWall: + line += "#" + else: + line += " " + print(line) \ No newline at end of file