46 lines
1.5 KiB
Python
46 lines
1.5 KiB
Python
|
|
from model import Cell, Maze
|
|||
|
|
|
|||
|
|
class MazeBuilder:
|
|||
|
|
def buildFromFile(self, filename: str) -> Maze:
|
|||
|
|
raise NotImplementedError
|
|||
|
|
|
|||
|
|
|
|||
|
|
class TextFileMazeBuilder(MazeBuilder):
|
|||
|
|
def buildFromFile(self, filename: str) -> Maze:
|
|||
|
|
with open(filename, "r", encoding="utf-8") as f:
|
|||
|
|
raw_lines = [line.rstrip("\n") for line in f if line.strip("\n") != ""]
|
|||
|
|
|
|||
|
|
width = max(len(line) for line in raw_lines)
|
|||
|
|
grid = []
|
|||
|
|
|
|||
|
|
start_count = 0
|
|||
|
|
exit_count = 0
|
|||
|
|
|
|||
|
|
for y, line in enumerate(raw_lines):
|
|||
|
|
row = []
|
|||
|
|
padded = line.ljust(width)
|
|||
|
|
for x, ch in enumerate(padded):
|
|||
|
|
if ch == "#":
|
|||
|
|
row.append(Cell(x, y, isWall=True))
|
|||
|
|
elif ch == "S":
|
|||
|
|
row.append(Cell(x, y, isStart=True))
|
|||
|
|
start_count += 1
|
|||
|
|
elif ch == "E":
|
|||
|
|
row.append(Cell(x, y, isExit=True))
|
|||
|
|
exit_count += 1
|
|||
|
|
elif ch == "1":
|
|||
|
|
row.append(Cell(x, y, weight=1))
|
|||
|
|
elif ch == "2":
|
|||
|
|
row.append(Cell(x, y, weight=2))
|
|||
|
|
elif ch == "3":
|
|||
|
|
row.append(Cell(x, y, weight=3))
|
|||
|
|
else:
|
|||
|
|
row.append(Cell(x, y))
|
|||
|
|
grid.append(row)
|
|||
|
|
|
|||
|
|
maze = Maze(grid)
|
|||
|
|
|
|||
|
|
if start_count != 1 or exit_count != 1:
|
|||
|
|
raise ValueError("В лабиринте должен быть ровно один S и один E")
|
|||
|
|
|
|||
|
|
return maze
|