forked from UNN/2026-rff_mp
53 lines
1.8 KiB
Python
53 lines
1.8 KiB
Python
from core.cell import Cell
|
|
from core.maze import Maze
|
|
from builders.maze_builder import MazeBuilder
|
|
|
|
|
|
class TextFileMazeBuilder(MazeBuilder):
|
|
def buildFromFile(self, filename):
|
|
with open(filename, "r", encoding="utf-8") as f:
|
|
lines = [line.rstrip("\n") for line in f]
|
|
|
|
if not lines:
|
|
raise ValueError("Maze file is empty")
|
|
|
|
width = max(len(line) for line in lines)
|
|
height = len(lines)
|
|
|
|
cells = []
|
|
startCell = None
|
|
exitCell = None
|
|
|
|
for y, line in enumerate(lines):
|
|
row = []
|
|
for x in range(width):
|
|
ch = line[x] if x < len(line) else "#"
|
|
|
|
if ch == "#":
|
|
cell = Cell(x, y, isWall=True)
|
|
elif ch == "S":
|
|
if startCell is not None:
|
|
raise ValueError("Multiple start cells found")
|
|
cell = Cell(x, y, isWall=False, isStart=True)
|
|
startCell = cell
|
|
elif ch == "E":
|
|
if exitCell is not None:
|
|
raise ValueError("Multiple exit cells found")
|
|
cell = Cell(x, y, isWall=False, isExit=True)
|
|
exitCell = cell
|
|
elif ch in (" ", "."):
|
|
cell = Cell(x, y, isWall=False)
|
|
elif ch.isdigit():
|
|
cell = Cell(x, y, isWall=False, weight=max(1, int(ch)))
|
|
else:
|
|
raise ValueError(f"Unsupported symbol '{ch}' at ({x}, {y})")
|
|
row.append(cell)
|
|
cells.append(row)
|
|
|
|
if startCell is None:
|
|
raise ValueError("Start cell 'S' not found")
|
|
if exitCell is None:
|
|
raise ValueError("Exit cell 'E' not found")
|
|
|
|
return Maze(cells, width, height, startCell, exitCell)
|