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)