diff --git a/Cargo.lock b/Cargo.lock index 37c03fb..ba8d6aa 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1251,6 +1251,7 @@ dependencies = [ "anyhow", "bincode", "bot", + "itertools 0.13.0", "pico-args", "pretty_assertions", "renet", @@ -2127,6 +2128,15 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.9" @@ -2951,7 +2961,7 @@ dependencies = [ "cassowary", "crossterm", "indoc", - "itertools", + "itertools 0.11.0", "lru", "paste", "strum", diff --git a/bot/src/lib.rs b/bot/src/lib.rs index d4ab239..46c092d 100644 --- a/bot/src/lib.rs +++ b/bot/src/lib.rs @@ -1,6 +1,8 @@ mod bot; -use store::{CheckerMove, Color, Dice, GameEvent, GameState, Player, PlayerId, Stage, TurnStage}; +use store::{ + CheckerMove, Color, Dice, GameEvent, GameState, Player, PlayerId, PointsRules, Stage, TurnStage, +}; #[derive(Debug)] pub struct Bot { @@ -55,7 +57,7 @@ impl Bot { }), TurnStage::MarkPoints => Some(GameEvent::Mark { player_id: self.player_id, - points: 0, + points: self.calculate_points(), }), TurnStage::Move => Some(GameEvent::Move { player_id: self.player_id, @@ -67,6 +69,10 @@ impl Bot { None } + fn calculate_points(&self) -> u8 { + self.game.get_points().iter().map(|r| r.0).sum() + } + fn choose_move(&self) -> (CheckerMove, CheckerMove) { let (dice1, dice2) = match self.color { Color::White => (self.game.dice.values.0 as i8, self.game.dice.values.1 as i8), diff --git a/client_cli/Cargo.toml b/client_cli/Cargo.toml index 37c7323..1e98a21 100644 --- a/client_cli/Cargo.toml +++ b/client_cli/Cargo.toml @@ -13,3 +13,4 @@ pretty_assertions = "1.4.0" renet = "0.0.13" store = { path = "../store" } bot = { path = "../bot" } +itertools = "0.13.0" diff --git a/client_cli/src/app.rs b/client_cli/src/app.rs index 0ac3c5d..20f5207 100644 --- a/client_cli/src/app.rs +++ b/client_cli/src/app.rs @@ -1,3 +1,5 @@ +use itertools::Itertools; + use bot::Bot; use pretty_assertions::assert_eq; use store::{CheckerMove, DiceRoller, GameEvent, GameState, PlayerId, Stage, TurnStage}; @@ -186,7 +188,9 @@ impl App { if self.game.state.stage != Stage::PreGame { // display players points output += format!("\n\n{:<11} :: {:<5} :: {}", "Player", "holes", "points").as_str(); - for (player_id, player) in self.game.state.players.iter() { + + for player_id in self.game.state.players.keys().sorted() { + let player = &self.game.state.players[player_id]; output += format!( "\n{}. {:<8} :: {:<5} :: {}", &player_id, &player.name, &player.holes, &player.points diff --git a/store/src/game.rs b/store/src/game.rs index 9fe0c35..0c7c704 100644 --- a/store/src/game.rs +++ b/store/src/game.rs @@ -1,7 +1,8 @@ //! # Play a TricTrac Game -use crate::board::{Board, CheckerMove, Field, EMPTY_MOVE}; +use crate::board::{Board, CheckerMove}; use crate::dice::Dice; -use crate::game_rules_moves::{MoveError, MoveRules}; +use crate::game_rules_moves::MoveRules; +use crate::game_rules_points::PointsRules; use crate::player::{Color, Player, PlayerId}; use log::error; @@ -59,6 +60,15 @@ impl fmt::Display for GameState { } } +impl PointsRules for GameState { + fn board(&self) -> &Board { + &self.board + } + fn dice(&self) -> &Dice { + &self.dice + } +} + impl MoveRules for GameState { fn board(&self) -> &Board { &self.board @@ -236,10 +246,7 @@ impl GameState { return false; } } - Mark { - player_id, - points: _, - } => { + Mark { player_id, points } => { // Check player exists if !self.players.contains_key(player_id) { return false; @@ -248,6 +255,12 @@ impl GameState { if self.active_player_id != *player_id { return false; } + + // Check points are correct + let rules_points: u8 = self.get_points().iter().map(|r| r.0).sum(); + if rules_points != *points { + return false; + } } Move { player_id, moves } => { // Check player exists diff --git a/store/src/game_rules_points.rs b/store/src/game_rules_points.rs new file mode 100644 index 0000000..40195ab --- /dev/null +++ b/store/src/game_rules_points.rs @@ -0,0 +1,16 @@ +use crate::board::Board; +use crate::dice::Dice; + +#[derive(std::cmp::PartialEq, Debug)] +pub enum PointsRule { + FilledQuarter, +} + +pub trait PointsRules { + fn board(&self) -> &Board; + fn dice(&self) -> &Dice; + + fn get_points(&self) -> Vec<(u8, PointsRule)> { + Vec::new() + } +} diff --git a/store/src/lib.rs b/store/src/lib.rs index 435f562..e911468 100644 --- a/store/src/lib.rs +++ b/store/src/lib.rs @@ -1,6 +1,8 @@ mod game; mod game_rules_moves; +mod game_rules_points; pub use game::{EndGameReason, GameEvent, GameState, Stage, TurnStage}; +pub use game_rules_points::PointsRules; mod player; pub use player::{Color, Player, PlayerId};