]> Untitled Git - axy/ft/a-maze-ing.git/commitdiff
Callback argument for maze operations
authorAxy <gilliardmarthey.axel@gmail.com>
Tue, 10 Feb 2026 14:20:11 +0000 (15:20 +0100)
committerAxy <gilliardmarthey.axel@gmail.com>
Tue, 10 Feb 2026 14:20:11 +0000 (15:20 +0100)
amazeing/maze_make_pacman.py
amazeing/maze_make_perfect.py

index b28c60d795993939f8a6521449db7f29ae8d1dcf..9a343adfc141e6312f2e8a76fa2703422071eb96 100644 (file)
@@ -1,26 +1,36 @@
+from typing import Any, Callable
 from amazeing import Maze, WallCoord
 import random
 
 
-def maze_make_pacman(maze: Maze, walls_const: set[WallCoord]) -> None:
-    iterations = 10
-    for _ in range(0, iterations):
-        walls = [wall for wall in maze.walls_full() if wall not in walls_const]
-        random.shuffle(walls)
-        for wall in walls:
-            if not maze.wall_cuts_cycle(wall):
-                continue
-            if maze.wall_leaf_neighbours(wall):
-                continue
-            maze._remove_wall(wall)
+def maze_make_pacman(
+    maze: Maze,
+    walls_const: set[WallCoord],
+    callback: Callable[[Maze], None] = lambda _: None,
+    iterations: int = 10,
+) -> None:
+    def walls_full_apply(
+        f: Callable[[WallCoord, list[WallCoord]], Any],
+        len_pred: Callable[[int], bool],
+    ):
         walls = [wall for wall in maze.walls_full() if wall not in walls_const]
         random.shuffle(walls)
         for wall in walls:
-            if not maze.wall_cuts_cycle(wall):
-                continue
             leaf_neighbours = maze.wall_leaf_neighbours(wall)
-            if len(leaf_neighbours) == 0:
-                continue
-            maze._remove_wall(wall)
-            maze.fill_wall(random.choice(leaf_neighbours))
+            if maze.wall_cuts_cycle(wall) and len_pred(len(leaf_neighbours)):
+                f(wall, leaf_neighbours)
+                callback(maze)
+
+    for _ in range(0, iterations):
+        walls_full_apply(
+            lambda wall, _: maze._remove_wall(wall),
+            lambda n: n == 0,
+        )
+        walls_full_apply(
+            lambda wall, leaf_neighbours: (
+                maze._remove_wall(wall),
+                maze.fill_wall(random.choice(leaf_neighbours)),
+            ),
+            lambda n: n != 0,
+        )
     maze._rebuild()
index 5aecfb03b5985f3ddb4b2145d55ce59ec5e9c428..282db0da2c8f99b33cb195eb0134ddf8c8cd4181 100644 (file)
@@ -1,11 +1,14 @@
+from typing import Callable
 from amazeing import Maze
 import random
 
 
-def maze_make_perfect(maze: Maze) -> None:
+def maze_make_perfect(
+    maze: Maze, callback: Callable[[Maze], None] = lambda _: None
+) -> None:
     empty = list(maze.walls_empty())
     random.shuffle(empty)
     for wall in empty:
-        if maze.wall_bisects(wall):
-            continue
-        maze.fill_wall(wall)
+        if not maze.wall_bisects(wall):
+            maze.fill_wall(wall)
+            callback(maze)