diff options
Diffstat (limited to '2017-battleships/src/shooting.rs')
-rw-r--r-- | 2017-battleships/src/shooting.rs | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/2017-battleships/src/shooting.rs b/2017-battleships/src/shooting.rs new file mode 100644 index 0000000..e0358ee --- /dev/null +++ b/2017-battleships/src/shooting.rs @@ -0,0 +1,47 @@ +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]) + } +} |