forked from UNN/2026-rff_mp
67 lines
1.5 KiB
Python
67 lines
1.5 KiB
Python
from builders.maze_builder import MazeBuilder
|
|
from models.cell import Cell
|
|
from models.maze import Maze
|
|
|
|
|
|
class TextFileMazeBuilder(MazeBuilder):
|
|
|
|
def create_cell(self, symbol, x, y):
|
|
|
|
if symbol == "#":
|
|
return Cell(x, y, is_wall=True)
|
|
|
|
if symbol == "S":
|
|
return Cell(x, y, is_start=True)
|
|
|
|
if symbol == "E":
|
|
return Cell(x, y, is_exit=True)
|
|
|
|
if symbol == " ":
|
|
return Cell(x, y)
|
|
|
|
raise ValueError(f"Unknown symbol: {symbol}")
|
|
|
|
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) |