implemented generator and updated examples

This commit is contained in:
JOLIMAITRE Matthieu 2022-05-30 02:03:02 +03:00
parent d0c44cdcbe
commit b21dc88b68
4 changed files with 55 additions and 38 deletions

View file

@ -50,7 +50,7 @@ pub mod maze_state {
impl MazeState for Generated {} impl MazeState for Generated {}
impl BuildableMazeState for Generated { impl BuildableMazeState for Generated {
fn get(mut self) -> Maze { fn get(self) -> Maze {
self.generator.generate() self.generator.generate()
} }
} }

View file

@ -12,18 +12,16 @@ pub use depth_first::DepthFirst;
#[test] #[test]
fn depth_first() { fn depth_first() {
use crate::{generate, Executor}; use crate::{Executor, SimpleGenerator};
let algorithm = DepthFirst::new(); let algorithm = DepthFirst::new();
let maze = generate(20, 20); let mut executor = Executor::build(algorithm, |b| b.generated(SimpleGenerator::new(40, 20)));
// let mut executor = Executor::new(maze, algorithm); executor.run();
// executor.run();
} }
#[test] #[test]
fn breath_first() { fn breath_first() {
use crate::{generate, Executor}; use crate::{Executor, SimpleGenerator};
let algorithm = BreathFirst::new(); let algorithm = BreathFirst::new();
let maze = generate(20, 20); let mut executor = Executor::build(algorithm, |b| b.generated(SimpleGenerator::new(40, 20)));
// let mut executor = Executor::new(maze, algorithm); executor.run();
// executor.run();
} }

View file

@ -8,8 +8,26 @@ use rand::{prelude::SliceRandom, thread_rng};
use crate::{Maze, Pos}; 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. /// 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 { pub struct SimpleGenerator {
width: isize,
height: isize,
}
impl SimpleGenerator {
pub fn new(width: isize, height: isize) -> Self {
Self { height, width }
}
}
impl MazeGenerator for SimpleGenerator {
fn generate(&self) -> Maze {
let Self { width, height } = *self;
let mut result = Maze::new( let mut result = Maze::new(
width, width,
height, height,
@ -37,14 +55,12 @@ pub fn generate(width: isize, height: isize) -> Maze {
result result
} }
}
#[test] #[test]
fn generation() { fn generation() {
let maze = generate(20, 20); let generator = SimpleGenerator::new(10, 10);
let maze = generator.generate();
let text = maze.display(None); let text = maze.display(None);
println!("{text}"); println!("{text}");
} }
pub trait MazeGenerator {
fn generate(&mut self) -> Maze;
}

View file

@ -14,5 +14,8 @@ mod position;
pub use algorithm::Algorithm; pub use algorithm::Algorithm;
pub use executor::{Context, Executor, Guess, Insight}; pub use executor::{Context, Executor, Guess, Insight};
pub use labyrinth::{generator::generate, Maze}; pub use labyrinth::{
generator::{MazeGenerator, SimpleGenerator},
Maze,
};
pub use position::Pos; pub use position::Pos;