summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJustin Worthe <justin@worthe-it.co.za>2019-06-29 10:52:18 +0200
committerJustin Worthe <justin@worthe-it.co.za>2019-06-29 10:52:18 +0200
commit886d7f75bca7078799074f0b4e7b80c6f8081f5f (patch)
tree47e9463043bbc7118d8be494fad2340da6c6dc11
parentd5070033892a531fab75ae1951deeb25c2d5f741 (diff)
Put score allocation behind constants
-rw-r--r--src/constants.rs7
-rw-r--r--src/game.rs32
-rw-r--r--src/strategy.rs42
-rw-r--r--tests/official-runner-matching.rs5
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<i8>, 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;
}
}