diff options
Diffstat (limited to 'src/knowledge.rs')
-rw-r--r-- | src/knowledge.rs | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/src/knowledge.rs b/src/knowledge.rs index f271dbe..44693e5 100644 --- a/src/knowledge.rs +++ b/src/knowledge.rs @@ -114,7 +114,7 @@ impl Knowledge { fn to_hits_and_misses(points: Vec<Option<Point>>, state: &State) -> (Vec<Point>, Vec<Point>, Vec<Point>) { let points = points.iter().filter_map(|&p| p).collect::<Vec<_>>(); - let hits = points.iter().filter(|p| !state.opponent_map.cells[p.x as usize][p.y as usize].damaged).cloned().collect(); + let hits = points.iter().filter(|p| state.opponent_map.cells[p.x as usize][p.y as usize].damaged).cloned().collect(); let misses = points.iter().filter(|p| state.opponent_map.cells[p.x as usize][p.y as usize].missed).cloned().collect(); let unknown = points.iter().filter(|p| !state.opponent_map.cells[p.x as usize][p.y as usize].missed && !state.opponent_map.cells[p.x as usize][p.y as usize].damaged).cloned().collect(); @@ -297,9 +297,11 @@ impl OpponentMapKnowledge { if knowledge.possible_placements.len() == 1 { let ref true_placement = knowledge.possible_placements[0]; for p in true_placement.points_on_ship() { - self.cells[p.x as usize][p.y as usize].known_ship = Some(true_placement.ship); + if self.cells[p.x as usize][p.y as usize].known_ship == None { + self.cells[p.x as usize][p.y as usize].known_ship = Some(true_placement.ship); + any_changes = true; + } } - any_changes = true; } } any_changes @@ -323,7 +325,7 @@ impl OpponentMapKnowledge { let cells_copy = self.cells.clone(); for knowledge in self.ships.values_mut() { - knowledge.possible_placements.retain(|x| sunk_ships.contains(&x.ship) && x.touches_any_point(&must_touch_any) && x.all_are_hits(&cells_copy)); + knowledge.possible_placements.retain(|x| !sunk_ships.contains(&x.ship) || (x.touches_any_point(&must_touch_any) && x.all_are_hits(&cells_copy))); } } |