use rand; use rand::distributions::{IndependentSample, Range}; use actions::*; use math::*; use knowledge::*; use ships::*; pub fn shoot_smartly(knowledge: &Knowledge) -> Action { let (weapon, target) = if knowledge.has_unknown_hits() { destroy_shoot(&knowledge) } else { seek_shoot(&knowledge) }; Action::Shoot(weapon, target) } fn seek_shoot(knowledge: &Knowledge) -> (Weapon, Point) { let (weapon, possibilities) = knowledge.get_best_seek_shots(); if possibilities.is_empty() { println!("All possible shots on the current lattice have been tried!"); (Weapon::SingleShot, 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); (weapon, possibilities[i as usize]) } } fn destroy_shoot(knowledge: &Knowledge) -> (Weapon, 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); (Weapon::SingleShot, possibilities[i as usize]) } }