summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJustin Worthe <justin@worthe-it.co.za>2018-05-12 22:37:48 +0200
committerJustin Worthe <justin@worthe-it.co.za>2018-05-12 22:37:48 +0200
commit02256124fbd57d88effd02c046093ecaf73b77e3 (patch)
tree9b4b33a6119e92b40c808677771d2e95e9971933 /src
parentd14ec12e30852f8a93f310f5c53fce6ab6f1c6c5 (diff)
Limited bot to run within the 2 second window
Diffstat (limited to 'src')
-rw-r--r--src/lib.rs1
-rw-r--r--src/main.rs13
-rw-r--r--src/strategy/monte_carlo.rs15
-rw-r--r--src/strategy/sample.rs4
4 files changed, 25 insertions, 8 deletions
diff --git a/src/lib.rs b/src/lib.rs
index a09f999..728f747 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -5,6 +5,7 @@ extern crate serde_json;
extern crate serde_derive;
extern crate rand;
+extern crate time;
pub mod json;
pub mod engine;
diff --git a/src/main.rs b/src/main.rs
index e5dc3aa..3d3d980 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,4 +1,7 @@
extern crate zombot;
+extern crate time;
+use time::PreciseTime;
+
use zombot::*;
use zombot::engine::command::Command;
@@ -12,8 +15,8 @@ use std::fs::File;
use std::io::prelude::*;
use std::process;
-fn choose_move(settings: &engine::settings::GameSettings, state: &engine::GameState) -> Command {
- strategy::monte_carlo::choose_move(settings, state)
+fn choose_move(settings: &engine::settings::GameSettings, state: &engine::GameState, start_time: &PreciseTime) -> Command {
+ strategy::monte_carlo::choose_move(settings, state, start_time)
}
@@ -25,6 +28,8 @@ fn write_command(filename: &str, command: Command) -> Result<(), Box<Error> > {
fn main() {
+ let start_time = PreciseTime::now();
+
println!("Reading in state.json file");
let (settings, state) = match json::read_state_from_file(STATE_PATH) {
Ok(ok) => ok,
@@ -33,7 +38,7 @@ fn main() {
process::exit(1);
}
};
- let command = choose_move(&settings, &state);
+ let command = choose_move(&settings, &state, &start_time);
match write_command(COMMAND_PATH, command) {
Ok(()) => {}
@@ -42,4 +47,6 @@ fn main() {
process::exit(1);
}
}
+
+ println!("Elapsed time: {}", start_time.to(PreciseTime::now()));
}
diff --git a/src/strategy/monte_carlo.rs b/src/strategy/monte_carlo.rs
index ba66d48..86960eb 100644
--- a/src/strategy/monte_carlo.rs
+++ b/src/strategy/monte_carlo.rs
@@ -6,21 +6,28 @@ use rand::{thread_rng, Rng};
use std::process;
const MAX_MOVES: u16 = 400;
+use time::{Duration, PreciseTime};
+
// TODO Round start time here
-pub fn choose_move(settings: &GameSettings, state: &GameState) -> Command {
+pub fn choose_move(settings: &GameSettings, state: &GameState, start_time: &PreciseTime) -> Command {
println!("Using MONTE_CARLO strategy");
+
+ //just under the max of 2 seconds, to avoid issues like overhead in the bot being run, and we still need to write the result of this to file
+ let max_time = Duration::milliseconds(1950);
let mut rng = thread_rng();
let mut command_scores = CommandScore::init_command_scores(settings, state);
- // TODO Repeat this until time is out
- for _ in 0..1000 {
+ loop {
for mut score in &mut command_scores {
simulate_to_endstate(score, settings, state, &mut rng);
}
+ if start_time.to(PreciseTime::now()) > max_time {
+ break;
+ }
}
- println!("{:?}", command_scores);
+ println!("{:#?}", command_scores);
let command = command_scores.iter().max_by_key(|&c| c.win_ratio());
match command {
diff --git a/src/strategy/sample.rs b/src/strategy/sample.rs
index 2dad924..72ab66c 100644
--- a/src/strategy/sample.rs
+++ b/src/strategy/sample.rs
@@ -1,9 +1,11 @@
use engine;
use engine::command::*;
+use time::PreciseTime;
+
use rand::{thread_rng, Rng};
-pub fn choose_move(settings: &engine::settings::GameSettings, state: &engine::GameState) -> Command {
+pub fn choose_move(settings: &engine::settings::GameSettings, state: &engine::GameState, _start_time: &PreciseTime) -> Command {
let mut rng = thread_rng();
if state.player.can_afford_defence_buildings(settings) {