from typing import List, Tuple from buildersMaze_builder import MazeBuilder from modelsMaze import Maze from modelsCell import Cell class TextFieldMazeBuilder(MazeBuilder): """Загрузчик лабиринта из текстового файла.""" # Символы в файле WALL_CHAR = '#' PASS_CHAR = ' ' START_CHAR = 'S' EXIT_CHAR = 'E' def build_from_file(self, filename: str) -> Maze: """Загрузить лабиринт из текстового файла.""" with open(filename, 'r', encoding='utf-8') as f: lines = [line.rstrip('\n') for line in f.readlines()] if not lines: raise ValueError("Файл пуст") height = len(lines) width = max(len(line) for line in lines) maze = Maze(width, height) start_cell = None exit_cell = None for y, line in enumerate(lines): for x, ch in enumerate(line): if x >= width: continue is_wall = (ch == self.WALL_CHAR) is_start = (ch == self.START_CHAR) is_exit = (ch == self.EXIT_CHAR) # Пробел или буква - проходимая клетка if ch == self.PASS_CHAR or is_start or is_exit: is_wall = False cell = Cell(x=x, y=y, is_wall=is_wall, is_start=is_start, is_exit=is_exit) maze.set_cell(x, y, cell) if is_start: start_cell = cell if is_exit: exit_cell = cell # Валидация if start_cell is None: raise ValueError("В лабиринте нет стартовой клетки (S)") if exit_cell is None: raise ValueError("В лабиринте нет выходной клетки (E)") maze.start_cell = start_cell maze.exit_cell = exit_cell return maze