microworlds-rs/src/main.rs

72 lines
2.1 KiB
Rust

use clap::{App, Arg};
pub const SCREEN_SIZE_DEFAULT: u32 = 800;
pub const PX_SIZE_DEFAULT: u32 = 2;
pub const STEPS_PER_SEC_DEFAULT: u64 = 8;
fn main() {
let matches = App::new("microworlds")
.version("0.1")
.arg(Arg::with_name("engine")
.long("--engine")
.short("-e")
.help("select the engine to run")
.possible_values(&["life", "simple"])
.takes_value(true)
.required(true))
.arg(Arg::with_name("size")
.long("--size")
.help("dimension of square in number of patches")
.takes_value(true)
.default_value("800"))
.arg(Arg::with_name("pixels")
.long("--pixels")
.takes_value(true)
.help("pixels per patch")
.default_value("2"))
.arg(Arg::with_name("steps")
.long("--steps")
.help("steps per second to max out at")
.takes_value(true)
.default_value("8"))
.get_matches();
let px_size = match matches.value_of("pixels") {
Some(arg) => arg.parse().expect("pixels requires a number"),
None => PX_SIZE_DEFAULT,
};
let num_patches: u32 = match matches.value_of("size") {
Some(arg) => arg.parse().expect("size requires a number"),
None => SCREEN_SIZE_DEFAULT,
};
let steps = match matches.value_of("steps") {
Some(arg) => arg.parse().expect("steps requires a number"),
None => STEPS_PER_SEC_DEFAULT,
};
let size: usize = (num_patches/px_size) as usize;
let engine;
match matches.value_of("engine") {
Some(arg) => match arg {
"life" => engine = microworlds::life::new(size),
_ => {
println!("Invalud engine selected: {}", arg);
return;
}
},
None => {
println!("Engine selection requires");
return;
}
}
let mut observer= microworlds::Observer::new(px_size as i32, num_patches);
println!("cell grid: {}x{} ({} cells) - {} steps per sec", size, size, (size*size), steps);
observer.sim(engine, steps);
}