From a866bde485c7d8bc82820f2def70af7b6c70a066 Mon Sep 17 00:00:00 2001 From: Justin Wernick Date: Tue, 19 Apr 2022 21:25:36 +0200 Subject: Refile for merging repos --- 2017-battleships/src/shooting.rs | 47 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 2017-battleships/src/shooting.rs (limited to '2017-battleships/src/shooting.rs') 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]) + } +} -- cgit v1.2.3