From 6cb8ec85751b3936bc72f2a4aa052e08a575532e Mon Sep 17 00:00:00 2001 From: Justin Wernick Date: Sat, 28 Mar 2020 21:11:47 +0200 Subject: Initial commit from starter bot --- .gitignore | 1 + Cargo.lock | 106 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 13 +++++++ bot.json | 8 +++++ src/command.rs | 27 +++++++++++++++ src/json.rs | 96 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/main.rs | 27 +++++++++++++++ 7 files changed, 278 insertions(+) create mode 100644 .gitignore create mode 100644 Cargo.lock create mode 100644 Cargo.toml create mode 100644 bot.json create mode 100644 src/command.rs create mode 100644 src/json.rs create mode 100644 src/main.rs diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1de5659 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +target \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..c2b7199 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,106 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +[[package]] +name = "anyhow" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "013a6e0a2cbe3d20f9c60b65458f7a7f7a5e636c5d0f45a5a6aee5d4b1f01785" + +[[package]] +name = "itoa" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8b7a7c0c47db5545ed3fef7468ee7bb5b74691498139e4b3f6a20685dc6dd8e" + +[[package]] +name = "proc-macro2" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c09721c6781493a2a492a96b5a5bf19b65917fe6728884e7c44dd0c60ca3435" +dependencies = [ + "unicode-xid", +] + +[[package]] +name = "quote" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bdc6c187c65bca4260c9011c9e3132efe4909da44726bad24cf7572ae338d7f" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "ryu" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "535622e6be132bccd223f4bb2b8ac8d53cda3c7a6394944d3b2b33fb974f9d76" + +[[package]] +name = "serde" +version = "1.0.105" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e707fbbf255b8fc8c3b99abb91e7257a622caeb20a9818cbadbeeede4e0932ff" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.105" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac5d00fc561ba2724df6758a17de23df5914f20e41cb00f94d5b7ae42fffaff8" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.49" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02044a6a92866fd61624b3db4d2c9dccc2feabbc6be490b87611bf285edbac55" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_repr" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd02c7587ec314570041b2754829f84d873ced14a96d1fd1823531e11db40573" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "syn" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0df0eb663f387145cab623dea85b09c2c5b4b0aef44e945d928e682fce71bb03" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "unicode-xid" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c" + +[[package]] +name = "vroomba" +version = "0.1.0" +dependencies = [ + "anyhow", + "serde", + "serde_json", + "serde_repr", +] diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..5a23926 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "vroomba" +version = "0.1.0" +edition = "2018" + +[dependencies] +anyhow = "1.0.27" +serde = { version = "1.0", features = ["derive"] } +serde_repr = "0.1" +serde_json = "1.0" + +[profile.release] +lto = true diff --git a/bot.json b/bot.json new file mode 100644 index 0000000..e44f2f2 --- /dev/null +++ b/bot.json @@ -0,0 +1,8 @@ +{ + "author":"Justin Wernick", + "email":"justin@worthe-it.co.za", + "nickName" :"Vroomba", + "botLocation": "/target/release/", + "botFileName": "vroomba", + "botLanguage": "rust" +} diff --git a/src/command.rs b/src/command.rs new file mode 100644 index 0000000..f95ef98 --- /dev/null +++ b/src/command.rs @@ -0,0 +1,27 @@ +use std::fmt; + +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub enum Command { + Nothing, + Accelerate, + Decelerate, + TurnLeft, + TurnRight, + UseBoost, + UseOil, +} + +impl fmt::Display for Command { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + use Command::*; + match self { + Nothing => write!(f, "NOTHING"), + Accelerate => write!(f, "ACCELERATE"), + Decelerate => write!(f, "DECELERATE"), + TurnLeft => write!(f, "TURN_LEFT"), + TurnRight => write!(f, "TURN_RIGHT"), + UseBoost => write!(f, "USE_BOOST"), + UseOil => write!(f, "USE_OIL"), + } + } +} diff --git a/src/json.rs b/src/json.rs new file mode 100644 index 0000000..55173bd --- /dev/null +++ b/src/json.rs @@ -0,0 +1,96 @@ +use std::fs::File; +use std::io::prelude::*; + +use anyhow::Result; +use serde::{Deserialize, Serialize}; +use serde_json; +use serde_repr::{Deserialize_repr, Serialize_repr}; + +pub fn read_state_from_json_file(filename: &str) -> Result { + let mut file = File::open(filename)?; + let mut content = String::new(); + file.read_to_string(&mut content)?; + let state: State = serde_json::from_str(content.as_ref())?; + + Ok(state) +} + +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct State { + pub current_round: u32, + pub max_rounds: u32, + pub player: Player, + pub opponent: Opponent, + pub world_map: Vec>, +} + +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct Player { + id: u32, + position: Position, + speed: u32, + state: PlayerState, + powerups: Vec, + boosting: bool, + boost_counter: u32, +} + +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct Opponent { + id: u32, + position: Position, + speed: u32, +} + +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct WorldMapCell { + position: Position, + surface_object: SurfaceObject, + occupied_by_player_id: u32, +} + +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct Position { + x: u32, + y: u32, +} + +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq)] +#[serde(rename_all = "SCREAMING_SNAKE_CASE")] +pub enum PlayerState { + Ready, + Nothing, + TurningLeft, + TurningRight, + Accelerating, + Decelarating, + PickedUpPowerup, + UsedBoost, + UsedOil, + HitMud, + Finishing, +} + +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq)] +#[serde(rename_all = "SCREAMING_SNAKE_CASE")] +pub enum Powerup { + Boost, + Oil, +} + +#[derive(Serialize_repr, Deserialize_repr, Clone, Debug, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +#[repr(u8)] +pub enum SurfaceObject { + Empty = 0, + Mud = 1, + OilSpill = 2, + OilItem = 3, + FinishLine = 4, + Boost = 5, +} diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..5d29529 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,27 @@ +use std::io::prelude::*; +use std::io::stdin; + +mod command; +mod json; + +use command::*; +use json::*; + +fn main() { + for line in stdin().lock().lines() { + let round_number = line.expect("Failed to read line from stdin: {}"); + let command = + match read_state_from_json_file(&format!("./rounds/{}/state.json", round_number)) { + Ok(state) => choose_command(state), + Err(e) => { + eprintln!("WARN: State file could not be parsed: {}", e); + Command::Nothing + } + }; + println!("C;{};{}", round_number, command); + } +} + +fn choose_command(state: State) -> Command { + Command::Accelerate +} -- cgit v1.2.3