summaryrefslogtreecommitdiff
path: root/2017-battleships/src/shooting.rs
diff options
context:
space:
mode:
Diffstat (limited to '2017-battleships/src/shooting.rs')
-rw-r--r--2017-battleships/src/shooting.rs47
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])
+ }
+}