from amazeing.maze_class.maze_network_tracker import MazeNetworkTracker
from amazeing.maze_class.maze_coords import Cardinal, CellCoord
from amazeing.maze_class.maze_dirty_tracker import MazeDirtyTracker
+from amazeing.maze_class.maze_pacman_tracker import MazePacmanTracker
from amazeing.maze_display.TTYdisplay import TileCycle, TileMaps, extract_pairs
from amazeing.maze_display.backend import CloseRequested, IVec2
maze = Maze(dims)
dirty_tracker = MazeDirtyTracker(maze)
-pacman_tracker = MazeDirtyTracker(maze)
+pacman_tracker = MazePacmanTracker(maze)
maze.outline()
from collections.abc import Iterable
from amazeing.maze_class.maze import Maze
from amazeing.maze_class.maze_coords import WallCoord
-from amazeing.utils.randset import Randset
class MazeDirtyTracker:
def __init__(self, maze: Maze) -> None:
self.__maze: Maze = maze
- self.__dirty: Randset[WallCoord] = Randset()
+ self.__dirty: set[WallCoord] = set()
maze.observers.add(self.__observer)
def __repr__(self) -> str:
def __observer(self, wall: WallCoord) -> None:
self.__dirty ^= {wall}
- def clear(self) -> Randset[WallCoord]:
+ def clear(self) -> set[WallCoord]:
res = self.__dirty
- self.__dirty = Randset()
+ self.__dirty = set()
return res
def curr_dirty(self) -> Iterable[WallCoord]:
--- /dev/null
+from collections.abc import Iterable
+from amazeing.maze_class.maze import Maze
+from amazeing.maze_class.maze_coords import WallCoord
+from amazeing.utils.randset import Randset
+
+
+class MazePacmanTracker:
+ def __init__(self, maze: Maze) -> None:
+ self.__maze: Maze = maze
+ self.__dirty: Randset[WallCoord] = Randset()
+ maze.observers.add(self.__observer)
+
+ def __repr__(self) -> str:
+ return f"MazeDirtyTracker({self.__dirty})"
+
+ def __del__(self) -> None:
+ self.__maze.observers.discard(self.__observer)
+
+ def __observer(self, wall: WallCoord) -> None:
+ for cell in wall.neighbour_cells():
+ for e in cell.walls():
+ self.__dirty.add(e)
+
+ def clear(self) -> Randset[WallCoord]:
+ res = self.__dirty
+ self.__dirty = Randset()
+ return res
+
+ def curr_dirty(self) -> Iterable[WallCoord]:
+ return self.__dirty
+
+ def end(self) -> None:
+ self.__maze.observers.discard(self.__observer)
from amazeing import Maze, WallCoord
import random
-from amazeing.maze_class.maze_dirty_tracker import MazeDirtyTracker
+from amazeing.maze_class.maze_pacman_tracker import MazePacmanTracker
def maze_make_pacman(
maze: Maze,
walls_const: set[WallCoord],
- dirty_tracker: MazeDirtyTracker,
+ pacman_tracker: MazePacmanTracker,
callback: Callable[[Maze], None] = lambda _: None,
iterations: int = 10,
) -> None:
for _ in range(0, iterations):
- walls = dirty_tracker.clear()
+ walls = pacman_tracker.clear()
+ random.shuffle(walls)
n = 0
for wall in walls:
if not maze.get_wall(wall) or wall in walls_const:
n = self.rhs
if not isinstance(n, Branch):
return
- m = n.lhs
- if not isinstance(m, Branch):
- return
- a = self.lhs
- b = m.lhs
- c = m.rhs
- d = n.rhs
- n.lhs = a
- n.rhs = b
- m.lhs = c
- m.rhs = d
- self.lhs = n
- self.rhs = m
- a.parent = n
- b.parent = n
- c.parent = m
- d.parent = m
- n.parent = self
- m.parent = self
- n.update_height()
- m.update_height()
- self.update_height()
+ n.rotate_ll()
+ self.rotate_rr()
def rotate_lr(self) -> None:
# Double AVL rotate:
n = self.lhs
if not isinstance(n, Branch):
return
- m = n.rhs
- if not isinstance(m, Branch):
- return
- a = n.lhs
- b = m.lhs
- c = m.rhs
- d = self.rhs
- n.lhs = a
- n.rhs = b
- m.lhs = c
- m.rhs = d
- self.lhs = n
- self.rhs = m
- a.parent = n
- b.parent = n
- c.parent = m
- d.parent = m
- n.parent = self
- m.parent = self
- n.update_height()
- m.update_height()
- self.update_height()
+ n.rotate_rr()
+ self.rotate_ll()
+ n = self.lhs
def append(self, value: T) -> "Leaf[T]":
if isinstance(self.rhs, Branch):
class Randset[T](MutableSequence[T], MutableSet[T]):
- # __getitem__, __setitem__, __delitem__, __len__, and insert().
- # __contains__, __iter__, __len__,
- # add(), and discard().
def __init__(self) -> None:
self.__elems: list[T] = []
self.__idx_map: dict[T, int] = {}
del self.__idx_map[value]
def insert(self, index: int, value: T) -> None:
- raise NotImplementedError("slice setitem in randset")
+ raise NotImplementedError("index insert randset")