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)