pub fn generate_backtracking( maze: &mut HexMaze, start_pos: Option, seed: Option, ) { if maze.is_empty() { return; } let start = start_pos.unwrap_or(Hex::ZERO); let mut visited = HashSet::new(); let mut rng: Box = seed.map_or_else( || Box::new(thread_rng()) as Box, |seed| Box::new(ChaCha8Rng::seed_from_u64(seed)) as Box, ); recursive_backtrack(maze, start, &mut visited, &mut rng); } fn recursive_backtrack( maze: &mut HexMaze, current: Hex, visited: &mut HashSet, rng: &mut R, ) { visited.insert(current); let mut directions = EdgeDirection::ALL_DIRECTIONS; directions.shuffle(rng); for direction in directions { let neighbor = current + direction; if maze.get_tile(&neighbor).is_some() && !visited.contains(&neighbor) { maze.remove_tile_wall(¤t, direction); maze.remove_tile_wall(&neighbor, direction.const_neg()); recursive_backtrack(maze, neighbor, visited, rng); } } }