From 9cd3c9caf5cab26969874450d9116ff9e3b78cea Mon Sep 17 00:00:00 2001 From: BoriskovaDV Date: Sun, 24 May 2026 20:01:11 +0000 Subject: [PATCH] [2] add main.py --- BoriskovaDV/docs/data/2-nd-exercise/main.py | 105 ++++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 BoriskovaDV/docs/data/2-nd-exercise/main.py diff --git a/BoriskovaDV/docs/data/2-nd-exercise/main.py b/BoriskovaDV/docs/data/2-nd-exercise/main.py new file mode 100644 index 0000000..58f1b3a --- /dev/null +++ b/BoriskovaDV/docs/data/2-nd-exercise/main.py @@ -0,0 +1,105 @@ +import sys +import os + +class GridPoint: + def __init__(self, x, y): + self.x = x + self.y = y + self.blocked = False + self.is_start = False + self.is_exit = False + + def can_step(self): + return not self.blocked + +class Labyrinth: + def __init__(self, w, h): + self.w = w + self.h = h + self.grid = [[GridPoint(x, y) for x in range(w)] for y in range(h)] + self.start_point = None + self.exit_point = None + + def get_point(self, x, y): + if 0 <= x < self.w and 0 <= y < self.h: + return self.grid[y][x] + return None + + def set_point(self, x, y, typ): + p = self.get_point(x, y) + if not p: + return + if typ == 'wall': + p.blocked = True + elif typ == 'start': + if self.start_point: + self.start_point.is_start = False + p.is_start = True + p.blocked = False + self.start_point = p + elif typ == 'exit': + if self.exit_point: + self.exit_point.is_exit = False + p.is_exit = True + p.blocked = False + self.exit_point = p + elif typ == 'path': + p.blocked = False + +class MazeLoader: + def load(self, filename): + raise NotImplementedError + +class TextMazeLoader(MazeLoader): + def load(self, filename): + with open(filename, 'r') 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_point(x, y, 'wall') + elif ch == 'S': + lab.set_point(x, y, 'start') + start_cnt += 1 + elif ch == 'E': + lab.set_point(x, y, 'exit') + exit_cnt += 1 + else: + lab.set_point(x, y, 'path') + if start_cnt != 1 or exit_cnt != 1: + raise ValueError(f"Need exactly one S and one E. Found S={start_cnt}, E={exit_cnt}") + return lab + +class TextView: + def display(self, lab): + os.system('cls' if os.name == 'nt' else 'clear') + print("=" * (lab.w * 2 + 4)) + print(" LABYRINTH") + print("=" * (lab.w * 2 + 4)) + for y in range(lab.h): + print(" ", end='') + for x in range(lab.w): + p = lab.get_point(x, y) + if p == lab.start_point: + print('S', end=' ') + elif p == lab.exit_point: + print('E', end=' ') + elif p.blocked: + print('#', end=' ') + else: + print('.', end=' ') + print() + print("=" * (lab.w * 2 + 4)) + print(" S - start E - exit # - wall . - path") + +if __name__ == "__main__": + loader = TextMazeLoader() + lab = loader.load("maze/maze1.txt") + view = TextView() + view.display(lab) \ No newline at end of file