use rand; use rand::distributions::{IndependentSample, Range}; use actions::*; use math::*; use knowledge::*; pub fn shoot_smartly(knowledge: &Knowledge) -> Action { let shot = if knowledge.has_unknown_hits() { destroy_shoot(&knowledge) } else { seek_shoot(&knowledge) }; Action::Shoot(shot) } fn seek_shoot(knowledge: &Knowledge) -> Point { let possibilities = knowledge.get_most_possibility_shots_on_lattice(); if possibilities.is_empty() { println!("All possible shots on the current lattice have been tried!"); Point::new(0,0) } else { let mut rng = rand::thread_rng(); let between = Range::new(0, possibilities.len()); let i = between.ind_sample(&mut rng); possibilities[i as usize] } } fn destroy_shoot(knowledge: &Knowledge) -> Point { let possibilities = knowledge.get_best_adjacent_shots(); if possibilities.is_empty() { seek_shoot(&knowledge) } else { let mut rng = rand::thread_rng(); let between = Range::new(0, possibilities.len()); let i = between.ind_sample(&mut rng); possibilities[i as usize] } }