wip points rules
This commit is contained in:
parent
7790c07dcc
commit
aff489f134
12
Cargo.lock
generated
12
Cargo.lock
generated
|
|
@ -1251,6 +1251,7 @@ dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"bincode",
|
"bincode",
|
||||||
"bot",
|
"bot",
|
||||||
|
"itertools 0.13.0",
|
||||||
"pico-args",
|
"pico-args",
|
||||||
"pretty_assertions",
|
"pretty_assertions",
|
||||||
"renet",
|
"renet",
|
||||||
|
|
@ -2127,6 +2128,15 @@ dependencies = [
|
||||||
"either",
|
"either",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "itertools"
|
||||||
|
version = "0.13.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186"
|
||||||
|
dependencies = [
|
||||||
|
"either",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "itoa"
|
name = "itoa"
|
||||||
version = "1.0.9"
|
version = "1.0.9"
|
||||||
|
|
@ -2951,7 +2961,7 @@ dependencies = [
|
||||||
"cassowary",
|
"cassowary",
|
||||||
"crossterm",
|
"crossterm",
|
||||||
"indoc",
|
"indoc",
|
||||||
"itertools",
|
"itertools 0.11.0",
|
||||||
"lru",
|
"lru",
|
||||||
"paste",
|
"paste",
|
||||||
"strum",
|
"strum",
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,8 @@
|
||||||
mod bot;
|
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)]
|
#[derive(Debug)]
|
||||||
pub struct Bot {
|
pub struct Bot {
|
||||||
|
|
@ -55,7 +57,7 @@ impl Bot {
|
||||||
}),
|
}),
|
||||||
TurnStage::MarkPoints => Some(GameEvent::Mark {
|
TurnStage::MarkPoints => Some(GameEvent::Mark {
|
||||||
player_id: self.player_id,
|
player_id: self.player_id,
|
||||||
points: 0,
|
points: self.calculate_points(),
|
||||||
}),
|
}),
|
||||||
TurnStage::Move => Some(GameEvent::Move {
|
TurnStage::Move => Some(GameEvent::Move {
|
||||||
player_id: self.player_id,
|
player_id: self.player_id,
|
||||||
|
|
@ -67,6 +69,10 @@ impl Bot {
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn calculate_points(&self) -> u8 {
|
||||||
|
self.game.get_points().iter().map(|r| r.0).sum()
|
||||||
|
}
|
||||||
|
|
||||||
fn choose_move(&self) -> (CheckerMove, CheckerMove) {
|
fn choose_move(&self) -> (CheckerMove, CheckerMove) {
|
||||||
let (dice1, dice2) = match self.color {
|
let (dice1, dice2) = match self.color {
|
||||||
Color::White => (self.game.dice.values.0 as i8, self.game.dice.values.1 as i8),
|
Color::White => (self.game.dice.values.0 as i8, self.game.dice.values.1 as i8),
|
||||||
|
|
|
||||||
|
|
@ -13,3 +13,4 @@ pretty_assertions = "1.4.0"
|
||||||
renet = "0.0.13"
|
renet = "0.0.13"
|
||||||
store = { path = "../store" }
|
store = { path = "../store" }
|
||||||
bot = { path = "../bot" }
|
bot = { path = "../bot" }
|
||||||
|
itertools = "0.13.0"
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,5 @@
|
||||||
|
use itertools::Itertools;
|
||||||
|
|
||||||
use bot::Bot;
|
use bot::Bot;
|
||||||
use pretty_assertions::assert_eq;
|
use pretty_assertions::assert_eq;
|
||||||
use store::{CheckerMove, DiceRoller, GameEvent, GameState, PlayerId, Stage, TurnStage};
|
use store::{CheckerMove, DiceRoller, GameEvent, GameState, PlayerId, Stage, TurnStage};
|
||||||
|
|
@ -186,7 +188,9 @@ impl App {
|
||||||
if self.game.state.stage != Stage::PreGame {
|
if self.game.state.stage != Stage::PreGame {
|
||||||
// display players points
|
// display players points
|
||||||
output += format!("\n\n{:<11} :: {:<5} :: {}", "Player", "holes", "points").as_str();
|
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!(
|
output += format!(
|
||||||
"\n{}. {:<8} :: {:<5} :: {}",
|
"\n{}. {:<8} :: {:<5} :: {}",
|
||||||
&player_id, &player.name, &player.holes, &player.points
|
&player_id, &player.name, &player.holes, &player.points
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,8 @@
|
||||||
//! # Play a TricTrac Game
|
//! # Play a TricTrac Game
|
||||||
use crate::board::{Board, CheckerMove, Field, EMPTY_MOVE};
|
use crate::board::{Board, CheckerMove};
|
||||||
use crate::dice::Dice;
|
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 crate::player::{Color, Player, PlayerId};
|
||||||
use log::error;
|
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 {
|
impl MoveRules for GameState {
|
||||||
fn board(&self) -> &Board {
|
fn board(&self) -> &Board {
|
||||||
&self.board
|
&self.board
|
||||||
|
|
@ -236,10 +246,7 @@ impl GameState {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Mark {
|
Mark { player_id, points } => {
|
||||||
player_id,
|
|
||||||
points: _,
|
|
||||||
} => {
|
|
||||||
// Check player exists
|
// Check player exists
|
||||||
if !self.players.contains_key(player_id) {
|
if !self.players.contains_key(player_id) {
|
||||||
return false;
|
return false;
|
||||||
|
|
@ -248,6 +255,12 @@ impl GameState {
|
||||||
if self.active_player_id != *player_id {
|
if self.active_player_id != *player_id {
|
||||||
return false;
|
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 } => {
|
Move { player_id, moves } => {
|
||||||
// Check player exists
|
// Check player exists
|
||||||
|
|
|
||||||
16
store/src/game_rules_points.rs
Normal file
16
store/src/game_rules_points.rs
Normal file
|
|
@ -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()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,6 +1,8 @@
|
||||||
mod game;
|
mod game;
|
||||||
mod game_rules_moves;
|
mod game_rules_moves;
|
||||||
|
mod game_rules_points;
|
||||||
pub use game::{EndGameReason, GameEvent, GameState, Stage, TurnStage};
|
pub use game::{EndGameReason, GameEvent, GameState, Stage, TurnStage};
|
||||||
|
pub use game_rules_points::PointsRules;
|
||||||
|
|
||||||
mod player;
|
mod player;
|
||||||
pub use player::{Color, Player, PlayerId};
|
pub use player::{Color, Player, PlayerId};
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue