2026-rff_mp/romanovpv/task 2/docs/data/builders.py

41 lines
1.4 KiB
Python
Raw Normal View History

2026-05-17 21:40:59 +00:00
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):
2026-05-24 19:18:38 +00:00
with open(filename, "r", encoding="utf-8") as file:
lines = [line.rstrip("\n")
2026-05-17 21:40:59 +00:00
for line in file
]
height = len(lines)
width = len(lines[0])
2026-05-24 19:18:38 +00:00
maze = Maze(width, height)
2026-05-17 21:40:59 +00:00
start_count = 0
exit_count = 0
for x, line in enumerate(lines):
row = []
for y, symbol in enumerate(line):
if symbol == "#":
2026-05-24 19:18:38 +00:00
cell = Cell(x, y, is_wall=True)
2026-05-17 21:40:59 +00:00
elif symbol == "S":
2026-05-24 19:18:38 +00:00
cell = Cell(x, y, is_start=True)
2026-05-17 21:40:59 +00:00
start_count += 1
elif symbol == "E":
2026-05-24 19:18:38 +00:00
cell = Cell(x, y, is_exit=True)
2026-05-17 21:40:59 +00:00
exit_count += 1
elif symbol == " ":
2026-05-24 19:18:38 +00:00
cell = Cell(x, y)
2026-05-17 21:40:59 +00:00
else:
2026-05-24 19:18:38 +00:00
raise ValueError(f"Неизвестный символ: {symbol}")
2026-05-17 21:40:59 +00:00
row.append(cell)
maze.add_row(row)
if start_count != 1:
2026-05-24 19:18:38 +00:00
raise ValueError("Должен быть ровно один старт S")
2026-05-17 21:40:59 +00:00
if exit_count != 1:
2026-05-24 19:18:38 +00:00
raise ValueError("Должен быть ровно один выход E")
2026-05-17 21:40:59 +00:00
return maze