From 886d7f75bca7078799074f0b4e7b80c6f8081f5f Mon Sep 17 00:00:00 2001 From: Justin Worthe Date: Sat, 29 Jun 2019 10:52:18 +0200 Subject: Put score allocation behind constants --- src/constants.rs | 7 +++++++ src/game.rs | 32 ++++++++++++++++------------- src/strategy.rs | 42 +++++++++++++++++++++------------------ tests/official-runner-matching.rs | 5 +++-- 4 files changed, 51 insertions(+), 35 deletions(-) diff --git a/src/constants.rs b/src/constants.rs index 2d5d161..1c34377 100644 --- a/src/constants.rs +++ b/src/constants.rs @@ -169,3 +169,10 @@ pub const BOMB_DAMAGES: [(Vec2d, i32); BOMB_DAMAGED_SPACES] = [ (Vec2d::new(-1, 0), 13), (Vec2d::new(0, 0), 20), ]; + +pub const MISSED_ATTACK_SCORE: i32 = 2; +pub const ATTACK_SCORE_MULTIPLIER: i32 = 2; +pub const KILL_SCORE: i32 = 40; +pub const DIG_SCORE: i32 = 7; +pub const MOVE_SCORE: i32 = 5; +pub const INVALID_COMMAND_SCORE_PENALTY: i32 = 4; diff --git a/src/game.rs b/src/game.rs index 2f7e5de..f5bcfa2 100644 --- a/src/game.rs +++ b/src/game.rs @@ -233,9 +233,9 @@ impl GameBoard { // don't need to handle for now. for player in &mut self.players { if let Some(worm) = player.active_worm_mut() { - worm.health = worm.health.saturating_sub(damage); + worm.health -= damage; } - player.moves_score += 5; + player.moves_score += ATTACK_SCORE_MULTIPLIER * damage + MOVE_SCORE; } } _ => { @@ -249,7 +249,7 @@ impl GameBoard { p.y ); - self.players[player_index].moves_score += 5; + self.players[player_index].moves_score += MOVE_SCORE; if let Some(worm) = self.players[player_index].active_worm_mut() { debug_assert!( @@ -296,7 +296,7 @@ impl GameBoard { "Tried to dig too far away, ({}, {})", p.x, p.y }; - self.players[player_index].moves_score += 7; + self.players[player_index].moves_score += DIG_SCORE; self.map.clear(p); } @@ -326,7 +326,7 @@ impl GameBoard { self.map.clear(target); // TODO: How does this score get assigned if both players lobbed a banana? // (answer, currently all to A, but watch https://forum.entelect.co.za/t/scoring-with-simultaneous-banana-digs/766/1 - self.players[player_index].moves_score += 7; + self.players[player_index].moves_score += DIG_SCORE; } let target_own_worm: Option<&mut Worm> = self.players[player_index] @@ -336,9 +336,10 @@ impl GameBoard { if let Some(target_worm) = target_own_worm { target_worm.health -= weapon_damage; - self.players[player_index].moves_score -= weapon_damage * 2; + self.players[player_index].moves_score -= + weapon_damage * ATTACK_SCORE_MULTIPLIER; if target_worm.health <= 0 { - self.players[player_index].moves_score -= 40; + self.players[player_index].moves_score -= KILL_SCORE; self.occupied_cells.remove(&target_worm.position); } } @@ -350,9 +351,10 @@ impl GameBoard { .find(|w| w.position == target); if let Some(target_worm) = target_opponent_worm { target_worm.health -= weapon_damage; - self.players[player_index].moves_score += weapon_damage * 2; + self.players[player_index].moves_score += + weapon_damage * ATTACK_SCORE_MULTIPLIER; if target_worm.health <= 0 { - self.players[player_index].moves_score += 40; + self.players[player_index].moves_score += KILL_SCORE; self.occupied_cells.remove(&target_worm.position); } } @@ -388,9 +390,10 @@ impl GameBoard { if let Some(target_worm) = target_own_worm { target_worm.health -= weapon_damage; - self.players[player_index].moves_score -= weapon_damage * 2; + self.players[player_index].moves_score -= + weapon_damage * ATTACK_SCORE_MULTIPLIER; if target_worm.health <= 0 { - self.players[player_index].moves_score -= 40; + self.players[player_index].moves_score -= KILL_SCORE; self.occupied_cells.remove(&target_worm.position); } continue 'players_loop; @@ -404,9 +407,10 @@ impl GameBoard { if let Some(target_worm) = target_opponent_worm { target_worm.health -= weapon_damage; - self.players[player_index].moves_score += weapon_damage * 2; + self.players[player_index].moves_score += + weapon_damage * ATTACK_SCORE_MULTIPLIER; if target_worm.health <= 0 { - self.players[player_index].moves_score += 40; + self.players[player_index].moves_score += KILL_SCORE; self.occupied_cells.remove(&target_worm.position); } @@ -418,7 +422,7 @@ impl GameBoard { } // You get here if the shot missed. Hits are an early return. - self.players[player_index].moves_score += 2; + self.players[player_index].moves_score += MISSED_ATTACK_SCORE; } } } diff --git a/src/strategy.rs b/src/strategy.rs index 771dccf..036a620 100644 --- a/src/strategy.rs +++ b/src/strategy.rs @@ -202,27 +202,31 @@ fn score(state: &GameBoard) -> Score { } fn rollout(state: &GameBoard) -> Score { - let mut s = state.clone(); - let mut rng = rand::thread_rng(); - while s.outcome == SimulationOutcome::Continue { - let player_moves = rollout_moves(&s, 0); - let opponent_moves = rollout_moves(&s, 1); - - s.simulate([ - player_moves - .choose(&mut rng) - .cloned() - .unwrap_or_else(|| Command::new(Action::DoNothing)), - opponent_moves - .choose(&mut rng) - .cloned() - .unwrap_or_else(|| Command::new(Action::DoNothing)), - ]); - } - - score(&s) + score(state) } +// fn rollout(state: &GameBoard) -> Score { +// let mut s = state.clone(); +// let mut rng = rand::thread_rng(); +// while s.outcome == SimulationOutcome::Continue { +// let player_moves = rollout_moves(&s, 0); +// let opponent_moves = rollout_moves(&s, 1); + +// s.simulate([ +// player_moves +// .choose(&mut rng) +// .cloned() +// .unwrap_or_else(|| Command::new(Action::DoNothing)), +// opponent_moves +// .choose(&mut rng) +// .cloned() +// .unwrap_or_else(|| Command::new(Action::DoNothing)), +// ]); +// } + +// score(&s) +// } + fn choose_existing(node: &Node) -> [Command; 2] { [choose_one_existing(node, 0), choose_one_existing(node, 1)] } diff --git a/tests/official-runner-matching.rs b/tests/official-runner-matching.rs index fcc648f..ffe2468 100644 --- a/tests/official-runner-matching.rs +++ b/tests/official-runner-matching.rs @@ -1,4 +1,5 @@ use steam_powered_wyrm::command::{Action, Command}; +use steam_powered_wyrm::constants::*; use steam_powered_wyrm::game::*; use steam_powered_wyrm::geometry::*; use steam_powered_wyrm::json; @@ -50,10 +51,10 @@ fn simulates_the_same_match() { ); let _ = game_board.simulate([player_move, opponent_move]); if player[1] == "invalid" { - game_board.players[0].moves_score -= 4; + game_board.players[0].moves_score -= INVALID_COMMAND_SCORE_PENALTY; } if opponent[1] == "invalid" { - game_board.players[1].moves_score -= 4; + game_board.players[1].moves_score -= INVALID_COMMAND_SCORE_PENALTY; } } -- cgit v1.2.3