2 этап

This commit is contained in:
Dima 2026-05-23 19:39:52 +03:00
parent 03eb347e0d
commit 86f4936e0e

View File

@ -53,4 +53,49 @@ class Maze:
cell = self.get_cell(x, y)
if cell:
cell.is_exit = True
self.exit = cell
self.exit = cell
class MazeBuilder:
"""интерфейс строителя лабиринта"""
def buildFromFile(self, filename):
raise NotImplementedError
class TextFileMazeBuilder(MazeBuilder):
"""загрузка лабиринта из текстового файла"""
def buildFromFile(self, filename):
with open(filename, 'r', encoding='utf-8') as f:
lines = [line.rstrip('\n') for line in f.readlines()]
height = len(lines)
width = max(len(line) for line in lines) if height > 0 else 0
for i in range(height):
if len(lines[i]) < width:
lines[i] = lines[i] + ' ' * (width - len(lines[i]))
maze = Maze(width, height)
start_count = 0
exit_count = 0
for y, line in enumerate(lines):
for x, ch in enumerate(line):
if ch == '#':
maze.get_cell(x, y).is_wall = True
elif ch == 'S':
maze.set_start(x, y)
start_count += 1
elif ch == 'E':
maze.set_exit(x, y)
exit_count += 1
else:
maze.get_cell(x, y).is_wall = False
if start_count != 1 or exit_count != 1:
raise ValueError(f"Ошибка: S={start_count}, E={exit_count} (нужно по одному)")
return maze