diff --git a/src/executor/builder.rs b/src/executor/builder.rs index 4a55396..2be41d3 100644 --- a/src/executor/builder.rs +++ b/src/executor/builder.rs @@ -50,7 +50,7 @@ pub mod maze_state { impl MazeState for Generated {} impl BuildableMazeState for Generated { - fn get(mut self) -> Maze { + fn get(self) -> Maze { self.generator.generate() } } diff --git a/src/implementations.rs b/src/implementations.rs index 54fbc40..1c906a5 100644 --- a/src/implementations.rs +++ b/src/implementations.rs @@ -12,18 +12,16 @@ pub use depth_first::DepthFirst; #[test] fn depth_first() { - use crate::{generate, Executor}; + use crate::{Executor, SimpleGenerator}; let algorithm = DepthFirst::new(); - let maze = generate(20, 20); - // let mut executor = Executor::new(maze, algorithm); - // executor.run(); + let mut executor = Executor::build(algorithm, |b| b.generated(SimpleGenerator::new(40, 20))); + executor.run(); } #[test] fn breath_first() { - use crate::{generate, Executor}; + use crate::{Executor, SimpleGenerator}; let algorithm = BreathFirst::new(); - let maze = generate(20, 20); - // let mut executor = Executor::new(maze, algorithm); - // executor.run(); + let mut executor = Executor::build(algorithm, |b| b.generated(SimpleGenerator::new(40, 20))); + executor.run(); } diff --git a/src/labyrinth/generator.rs b/src/labyrinth/generator.rs index 81e76be..e540666 100644 --- a/src/labyrinth/generator.rs +++ b/src/labyrinth/generator.rs @@ -8,43 +8,59 @@ use rand::{prelude::SliceRandom, thread_rng}; use crate::{Maze, Pos}; +/// Trait encapsulating the behavior of a type capable to create mazes. +pub trait MazeGenerator { + fn generate(&self) -> Maze; +} + /// Most common maze generation technique, recursively creating paths to unvisited cells, each time choosing next direction at random. -pub fn generate(width: isize, height: isize) -> Maze { - let mut result = Maze::new( - width, - height, - Pos::zero(), - (width - 1, height - 1).into(), - Vec::new(), - ); +pub struct SimpleGenerator { + width: isize, + height: isize, +} - fn recursive(current: Pos, result: &mut Maze, visited: &mut HashSet) { - visited.insert(current); - let mut adjascent_positions = result.adjascent(current); - adjascent_positions.shuffle(&mut thread_rng()); - for neighbor in adjascent_positions { - if visited.contains(&neighbor) { - continue; - } - result.create_path(current, neighbor); - recursive(neighbor, result, visited); - } +impl SimpleGenerator { + pub fn new(width: isize, height: isize) -> Self { + Self { height, width } } +} - let mut visited = HashSet::new(); - let current = Pos::zero(); - recursive(current, &mut result, &mut visited); +impl MazeGenerator for SimpleGenerator { + fn generate(&self) -> Maze { + let Self { width, height } = *self; + let mut result = Maze::new( + width, + height, + Pos::zero(), + (width - 1, height - 1).into(), + Vec::new(), + ); - result + fn recursive(current: Pos, result: &mut Maze, visited: &mut HashSet) { + visited.insert(current); + let mut adjascent_positions = result.adjascent(current); + adjascent_positions.shuffle(&mut thread_rng()); + for neighbor in adjascent_positions { + if visited.contains(&neighbor) { + continue; + } + result.create_path(current, neighbor); + recursive(neighbor, result, visited); + } + } + + let mut visited = HashSet::new(); + let current = Pos::zero(); + recursive(current, &mut result, &mut visited); + + result + } } #[test] fn generation() { - let maze = generate(20, 20); + let generator = SimpleGenerator::new(10, 10); + let maze = generator.generate(); let text = maze.display(None); println!("{text}"); } - -pub trait MazeGenerator { - fn generate(&mut self) -> Maze; -} diff --git a/src/lib.rs b/src/lib.rs index ad82e27..8d0d348 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -14,5 +14,8 @@ mod position; pub use algorithm::Algorithm; pub use executor::{Context, Executor, Guess, Insight}; -pub use labyrinth::{generator::generate, Maze}; +pub use labyrinth::{ + generator::{MazeGenerator, SimpleGenerator}, + Maze, +}; pub use position::Pos;