summaryrefslogtreecommitdiff
path: root/src/game.rs
diff options
context:
space:
mode:
authorJustin Worthe <justin@worthe-it.co.za>2019-05-12 00:58:14 +0200
committerJustin Worthe <justin@worthe-it.co.za>2019-05-12 00:58:14 +0200
commit3d1676842e20c90bb5599daa2caefdea2bbf9fe8 (patch)
treec5c45ef35064fad01ed690be8555273224765e67 /src/game.rs
parentebe7d5cd5cc42d8f3f02ca926f4b920ada03765f (diff)
Outline of MCTS
Diffstat (limited to 'src/game.rs')
-rw-r--r--src/game.rs35
1 files changed, 33 insertions, 2 deletions
diff --git a/src/game.rs b/src/game.rs
index be2dcce..b6a051f 100644
--- a/src/game.rs
+++ b/src/game.rs
@@ -10,6 +10,7 @@ pub struct GameBoard {
pub players: [Player; 2],
pub powerups: ArrayVec<[Powerup; 2]>,
pub map: Map,
+ pub outcome: SimulationOutcome
}
#[derive(Debug, PartialEq, Eq, Clone)]
@@ -85,7 +86,8 @@ impl GameBoard {
powerups: json.map.iter().flatten().filter_map(|c| {
c.powerup.clone().map(|p| Powerup::Health(Point2d::new(c.x, c.y), p.value))
}).collect(),
- map
+ map,
+ outcome: SimulationOutcome::Continue
}
}
@@ -201,12 +203,41 @@ impl GameBoard {
player.active_worm = (player.active_worm + 1) % player.worms.len();
}
- match (self.players[0].worms.len(), self.players[1].worms.len()) {
+ self.outcome = match (self.players[0].worms.len(), self.players[1].worms.len()) {
(0, 0) => SimulationOutcome::Draw,
(_, 0) => SimulationOutcome::PlayerWon(0),
(0, _) => SimulationOutcome::PlayerWon(1),
_ => SimulationOutcome::Continue
+ };
+
+ self.outcome
+ }
+
+ pub fn find_target(&self, center: Point2d<i8>, dir: Direction, weapon_range: u8) -> Option<&Worm> {
+ let diff = dir.as_vec();
+
+ let range = if dir.is_diagonal() {
+ ((weapon_range as f32 + 1.) / 2f32.sqrt()).floor() as i8
+ } else {
+ weapon_range as i8
+ };
+
+ let mut target_worm: Option<&Worm> = None;
+ for distance in 1..=range {
+ let target = center + diff * distance;
+ match self.map.at(target) {
+ Some(false) => {
+ target_worm = self.players.iter()
+ .flat_map(|p| p.worms.iter())
+ .find(|w| w.position == target);
+ if target_worm.is_some() {
+ break;
+ }
+ },
+ _ => break
+ }
}
+ target_worm
}
}