2026-rff_mp/stepushovgs/labyrinth/source/bububu/observer.py

80 lines
2.2 KiB
Python

from abc import ABC, abstractmethod
import os
from source.classes.cell import Cell
class Event:
def __init__(self, event, maze, player_position, path):
self.event = event
self.maze = maze
self.player_position = player_position
self.path = path
class Observer(ABC):
@abstractmethod
def update(self, event: Event):
pass
class ConsoleView(Observer):
def update(self, event: Event):
if event.event == "path_found":
print("Путь найден:")
self.render(
event.maze,
event.player_position,
event.path
)
elif event.event == "move":
self.render(
event.maze,
event.player_position,
event.path
)
elif event.event == "maze_loaded":
print("Загружен лабиринт:")
self.render(
event.maze,
event.player_position,
event.path
)
else:
pass
def render(self, maze, player_position, path):
if path and isinstance(path[0], tuple):
self.render_xy(maze=maze, player_position=player_position, path=path)
return
os.system('cls' if os.name == 'nt' else 'clear')
path_xy = [cell.getXY() for cell in path]
for line in maze.cells:
for c in line:
if c.getXY() == player_position:
print('P', end='')
elif c.getXY() in path_xy:
print('*', end='')
else:
print(c.toStr(), end='')
print()
def render_xy(self, maze, player_position, path: list[tuple[int, int]]):
os.system('cls' if os.name == 'nt' else 'clear')
# path_xy = [cell.getXY() for cell in path]
for line in maze.cells:
for c in line:
if c.getXY() == player_position:
print('P', end='')
elif c.getXY() in path:
print('*', end='')
else:
print(c.toStr(), end='')
print()