From 4e1fab741f5c2e1b06d42f0030ad1953a2aeb20b Mon Sep 17 00:00:00 2001 From: lukovnikovde Date: Sun, 24 May 2026 22:25:57 +0000 Subject: [PATCH] [2] starting lab 2 --- lukovnikovde/docs/data/2-nd-exercise/main.py | 117 +++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100644 lukovnikovde/docs/data/2-nd-exercise/main.py diff --git a/lukovnikovde/docs/data/2-nd-exercise/main.py b/lukovnikovde/docs/data/2-nd-exercise/main.py new file mode 100644 index 0000000..478d1f3 --- /dev/null +++ b/lukovnikovde/docs/data/2-nd-exercise/main.py @@ -0,0 +1,117 @@ +import sys +import os + +class Tile: + """Клетка лабиринта.""" + def __init__(self, x, y): + self.x = x + self.y = y + self.wall = False + self.start = False + self.exit = False + + def passable(self): + return not self.wall + + +class Labyrinth: + """Модель лабиринта.""" + def __init__(self, width, height): + self.width = width + self.height = height + self._tiles = [[Tile(x, y) for x in range(width)] for y in range(height)] + self.start_tile = None + self.exit_tile = None + + def get_tile(self, x, y): + if 0 <= x < self.width and 0 <= y < self.height: + return self._tiles[y][x] + return None + + def set_tile(self, x, y, kind): + tile = self.get_tile(x, y) + if tile is None: + return + if kind == 'wall': + tile.wall = True + elif kind == 'start': + if self.start_tile: + self.start_tile.start = False + tile.start = True + tile.wall = False + self.start_tile = tile + elif kind == 'exit': + if self.exit_tile: + self.exit_tile.exit = False + tile.exit = True + tile.wall = False + self.exit_tile = tile + elif kind == 'path': + tile.wall = False + + def neighbours(self, tile): + dirs = [(0, -1), (0, 1), (-1, 0), (1, 0)] + result = [] + for dx, dy in dirs: + nx, ny = tile.x + dx, tile.y + dy + nb = self.get_tile(nx, ny) + if nb and nb.passable(): + result.append(nb) + return result + + +class LabyrinthLoader: + def load(self, filename): + raise NotImplementedError + + +class TextLabyrinthLoader(LabyrinthLoader): + def load(self, filename): + with open(filename, 'r', encoding='utf-8') as f: + lines = [line.rstrip('\n') for line in f] + h = len(lines) + w = max(len(line) for line in lines) if h > 0 else 0 + start_cnt = 0 + exit_cnt = 0 + lab = Labyrinth(w, h) + + for y, line in enumerate(lines): + for x, ch in enumerate(line): + if ch == '#': + lab.set_tile(x, y, 'wall') + elif ch == 'S': + lab.set_tile(x, y, 'start') + start_cnt += 1 + elif ch == 'E': + lab.set_tile(x, y, 'exit') + exit_cnt += 1 + else: + lab.set_tile(x, y, 'path') + if start_cnt != 1 or exit_cnt != 1: + raise ValueError(f"Нужны ровно S и E, найдено S={start_cnt}, E={exit_cnt}") + return lab + + +if __name__ == "__main__": + # Простая проверка загрузки и вывода лабиринта + loader = TextLabyrinthLoader() + lab = loader.load("maze/maze1.txt") # временно создадим позже + + os.system('cls' if os.name == 'nt' else 'clear') + print("=" * (lab.width * 2 + 4)) + print(" ЛАБИРИНТ (загружен)") + print("=" * (lab.width * 2 + 4)) + for y in range(lab.height): + print(" ", end='') + for x in range(lab.width): + t = lab.get_tile(x, y) + if t == lab.start_tile: + print('S', end=' ') + elif t == lab.exit_tile: + print('E', end=' ') + elif t.wall: + print('#', end=' ') + else: + print('.', end=' ') + print() + print("=" * (lab.width * 2 + 4)) \ No newline at end of file