2 этап
This commit is contained in:
parent
03eb347e0d
commit
86f4936e0e
|
|
@ -53,4 +53,49 @@ class Maze:
|
||||||
cell = self.get_cell(x, y)
|
cell = self.get_cell(x, y)
|
||||||
if cell:
|
if cell:
|
||||||
cell.is_exit = True
|
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