This commit is contained in:
Henri Bourcereau 2024-01-30 21:59:47 +01:00
parent 4c8620fc2f
commit 9a1ee299ca

View file

@ -1,5 +1,5 @@
//! # Play a TricTrac Game //! # Play a TricTrac Game
use crate::board::{Board, Field, CheckerMove, Move}; use crate::board::{Board, CheckerMove, Field, Move};
use crate::dice::{Dices, Roll}; use crate::dice::{Dices, Roll};
use crate::player::{Color, Player, PlayerId}; use crate::player::{Color, Player, PlayerId};
use crate::Error; use crate::Error;
@ -89,7 +89,13 @@ impl GameState {
// black : 1 (true) // black : 1 (true)
pos_bits.push( pos_bits.push(
self.who_plays() self.who_plays()
.map(|player| if player.color == Color::Black { '1'} else {'0'}) .map(|player| {
if player.color == Color::Black {
'1'
} else {
'0'
}
})
.unwrap_or('0'), // White by default .unwrap_or('0'), // White by default
); );
@ -114,7 +120,8 @@ impl GameState {
pos_bits = format!("{:0>108}", pos_bits); pos_bits = format!("{:0>108}", pos_bits);
// println!("{}", pos_bits); // println!("{}", pos_bits);
let pos_u8 = pos_bits let pos_u8 = pos_bits
.as_bytes().chunks(6) .as_bytes()
.chunks(6)
.map(|chunk| str::from_utf8(chunk).unwrap()) .map(|chunk| str::from_utf8(chunk).unwrap())
.map(|chunk| u8::from_str_radix(chunk, 2).unwrap()) .map(|chunk| u8::from_str_radix(chunk, 2).unwrap())
.collect::<Vec<u8>>(); .collect::<Vec<u8>>();
@ -213,10 +220,7 @@ impl GameState {
return false; return false;
} }
} }
Move { Move { player_id, moves } => {
player_id,
moves,
} => {
// Check player exists // Check player exists
if !self.players.contains_key(player_id) { if !self.players.contains_key(player_id) {
error!("Player {} unknown", player_id); error!("Player {} unknown", player_id);
@ -229,11 +233,13 @@ impl GameState {
} }
// Check move is physically possible // Check move is physically possible
// TODO : à corriger : ne permet pas le jeu tout d'une...
let color = &self.players[player_id].color; let color = &self.players[player_id].color;
if !self.board.move_possible(color, moves.0) || if !self.board.move_possible(color, moves.0)
!self.board.move_possible(color, moves.1) { || !self.board.move_possible(color, moves.1)
return false; {
} return false;
}
// Check move is allowed by the rules (to desactivate when playing with schools) // Check move is allowed by the rules (to desactivate when playing with schools)
if !self.moves_allowed(color, moves) { if !self.moves_allowed(color, moves) {
@ -250,21 +256,33 @@ impl GameState {
// ------- corner rules ---------- // ------- corner rules ----------
let corner_field: Field = self.board.get_color_corner(color); let corner_field: Field = self.board.get_color_corner(color);
let (corner_count, _color) = self.board.get_field_checkers(corner_field).unwrap(); let (corner_count, _color) = self.board.get_field_checkers(corner_field).unwrap();
let (from0, to0, from1, to1) = (moves.0.get_from(), moves.0.get_to(), moves.1.get_from(), moves.1.get_to()); let (from0, to0, from1, to1) = (
moves.0.get_from(),
moves.0.get_to(),
moves.1.get_from(),
moves.1.get_to(),
);
// 2 checkers must go at the same time on an empty corner // 2 checkers must go at the same time on an empty corner
if (to0 == corner_field || to1 == corner_field) && if (to0 == corner_field || to1 == corner_field) && (to0 != to1) && corner_count == 0 {
(to0 != to1) && corner_count == 0 { return false;
return false;
} }
// the lat 2 checkers of a corner must leave at the same time
if (from0 == corner_field || from1 == corner_field) &&
(from0 != from1) && corner_count == 2 {
return false;
}
// ------- exit rules ----------
// the lat 2 checkers of a corner must leave at the same time
if (from0 == corner_field || from1 == corner_field) && (from0 != from1) && corner_count == 2
{
return false;
}
// ------- exit rules ----------
// -- toutes les dames doivent être dans le jan de retour
// -- si on peut sortir, on doit sortir
// -- priorité :
// - dame se trouvant sur la flêche correspondant au dé
// - dame se trouvant plus loin de la sortie que la flêche (point défaillant)
// - dame se trouvant plus près que la flêche (point exédant)
// --- cadran rempli si possible ----
// --- interdit de jouer dans cadran que l'adversaire peut encore remplir ----
// no rule was broken // no rule was broken
true true
} }
@ -293,7 +311,7 @@ impl GameState {
holes: 0, holes: 0,
points: 0, points: 0,
can_bredouille: true, can_bredouille: true,
can_big_bredouille: true can_big_bredouille: true,
}, },
); );
} }
@ -301,10 +319,7 @@ impl GameState {
self.players.remove(player_id); self.players.remove(player_id);
} }
Roll { player_id: _ } => {} Roll { player_id: _ } => {}
Move { Move { player_id, moves } => {
player_id,
moves
} => {
let player = self.players.get(player_id).unwrap(); let player = self.players.get(player_id).unwrap();
self.board.move_checker(&player.color, moves.0).unwrap(); self.board.move_checker(&player.color, moves.0).unwrap();
self.board.move_checker(&player.color, moves.1).unwrap(); self.board.move_checker(&player.color, moves.1).unwrap();
@ -364,9 +379,9 @@ impl Roll for GameState {
fn roll(&mut self) -> Result<&mut Self, Error> { fn roll(&mut self) -> Result<&mut Self, Error> {
self.dices = self.dices.roll(); self.dices = self.dices.roll();
if self.who_plays().is_none() { if self.who_plays().is_none() {
let active_color = match self.dices.coin() { let active_color = match self.dices.coin() {
false => Color::Black, false => Color::Black,
true => Color::White true => Color::White,
}; };
let color_player_id = self.player_id_by_color(active_color); let color_player_id = self.player_id_by_color(active_color);
if color_player_id.is_some() { if color_player_id.is_some() {
@ -425,7 +440,6 @@ impl Move for GameState {
Ok(self) Ok(self)
} }
} }
#[cfg(test)] #[cfg(test)]
@ -441,5 +455,4 @@ mod tests {
// println!("string_id : {}", string_id); // println!("string_id : {}", string_id);
assert!(string_id == "Dz8+AAAAAT8/MAAAAAQAADAD"); assert!(string_id == "Dz8+AAAAAT8/MAAAAAQAADAD");
} }
} }