forked from UNN/2026-rff_mp
2 этап
This commit is contained in:
parent
03eb347e0d
commit
86f4936e0e
|
|
@ -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
|
||||
Loading…
Reference in New Issue
Block a user