class Cell: def __init__(self, x, y): self.x = x self.y = y self.is_wall = False self.is_start = False self.is_exit = False def is_passable(self): return not self.is_wall def __repr__(self): return f"Cell({self.x}, {self.y})" class Maze: def __init__(self, width, height): self.width = width self.height = height self.cells = [] self.start = None self.exit = None for y in range(height): row = [] for x in range(width): row.append(Cell(x, y)) self.cells.append(row) def get_cell(self, x, y): if 0 <= x < self.width and 0 <= y < self.height: return self.cells[y][x] return None def get_neighbors(self, cell): neighbors = [] directions = [(0, -1), (0, 1), (-1, 0), (1,0)] for dx, dy in directions: nx, ny = cell.x + dx, cell.y + dy neighbor = self.get_cell(nx, ny) if neighbor and neighbor.is_passable(): neighbors.append(neighbor) return neighbors def __repr__(self): return f"Maze({self.width}x{self.height})" from abc import ABC, abstractmethod class MazeBuilder(ABC): @abstractmethod def build_from_file(self, filename): pass class TextFileMazeBuilder(MazeBuilder): def build_from_file(self, filename): with open(filename, 'r', encoding='utf-8') as f: lines = f.readlines() lines = [line.rstrip('\n\r') for line in lines] height = len(lines) width = len(lines[0]) if height > 0 else 0 for i, line in enumerate(lines): if len(line) != width: raise ValueError(f"Строка {i+1} имеет длину {len(line)}, ожидается {width}") maze = Maze(width, height) start = None exit_cell = None for y, line in enumerate(lines): for x, ch in enumerate(line): cell = maze.get_cell(x, y) if ch == '#': cell.is_wall = True elif ch == ' ': cell.is_wall = False elif ch == 'S': cell.is_wall = False cell.is_start = True start = cell elif ch == 'E': cell.is_wall = False cell.ia_exit = True exit_cell = cell else: cell.is_wall = True if start is None: raise ValueError("В лабиринте не найден старт (S)") if exit_cell is None: raise ValueError("В лабиринте не найден выход (E)") maze.start = start maze.exit = exit_cell return maze #тест if __name__ == "__main__": builder = TextFileMazeBuilder() maze = builder.build_from_file("maze1.txt") print(f"лабиринт загружен: {maze}") print(f"старт: {maze.start}") print(f"выход: {maze.exit}") neighbors = maze.get_neighbors(maze.start) print(f"соседи старта: {neighbors}")