server compiles

This commit is contained in:
Henri Bourcereau 2023-10-29 20:48:53 +01:00
parent e9d4f04044
commit 5c82560d76
9 changed files with 3537 additions and 64 deletions

View file

@ -1,9 +1,10 @@
[package]
name = "trictrac"
name = "store"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
rand = "0.8.5"
serde = { version = "1.0", features = ["derive"] }

View file

@ -80,7 +80,7 @@ impl Board {
/// If the field is blocked for the player, an error is returned. If the field is not blocked,
/// but there is already one checker from the other player on the field, that checker is hit and
/// moved to the bar.
pub fn set(&mut self, player: Player, field: usize, amount: i8) -> Result<(), Error> {
pub fn set(&mut self, player: &Player, field: usize, amount: i8) -> Result<(), Error> {
if field > 23 {
return Err(Error::FieldInvalid);
}
@ -112,7 +112,7 @@ impl Board {
}
/// Check if a field is blocked for a player
pub fn blocked(&self, player: Player, field: usize) -> Result<bool, Error> {
pub fn blocked(&self, player: &Player, field: usize) -> Result<bool, Error> {
if field > 23 {
return Err(Error::FieldInvalid);
}
@ -137,7 +137,7 @@ impl Board {
/// Set checkers for a player off the board. This method adds amount to the already existing
/// checkers there.
pub fn set_off(&mut self, player: Player, amount: u8) -> Result<(), Error> {
pub fn set_off(&mut self, player: &Player, amount: u8) -> Result<(), Error> {
match player.color {
Color::White => {
let new = self.raw_board.0.off + amount;
@ -174,12 +174,12 @@ impl Default for PlayerBoard {
/// Trait to move checkers
pub trait Move {
/// Move a checker
fn move_checker(&mut self, player: Player, dice: u8, from: usize) -> Result<&mut Self, Error>
fn move_checker(&mut self, player: &Player, dice: u8, from: usize) -> Result<&mut Self, Error>
where
Self: Sized;
/// Move permitted
fn move_permitted(&mut self, player: Player, dice: u8) -> Result<&mut Self, Error>
fn move_permitted(&mut self, player: &Player, dice: u8) -> Result<&mut Self, Error>
where
Self: Sized;
}
@ -229,7 +229,7 @@ mod tests {
fn set_player0() -> Result<(), Error> {
let mut board = Board::new();
let player = Player {name: "".into(), color: Color::White};
board.set(player, 1, 1)?;
board.set(&player, 1, 1)?;
assert_eq!(board.get().board[1], 1);
Ok(())
}
@ -238,7 +238,7 @@ mod tests {
fn set_player1() -> Result<(), Error> {
let mut board = Board::new();
let player = Player {name: "".into(), color: Color::Black};
board.set(player, 2, 1)?;
board.set(&player, 2, 1)?;
assert_eq!(board.get().board[21], -1);
Ok(())
}
@ -274,44 +274,44 @@ mod tests {
#[test]
fn blocked_player0() -> Result<(), Error> {
let board = Board::new();
assert!(board.blocked(Player { name:"".into(), color: Color::White }, 0)?);
assert!(board.blocked(&Player { name:"".into(), color: Color::White }, 0)?);
Ok(())
}
#[test]
fn blocked_player1() -> Result<(), Error> {
let board = Board::new();
assert!(board.blocked(Player { name:"".into(), color: Color::Black }, 0)?);
assert!(board.blocked(&Player { name:"".into(), color: Color::Black }, 0)?);
Ok(())
}
#[test]
fn blocked_player0_a() -> Result<(), Error> {
let mut board = Board::new();
board.set(Player { name:"".into(), color: Color::Black }, 1, 2)?;
assert!(board.blocked(Player { name:"".into(), color: Color::White }, 22)?);
board.set(&Player { name:"".into(), color: Color::Black }, 1, 2)?;
assert!(board.blocked(&Player { name:"".into(), color: Color::White }, 22)?);
Ok(())
}
#[test]
fn blocked_player1_a() -> Result<(), Error> {
let mut board = Board::new();
board.set(Player { name:"".into(), color: Color::White }, 1, 2)?;
assert!(board.blocked(Player { name:"".into(), color: Color::Black }, 22)?);
board.set(&Player { name:"".into(), color: Color::White }, 1, 2)?;
assert!(board.blocked(&Player { name:"".into(), color: Color::Black }, 22)?);
Ok(())
}
#[test]
fn blocked_invalid_field() {
let board = Board::new();
assert!(board.blocked(Player { name:"".into(), color: Color::White }, 24).is_err());
assert!(board.blocked(&Player { name:"".into(), color: Color::White }, 24).is_err());
}
#[test]
fn set_field_with_1_checker_player0_a() -> Result<(), Error> {
let mut board = Board::new();
board.set(Player { name:"".into(), color: Color::White }, 1, 1)?;
board.set(Player { name:"".into(), color: Color::Black }, 22, 1)?;
board.set(&Player { name:"".into(), color: Color::White }, 1, 1)?;
board.set(&Player { name:"".into(), color: Color::Black }, 22, 1)?;
assert_eq!(board.get().board[1], -1);
Ok(())
}
@ -319,8 +319,8 @@ mod tests {
#[test]
fn set_field_with_1_checker_player0_b() -> Result<(), Error> {
let mut board = Board::new();
board.set(Player { name:"".into(), color: Color::White }, 1, 1)?;
board.set(Player { name:"".into(), color: Color::Black }, 22, 1)?;
board.set(&Player { name:"".into(), color: Color::White }, 1, 1)?;
board.set(&Player { name:"".into(), color: Color::Black }, 22, 1)?;
assert_eq!(board.get().board[1], -1);
Ok(())
}
@ -328,8 +328,8 @@ mod tests {
#[test]
fn set_field_with_1_checker_player1_a() -> Result<(), Error> {
let mut board = Board::new();
board.set(Player { name:"".into(), color: Color::Black }, 1, 1)?;
board.set(Player { name:"".into(), color: Color::White }, 22, 1)?;
board.set(&Player { name:"".into(), color: Color::Black }, 1, 1)?;
board.set(&Player { name:"".into(), color: Color::White }, 22, 1)?;
assert_eq!(board.get().board[22], 1);
Ok(())
}
@ -337,8 +337,8 @@ mod tests {
#[test]
fn set_field_with_1_checker_player1_b() -> Result<(), Error> {
let mut board = Board::new();
board.set(Player { name:"".into(), color: Color::Black }, 1, 1)?;
board.set(Player { name:"".into(), color: Color::White }, 22, 1)?;
board.set(&Player { name:"".into(), color: Color::Black }, 1, 1)?;
board.set(&Player { name:"".into(), color: Color::White }, 22, 1)?;
assert_eq!(board.get().board[22], 1);
Ok(())
}
@ -346,7 +346,7 @@ mod tests {
#[test]
fn set_field_with_2_checkers_player0_a() -> Result<(), Error> {
let mut board = Board::new();
board.set(Player { name:"".into(), color: Color::White }, 23, 2)?;
board.set(&Player { name:"".into(), color: Color::White }, 23, 2)?;
assert_eq!(board.get().board[23], 4);
Ok(())
}
@ -354,7 +354,7 @@ mod tests {
#[test]
fn set_field_with_2_checkers_player0_b() -> Result<(), Error> {
let mut board = Board::new();
board.set(Player { name:"".into(), color: Color::White }, 23, -1)?;
board.set(&Player { name:"".into(), color: Color::White }, 23, -1)?;
assert_eq!(board.get().board[23], 1);
Ok(())
}
@ -362,24 +362,24 @@ mod tests {
#[test]
fn set_field_blocked() {
let mut board = Board::new();
assert!(board.set(Player { name:"".into(), color: Color::White }, 0, 2).is_err());
assert!(board.set(&Player { name:"".into(), color: Color::White }, 0, 2).is_err());
}
#[test]
fn set_wrong_field1() {
let mut board = Board::new();
assert!(board.set(Player { name:"".into(), color: Color::White }, 50, 2).is_err());
assert!(board.set(&Player { name:"".into(), color: Color::White }, 50, 2).is_err());
}
#[test]
fn set_wrong_amount0() {
let mut board = Board::new();
assert!(board.set(Player { name:"".into(), color: Color::White }, 23, -3).is_err());
assert!(board.set(&Player { name:"".into(), color: Color::White }, 23, -3).is_err());
}
#[test]
fn set_wrong_amount1() {
let mut board = Board::new();
assert!(board.set(Player { name:"".into(), color: Color::Black }, 23, -3).is_err());
assert!(board.set(&Player { name:"".into(), color: Color::Black }, 23, -3).is_err());
}
}

View file

@ -35,7 +35,7 @@ impl fmt::Display for GameState {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let mut s = String::new();
s.push_str(&format!("Dices: {:?}\n", self.dices));
s.push_str(&format!("Who plays: {}\n", self.who_plays().map(|player| player.name ).unwrap_or("".to_string())));
// s.push_str(&format!("Who plays: {}\n", self.who_plays().map(|player| &player.name ).unwrap_or("")));
s.push_str(&format!("Board: {:?}\n", self.board.get()));
write!(f, "{}", s)
}
@ -61,8 +61,8 @@ impl GameState {
GameState::default()
}
pub fn who_plays(&self) -> &Option<&Player> {
&self.players.get(&self.active_player_id)
pub fn who_plays(&self) -> Option<&Player> {
self.players.get(&self.active_player_id)
}
pub fn switch_active_player(&mut self) {
@ -182,8 +182,8 @@ impl GameState {
}
Move { player_id, from, to } => {
let player = self.players.get(player_id).unwrap();
self.board.set(*player, *from, 0 as i8);
self.board.set(*player, *to, 1 as i8);
self.board.set(player, *from, 0 as i8);
self.board.set(player, *to, 1 as i8);
self.active_player_id = self
.players
.keys()
@ -245,7 +245,7 @@ impl Roll for GameState {
}
impl Move for GameState {
fn move_checker(&mut self, player: Player, dice: u8, from: usize) -> Result<&mut Self, Error> {
fn move_checker(&mut self, player: &Player, dice: u8, from: usize) -> Result<&mut Self, Error> {
// check if move is permitted
let _ = self.move_permitted(player, dice)?;
@ -286,7 +286,7 @@ impl Move for GameState {
}
/// Implements checks to validate if the player is allowed to move
fn move_permitted(&mut self, player: Player, dice: u8) -> Result<&mut Self, Error> {
fn move_permitted(&mut self, player: &Player, dice: u8) -> Result<&mut Self, Error> {
let maybe_player_id = self.player_id(&player);
// check if player is allowed to move
if maybe_player_id != Some(&self.active_player_id) {

View file

@ -1,4 +1,5 @@
mod game;
pub use game::{ GameState, GameEvent, EndGameReason };
mod player;
pub use player::Player;