2026-rff_mp/kuznetsovTD/tusk 2/builders/text_file_maze_builder.py
2026-05-25 13:06:15 +03:00

52 lines
1.5 KiB
Python

from builders.maze_builder import MazeBuilder
from models.cell import Cell
from models.maze import Maze
class TextFileMazeBuilder(MazeBuilder):
SYMBOL_MAP = {
"#": {"is_wall": True},
"S": {"is_start": True},
"E": {"is_exit": True},
" ": {},
}
def create_cell(self, symbol, x, y):
props = self.SYMBOL_MAP.get(symbol)
if props is None:
raise ValueError(f"Unknown symbol: {symbol}")
return Cell(x, y, **props)
def build_from_file(self, filename):
with open(filename, "r", encoding="utf-8") as file:
rows = [line.rstrip("\n") for line in file]
if not rows:
raise ValueError("File is empty")
width = len(rows[0])
for row in rows:
if len(row) != width:
raise ValueError("Maze rows must have same length")
cells = []
start_cell = None
exit_cell = None
for y, row in enumerate(rows):
current_row = []
for x, symbol in enumerate(row):
cell = self.create_cell(symbol, x, y)
if cell.is_start:
start_cell = cell
if cell.is_exit:
exit_cell = cell
current_row.append(cell)
cells.append(current_row)
if start_cell is None:
raise ValueError("Start not found")
if exit_cell is None:
raise ValueError("Exit not found")
return Maze(cells, start_cell, exit_cell)