]> Untitled Git - axy/ft/a-maze-ing.git/commitdiff
AVL update, TODO: maintain avl node order, not just leaf, and update comments
authorAxy <gilliardmarthey.axel@gmail.com>
Tue, 17 Mar 2026 20:05:25 +0000 (21:05 +0100)
committerAxy <gilliardmarthey.axel@gmail.com>
Tue, 17 Mar 2026 20:05:25 +0000 (21:05 +0100)
__main__.py
amazeing/maze_class/maze_dirty_tracker.py
amazeing/maze_class/maze_pacman_tracker.py [new file with mode: 0644]
amazeing/maze_make_pacman.py
amazeing/utils/avl.py
amazeing/utils/randset.py

index b48929089682237d17242e4a6e306db421879736..d6a8d3fddbde7818e32367ddb28c8c08b1976391 100644 (file)
@@ -13,6 +13,7 @@ from amazeing.config.config_parser import Config
 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
 
@@ -26,7 +27,7 @@ dims = IVec2(config.width, config.height)
 maze = Maze(dims)
 
 dirty_tracker = MazeDirtyTracker(maze)
-pacman_tracker = MazeDirtyTracker(maze)
+pacman_tracker = MazePacmanTracker(maze)
 
 maze.outline()
 
index 7300320aa17c4ee7f89522aa972499ff683348a8..ed8c91a0c17e5ebcb2bdb3cefeffde17c82c6e1c 100644 (file)
@@ -1,13 +1,12 @@
 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:
@@ -19,9 +18,9 @@ class MazeDirtyTracker:
     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]:
diff --git a/amazeing/maze_class/maze_pacman_tracker.py b/amazeing/maze_class/maze_pacman_tracker.py
new file mode 100644 (file)
index 0000000..559f8d0
--- /dev/null
@@ -0,0 +1,33 @@
+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)
index fd754a8d6f946f925349d5994c40fd0b7660672c..408772f17eeaca913b4c27361b9e0f46350bdd8d 100644 (file)
@@ -2,18 +2,19 @@ from typing import Callable
 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:
index 5ce17ffe967cd14c358ae2cc48e5c0e9564f8392..588bfb49b15fe1ff898fee7b0bf39e4eff264e1d 100644 (file)
@@ -273,28 +273,8 @@ class Branch[T](Node[T]):
         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:
@@ -309,28 +289,9 @@ class Branch[T](Node[T]):
         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):
index 62ab2f596fe86294cf7783cd626ba8ff615cb235..6989f380770ed59207941275d531b024434e36f0 100644 (file)
@@ -3,9 +3,6 @@ from typing import cast, overload
 
 
 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] = {}
@@ -72,4 +69,4 @@ class Randset[T](MutableSequence[T], MutableSet[T]):
         del self.__idx_map[value]
 
     def insert(self, index: int, value: T) -> None:
-        raise NotImplementedError("slice setitem in randset")
+        raise NotImplementedError("index insert randset")