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 mut shot: Point; while { shot = Point::random(knowledge.map_size); let ref target = knowledge.opponent_map.cells[shot.x as usize][shot.y as usize]; target.shot_attempted() } {} shot } 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] } }