From 03ee6d003a8fd03827d6a42937d8ed1c6431fdb9 Mon Sep 17 00:00:00 2001 From: Axy Date: Tue, 10 Feb 2026 15:20:11 +0100 Subject: [PATCH] Callback argument for maze operations --- amazeing/maze_make_pacman.py | 44 +++++++++++++++++++++-------------- amazeing/maze_make_perfect.py | 11 +++++---- 2 files changed, 34 insertions(+), 21 deletions(-) diff --git a/amazeing/maze_make_pacman.py b/amazeing/maze_make_pacman.py index b28c60d..9a343ad 100644 --- a/amazeing/maze_make_pacman.py +++ b/amazeing/maze_make_pacman.py @@ -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() diff --git a/amazeing/maze_make_perfect.py b/amazeing/maze_make_perfect.py index 5aecfb0..282db0d 100644 --- a/amazeing/maze_make_perfect.py +++ b/amazeing/maze_make_perfect.py @@ -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) -- 2.52.0