feat: jan de 6 tables : check dice roll count

This commit is contained in:
Henri Bourcereau 2024-09-23 17:53:21 +02:00
parent 17605efe76
commit 3d41517909
5 changed files with 102 additions and 68 deletions

View file

@ -77,13 +77,25 @@ impl Bot {
} }
fn calculate_points(&self) -> u8 { fn calculate_points(&self) -> u8 {
let dice_roll_count = self
.game
.players
.get(&self.player_id)
.unwrap()
.dice_roll_count;
let points_rules = PointsRules::new(&Color::White, &self.game.board, self.game.dice); let points_rules = PointsRules::new(&Color::White, &self.game.board, self.game.dice);
points_rules.get_points().0 points_rules.get_points(dice_roll_count).0
} }
fn calculate_adv_points(&self) -> u8 { fn calculate_adv_points(&self) -> u8 {
let dice_roll_count = self
.game
.players
.get(&self.player_id)
.unwrap()
.dice_roll_count;
let points_rules = PointsRules::new(&Color::White, &self.game.board, self.game.dice); let points_rules = PointsRules::new(&Color::White, &self.game.board, self.game.dice);
points_rules.get_points().1 points_rules.get_points(dice_roll_count).0
} }
fn choose_move(&self) -> (CheckerMove, CheckerMove) { fn choose_move(&self) -> (CheckerMove, CheckerMove) {

View file

@ -209,7 +209,7 @@ impl App {
let player = &self.game.state.players[player_id]; 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,
) )
.as_str(); .as_str();
} }
@ -263,7 +263,7 @@ Rolled dice : 0 & 0
#[test] #[test]
fn test_move() { fn test_move() {
let expected = "------------------------------- let expected = "-------------------------------
InGame > myself > MarkAdvPoints InGame > myself > RollDice
Rolled dice : 4 & 6 Rolled dice : 4 & 6
Player :: holes :: points Player :: holes :: points

View file

@ -373,6 +373,7 @@ impl GameState {
points: 0, points: 0,
can_bredouille: true, can_bredouille: true,
can_big_bredouille: true, can_big_bredouille: true,
dice_roll_count: 0,
}, },
); );
} }
@ -388,14 +389,9 @@ impl GameState {
} }
RollResult { player_id, dice } => { RollResult { player_id, dice } => {
self.dice = *dice; self.dice = *dice;
self.inc_roll_count(self.active_player_id);
self.turn_stage = TurnStage::MarkPoints; self.turn_stage = TurnStage::MarkPoints;
// We compute points for the move self.dice_points = self.get_rollresult_points(dice);
let points_rules = PointsRules::new(
&self.player_color_by_id(&self.active_player_id).unwrap(),
&self.board,
*dice,
);
self.dice_points = points_rules.get_points();
if !self.schools_enabled { if !self.schools_enabled {
// Schools are not enabled. We mark points automatically // Schools are not enabled. We mark points automatically
// the points earned by the opponent will be marked on its turn // the points earned by the opponent will be marked on its turn
@ -431,11 +427,24 @@ impl GameState {
self.history.push(valid_event.clone()); self.history.push(valid_event.clone());
} }
fn get_rollresult_points(&self, dice: &Dice) -> (u8, u8) {
let player = &self.players.get(&self.active_player_id).unwrap();
let points_rules = PointsRules::new(&player.color, &self.board, *dice);
points_rules.get_points(player.dice_roll_count)
}
/// Determines if someone has won the game /// Determines if someone has won the game
pub fn determine_winner(&self) -> Option<PlayerId> { pub fn determine_winner(&self) -> Option<PlayerId> {
None None
} }
fn inc_roll_count(&mut self, player_id: PlayerId) {
self.players.get_mut(&player_id).map(|p| {
p.dice_roll_count += 1;
p
});
}
fn mark_points(&mut self, player_id: PlayerId, points: u8) { fn mark_points(&mut self, player_id: PlayerId, points: u8) {
self.players.get_mut(&player_id).map(|p| { self.players.get_mut(&player_id).map(|p| {
let sum_points = p.points + points; let sum_points = p.points + points;

View file

@ -2,14 +2,14 @@ use std::cmp;
use std::collections::HashMap; use std::collections::HashMap;
use crate::board::{Board, Field, EMPTY_MOVE}; use crate::board::{Board, Field, EMPTY_MOVE};
use crate::dice::Dice; use crate::dice::{self, Dice};
use crate::game_rules_moves::MoveRules; use crate::game_rules_moves::MoveRules;
use crate::player::Color; use crate::player::Color;
use crate::CheckerMove; use crate::CheckerMove;
use crate::Error; use crate::Error;
#[derive(PartialEq, Eq, Hash, Clone, Debug)] #[derive(PartialEq, Eq, Hash, Clone, Debug)]
enum Jan { pub enum Jan {
FilledQuarter, FilledQuarter,
TrueHitSmallJan, TrueHitSmallJan,
TrueHitBigJan, TrueHitBigJan,
@ -161,7 +161,7 @@ impl PointsRules {
self.move_rules.board.set_positions(positions); self.move_rules.board.set_positions(positions);
} }
fn get_jans(&self, board_ini: &Board) -> PossibleJans { fn get_jans(&self, board_ini: &Board, dice_rolls_count: u8) -> PossibleJans {
let dices = &vec![self.dice.values.0, self.dice.values.1]; let dices = &vec![self.dice.values.0, self.dice.values.1];
let dices_reversed = &vec![self.dice.values.1, self.dice.values.0]; let dices_reversed = &vec![self.dice.values.1, self.dice.values.0];
let dice1 = self.dice.values.0 as usize; let dice1 = self.dice.values.0 as usize;
@ -248,31 +248,33 @@ impl PointsRules {
} }
// « JANS RARES » // « JANS RARES »
// Jan de 6 tables // Jan de 3 coups ou de 6 tables
// on devrait avoir 4 cases occupées par une dame chacune if dice_rolls_count == 3 {
let fields_with_single: Vec<&(usize, i8)> = // on devrait avoir 4 cases occupées par une dame chacune
checkers.iter().filter(|(f, c)| c == &1).collect(); let fields_with_single: Vec<&(usize, i8)> =
if fields_with_single.len() == 4 { checkers.iter().filter(|(f, c)| c == &1).collect();
let checkers_fields: Vec<usize> = checkers.iter().map(|(f, c)| *f).collect(); if fields_with_single.len() == 4 {
let mut missing_for_6tables: Vec<usize> = Vec::from([2, 3, 4, 5, 6, 7]) let checkers_fields: Vec<usize> = checkers.iter().map(|(f, c)| *f).collect();
.into_iter() let mut missing_for_6tables: Vec<usize> = Vec::from([2, 3, 4, 5, 6, 7])
.filter(|f| !checkers_fields.contains(f)) .into_iter()
.collect(); .filter(|f| !checkers_fields.contains(f))
if missing_for_6tables.len() == 2 { .collect();
// Les dés doivent permettre le mouvement de deux dames du talon vers les 2 cases if missing_for_6tables.len() == 2 {
// vides // Les dés doivent permettre le mouvement de deux dames du talon vers les 2 cases
let mut dice_to: Vec<usize> = vec![ // vides
1 + self.dice.values.0 as usize, let mut dice_to: Vec<usize> = vec![
1 + self.dice.values.1 as usize, 1 + self.dice.values.0 as usize,
]; 1 + self.dice.values.1 as usize,
missing_for_6tables.sort(); ];
dice_to.sort(); missing_for_6tables.sort();
if dice_to == missing_for_6tables { dice_to.sort();
let moves = vec![( if dice_to == missing_for_6tables {
CheckerMove::new(1, missing_for_6tables[0]).unwrap(), let moves = vec![(
CheckerMove::new(1, missing_for_6tables[1]).unwrap(), CheckerMove::new(1, missing_for_6tables[0]).unwrap(),
)]; CheckerMove::new(1, missing_for_6tables[1]).unwrap(),
jans.insert(Jan::SixTables, moves); )];
jans.insert(Jan::SixTables, moves);
}
} }
} }
} }
@ -441,11 +443,7 @@ impl PointsRules {
jans jans
} }
pub fn get_points(&self) -> (u8, u8) { pub fn get_jans_points(&self, jans: HashMap<Jan, Vec<(CheckerMove, CheckerMove)>>) -> (u8, u8) {
let jans = self.get_jans(&self.board);
// if !jans.is_empty() {
// println!("get points : {:?}", jans);
// }
let (points, adv_points) = jans let (points, adv_points) = jans
.into_iter() .into_iter()
.fold((0, 0), |acc: (i8, i8), (jan, moves)| { .fold((0, 0), |acc: (i8, i8), (jan, moves)| {
@ -465,6 +463,11 @@ impl PointsRules {
(points as u8, adv_points as u8) (points as u8, adv_points as u8)
} }
pub fn get_points(&self, dice_rolls_count: u8) -> (u8, u8) {
let jans = self.get_jans(&self.board, dice_rolls_count);
self.get_jans_points(jans)
}
} }
#[cfg(test)] #[cfg(test)]
@ -567,7 +570,7 @@ mod tests {
2, 0, -1, -1, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, -1, -1, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
]); ]);
rules.set_dice(Dice { values: (2, 3) }); rules.set_dice(Dice { values: (2, 3) });
assert_eq!(12, rules.get_points().0); assert_eq!(12, rules.get_points(5).0);
// Battre à vrai une dame située dans la table des grands jans : 2 + 2 = 4 // Battre à vrai une dame située dans la table des grands jans : 2 + 2 = 4
let mut rules = PointsRules::default(); let mut rules = PointsRules::default();
@ -575,28 +578,28 @@ mod tests {
2, 0, 0, -1, 2, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, -1, 2, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
]); ]);
rules.set_dice(Dice { values: (2, 4) }); rules.set_dice(Dice { values: (2, 4) });
assert_eq!(4, rules.get_points().0); assert_eq!(4, rules.get_points(5).0);
// Battre à vrai une dame située dans la table des grands jans : 2 // Battre à vrai une dame située dans la table des grands jans : 2
let mut rules = PointsRules::default(); let mut rules = PointsRules::default();
rules.update_positions([ rules.update_positions([
2, 0, -2, -1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, -2, -1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
]); ]);
rules.set_dice(Dice { values: (2, 4) }); rules.set_dice(Dice { values: (2, 4) });
assert_eq!((2, 2), rules.get_points()); assert_eq!((2, 2), rules.get_points(5));
// Battre à vrai le coin adverse par doublet : 6 // Battre à vrai le coin adverse par doublet : 6
rules.update_positions([ rules.update_positions([
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
]); ]);
rules.set_dice(Dice { values: (2, 2) }); rules.set_dice(Dice { values: (2, 2) });
assert_eq!(6, rules.get_points().0); assert_eq!(6, rules.get_points(5).0);
// Cas de battage du coin de repos adverse impossible // Cas de battage du coin de repos adverse impossible
rules.update_positions([ rules.update_positions([
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
]); ]);
rules.set_dice(Dice { values: (1, 1) }); rules.set_dice(Dice { values: (1, 1) });
assert_eq!(0, rules.get_points().0); assert_eq!(0, rules.get_points(5).0);
// ---- Jan de remplissage // ---- Jan de remplissage
// Faire un petit jan : 4 // Faire un petit jan : 4
@ -604,29 +607,29 @@ mod tests {
3, 1, 2, 2, 3, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 2, 2, 3, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
]); ]);
rules.set_dice(Dice { values: (2, 1) }); rules.set_dice(Dice { values: (2, 1) });
assert_eq!(1, rules.get_jans(&rules.board).len()); assert_eq!(1, rules.get_jans(&rules.board, 5).len());
assert_eq!(4, rules.get_points().0); assert_eq!(4, rules.get_points(5).0);
// Faire un petit jan avec un doublet : 6 // Faire un petit jan avec un doublet : 6
rules.update_positions([ rules.update_positions([
2, 3, 1, 2, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 1, 2, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
]); ]);
rules.set_dice(Dice { values: (1, 1) }); rules.set_dice(Dice { values: (1, 1) });
assert_eq!(6, rules.get_points().0); assert_eq!(6, rules.get_points(5).0);
// Faire un petit jan avec 2 moyens : 6 + 6 = 12 // Faire un petit jan avec 2 moyens : 6 + 6 = 12
rules.update_positions([ rules.update_positions([
3, 3, 1, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 1, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
]); ]);
rules.set_dice(Dice { values: (1, 1) }); rules.set_dice(Dice { values: (1, 1) });
assert_eq!(12, rules.get_points().0); assert_eq!(12, rules.get_points(5).0);
// Conserver un jan avec un doublet : 6 // Conserver un jan avec un doublet : 6
rules.update_positions([ rules.update_positions([
3, 3, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
]); ]);
rules.set_dice(Dice { values: (1, 1) }); rules.set_dice(Dice { values: (1, 1) });
assert_eq!(6, rules.get_points().0); assert_eq!(6, rules.get_points(5).0);
// ---- Sorties // ---- Sorties
// Sortir toutes ses dames avant l'adversaire (simple) // Sortir toutes ses dames avant l'adversaire (simple)
@ -634,14 +637,14 @@ mod tests {
0, 0, -2, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, -2, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,
]); ]);
rules.set_dice(Dice { values: (3, 1) }); rules.set_dice(Dice { values: (3, 1) });
assert_eq!(4, rules.get_points().0); assert_eq!(4, rules.get_points(5).0);
// Sortir toutes ses dames avant l'adversaire (doublet) // Sortir toutes ses dames avant l'adversaire (doublet)
rules.update_positions([ rules.update_positions([
0, 0, -2, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, -2, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,
]); ]);
rules.set_dice(Dice { values: (2, 2) }); rules.set_dice(Dice { values: (2, 2) });
assert_eq!(6, rules.get_points().0); assert_eq!(6, rules.get_points(5).0);
// ---- JANS RARES // ---- JANS RARES
// Jan de six tables // Jan de six tables
@ -649,55 +652,60 @@ mod tests {
10, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 10, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0,
]); ]);
rules.set_dice(Dice { values: (2, 3) }); rules.set_dice(Dice { values: (2, 3) });
assert_eq!(4, rules.get_points().0); assert_eq!(0, rules.get_points(5).0);
rules.update_positions([
10, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0,
]);
rules.set_dice(Dice { values: (2, 3) });
assert_eq!(4, rules.get_points(3).0);
rules.update_positions([ rules.update_positions([
10, 1, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 10, 1, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0,
]); ]);
rules.set_dice(Dice { values: (2, 3) }); rules.set_dice(Dice { values: (2, 3) });
assert_eq!(0, rules.get_points().0); assert_eq!(0, rules.get_points(3).0);
rules.update_positions([ rules.update_positions([
10, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 10, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0,
]); ]);
rules.set_dice(Dice { values: (2, 3) }); rules.set_dice(Dice { values: (2, 3) });
assert_eq!(0, rules.get_points().0); assert_eq!(0, rules.get_points(3).0);
// Jan de deux tables // Jan de deux tables
rules.update_positions([ rules.update_positions([
13, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0,
]); ]);
rules.set_dice(Dice { values: (2, 2) }); rules.set_dice(Dice { values: (2, 2) });
assert_eq!(6, rules.get_points().0); assert_eq!(6, rules.get_points(5).0);
rules.update_positions([ rules.update_positions([
12, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 12, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0,
]); ]);
rules.set_dice(Dice { values: (2, 2) }); rules.set_dice(Dice { values: (2, 2) });
assert_eq!(0, rules.get_points().0); assert_eq!(0, rules.get_points(5).0);
// Contre jan de deux tables // Contre jan de deux tables
rules.update_positions([ rules.update_positions([
13, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0,
]); ]);
rules.set_dice(Dice { values: (2, 2) }); rules.set_dice(Dice { values: (2, 2) });
assert_eq!((0, 6), rules.get_points()); assert_eq!((0, 6), rules.get_points(5));
// Jan de mézéas // Jan de mézéas
rules.update_positions([ rules.update_positions([
13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0,
]); ]);
rules.set_dice(Dice { values: (1, 1) }); rules.set_dice(Dice { values: (1, 1) });
assert_eq!(6, rules.get_points().0); assert_eq!(6, rules.get_points(5).0);
rules.update_positions([ rules.update_positions([
13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0,
]); ]);
rules.set_dice(Dice { values: (1, 2) }); rules.set_dice(Dice { values: (1, 2) });
assert_eq!(4, rules.get_points().0); assert_eq!(4, rules.get_points(5).0);
// Contre jan de mézéas // Contre jan de mézéas
rules.update_positions([ rules.update_positions([
13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0,
]); ]);
rules.set_dice(Dice { values: (1, 1) }); rules.set_dice(Dice { values: (1, 1) });
assert_eq!((0, 6), rules.get_points()); assert_eq!((0, 6), rules.get_points(5));
// ---- JANS QUI NE PEUT // ---- JANS QUI NE PEUT
// Battre à faux une dame située dans la table des petits jans // Battre à faux une dame située dans la table des petits jans
@ -706,7 +714,7 @@ mod tests {
2, 0, -2, -2, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, -2, -2, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
]); ]);
rules.set_dice(Dice { values: (2, 3) }); rules.set_dice(Dice { values: (2, 3) });
assert_eq!((0, 4), rules.get_points()); assert_eq!((0, 4), rules.get_points(5));
// Battre à faux une dame située dans la table des grands jans // Battre à faux une dame située dans la table des grands jans
let mut rules = PointsRules::default(); let mut rules = PointsRules::default();
@ -714,7 +722,7 @@ mod tests {
2, 0, -2, -1, -2, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, -2, -1, -2, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
]); ]);
rules.set_dice(Dice { values: (2, 4) }); rules.set_dice(Dice { values: (2, 4) });
assert_eq!((0, 2), rules.get_points()); assert_eq!((0, 2), rules.get_points(5));
// Pour chaque dé non jouable (dame impuissante) // Pour chaque dé non jouable (dame impuissante)
let mut rules = PointsRules::default(); let mut rules = PointsRules::default();
@ -722,6 +730,6 @@ mod tests {
2, 0, -2, -2, -2, 0, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, -2, -2, -2, 0, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
]); ]);
rules.set_dice(Dice { values: (2, 4) }); rules.set_dice(Dice { values: (2, 4) });
assert_eq!((0, 4), rules.get_points()); assert_eq!((0, 4), rules.get_points(5));
} }
} }

View file

@ -28,6 +28,9 @@ pub struct Player {
pub holes: u8, pub holes: u8,
pub can_bredouille: bool, pub can_bredouille: bool,
pub can_big_bredouille: bool, pub can_big_bredouille: bool,
/// Number of dice rolls since beginning of the current setting (all 15 dames in the talon )
/// (used to check jan de 3 coups)
pub dice_roll_count: u8,
} }
impl Player { impl Player {
@ -39,6 +42,7 @@ impl Player {
holes: 0, holes: 0,
can_bredouille: true, can_bredouille: true,
can_big_bredouille: true, can_big_bredouille: true,
dice_roll_count: 0,
} }
} }
@ -113,6 +117,7 @@ mod tests {
holes: 3, holes: 3,
can_bredouille: true, can_bredouille: true,
can_big_bredouille: false, can_big_bredouille: false,
dice_roll_count: 0,
}; };
println!("{}", player.to_bits_string()); println!("{}", player.to_bits_string());
assert!(player.to_bits_string() == "1011001110"); assert!(player.to_bits_string() == "1011001110");