from abc import ABC, abstractmethod from model import Maze, Cell class MazeBuilder(ABC): @abstractmethod def buildFromFile(self, filename): pass class TextFileMazeBuilder(MazeBuilder): def buildFromFile(self, filename): with open( filename, "r", encoding="utf-8" ) as file: lines = [ line.rstrip("\n") for line in file ] height = len(lines) width = len(lines[0]) maze = Maze( width, height ) start_count = 0 exit_count = 0 for x, line in enumerate(lines): row = [] for y, symbol in enumerate(line): if symbol == "#": cell = Cell( x, y, is_wall=True ) elif symbol == "S": cell = Cell( x, y, is_start=True ) start_count += 1 elif symbol == "E": cell = Cell( x, y, is_exit=True ) exit_count += 1 elif symbol == " ": cell = Cell( x, y ) else: raise ValueError( f"Неизвестный символ: {symbol}" ) row.append(cell) maze.add_row(row) if start_count != 1: raise ValueError( "Должен быть ровно один старт S" ) if exit_count != 1: raise ValueError( "Должен быть ровно один выход E" ) return maze