diff --git a/src/main.rs b/src/main.rs index 68460dc..843f0bd 100644 --- a/src/main.rs +++ b/src/main.rs @@ -59,18 +59,15 @@ fn create_hash_map(pool: &Vec, hash: &mut HashMap String { +fn gen_world(pool: &mut Vec) -> Result { + let w = world::random_world(); let mut rng = rand::thread_rng(); - let n = rng.gen_range(5, 10); - let mut instructions = String::with_capacity(n); - const CHARSET: &[u8] = b"LRF"; - for _ in 0..n { - let l = rng.gen_range(0, CHARSET.len()); - instructions.push(CHARSET[l] as char); + let x = rng.gen_range(2, 10); + for i in 0..=x { + let r = robot::Robot::new_random(i + 1, w.x - 2, w.y - 2)?; + pool.push(r); } - - instructions + Ok(w) } /// Parse the config file, generate the world and robot pool. @@ -207,15 +204,27 @@ fn main() -> Result<(), Box> { .takes_value(false) .help("Generate random world"), ) + .arg( + Arg::with_name("random") + .short("r") + .long("random") + .takes_value(false) + .help("Generate random world"), + ) .get_matches(); - let raw_conf = open_file(matches.value_of("file").unwrap_or("two_robots.txt"))?; - let mut robot_pool: Vec = Vec::new(); - let mut world: world::World = parse_config(raw_conf, &mut robot_pool)?; - world = match matches.is_present("random-world") { - false => world, - true => world::random_world(), + let world = match matches.is_present("random") { + true => gen_world(&mut robot_pool)?, + false => { + let raw_conf = open_file(matches.value_of("file").unwrap_or("two_robots.txt"))?; + let mut world: world::World = parse_config(raw_conf, &mut robot_pool)?; + world = match matches.is_present("random-world") { + false => world, + true => world::random_world(), + }; + world + } }; let mut hash: HashMap = HashMap::new(); diff --git a/src/robot.rs b/src/robot.rs index 79c9877..d8c37e2 100644 --- a/src/robot.rs +++ b/src/robot.rs @@ -17,6 +17,21 @@ impl Robot { pub fn new(id: u32, o: Orientation, p: Position, i: Vec) -> Robot { Robot { id, o, p, i } } + /// Create new random `Robot`. + pub fn new_random(id: u32, posx_max: i32, posy_max: i32) -> Result { + let mut rng = rand::thread_rng(); + let x = rng.gen_range(2, posx_max); + let y = rng.gen_range(2, posy_max); + let inst = gen_random_instructions(); + let instructions: Vec = instructions_from_string(inst)?; + let o: Orientation = rand::random(); + Ok(Robot { + id, + o, + p: Position { x, y }, + i: instructions, + }) + } /// Apply given instruction to a `Robot`. pub fn execute_instruction(&mut self) { match self.i.pop() { @@ -100,17 +115,18 @@ pub struct Position { pub y: i32, } -/// Check if instructions list is valid. -pub fn is_instructions(s: &str) -> bool { - for c in s.chars() { - match c { - 'F' => continue, - 'R' => continue, - 'L' => continue, - _ => return false, - } +/// Generate random instructions. +fn gen_random_instructions() -> String { + let mut rng = rand::thread_rng(); + let n = rng.gen_range(5, 10); + let mut instructions = String::with_capacity(n); + const CHARSET: &[u8] = b"LRF"; + for _ in 0..n { + let l = rng.gen_range(0, CHARSET.len()); + instructions.push(CHARSET[l] as char); } - true + + instructions } /// Check if a robot is piouff.