[2] feat - загрузка лабиринта из файла

This commit is contained in:
semyanovra 2026-05-24 14:06:39 +00:00
parent 56ff7f317a
commit 735626045b

View File

@ -13,9 +13,9 @@ class GridCell:
def __init__(self, x, y): def __init__(self, x, y):
self._x = x self._x = x
self._y = y self._y = y
self._blocked = False # стена self._blocked = False
self._entry = False # старт self._entry = False
self._exit_flag = False # выход self._exit_flag = False
@property @property
def x(self): def x(self):
@ -113,4 +113,43 @@ class Labyrinth:
neighbour = self.cell_at(nx, ny) neighbour = self.cell_at(nx, ny)
if neighbour and neighbour.passable(): if neighbour and neighbour.passable():
neighbours.append(neighbour) neighbours.append(neighbour)
return neighbours return neighbours
# ----------------------------- Загрузка лабиринта -----------------------------
class LabyrinthBuilder:
def build_from_file(self, filename):
raise NotImplementedError
class TxtLabyrinthBuilder(LabyrinthBuilder):
def build_from_file(self, filename):
with open(filename, 'r') 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
start_cnt = 0
exit_cnt = 0
lab = Labyrinth(width, height)
for y, line in enumerate(lines):
for x, ch in enumerate(line):
if ch == "#":
lab.configure_cell(x, y, "wall")
elif ch == "S":
lab.configure_cell(x, y, "start")
start_cnt += 1
elif ch == "E":
lab.configure_cell(x, y, "exit")
exit_cnt += 1
else:
lab.configure_cell(x, y, 'path')
if start_cnt != 1 or exit_cnt != 1:
raise ValueError(f"Maze must have exactly one S and one E. Found S={start_cnt}, E={exit_cnt}")
return lab
if __name__ == "__main__":
builder = TxtLabyrinthBuilder()
maze = builder.build_from_file("maze/level1.txt")
print(f"Maze loaded: {maze.width}x{maze.height}")