wip filled quarters points

This commit is contained in:
Henri Bourcereau 2024-06-24 21:22:27 +02:00
parent 41f8b0ac6e
commit 14baf5c9e3
2 changed files with 52 additions and 15 deletions

View file

@ -811,4 +811,16 @@ mod tests {
); );
assert!(state.moves_possible(&moves)); assert!(state.moves_possible(&moves));
} }
#[test]
fn filling_moves_sequences() {
let mut state = MoveRules::default();
state.board.set_positions([
3, 1, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
]);
state.dice.values = (2, 1);
let filling_moves_sequences = state.get_quarter_filling_moves_sequences();
println!("{:?}", filling_moves_sequences);
assert_eq!(2, filling_moves_sequences.len());
}
} }

View file

@ -104,13 +104,24 @@ impl PointsRules {
} }
} }
fn get_jans(&self, board_ini: &Board, dices: &Vec<u8>) -> PossibleJans { fn get_jans(&self, board_ini: &Board) -> PossibleJans {
let mut dices_reversed = dices.clone(); let dices = &vec![self.dice.values.0, self.dice.values.1];
dices_reversed.reverse(); let dices_reversed = &vec![self.dice.values.1, self.dice.values.0];
// « JAN DE RÉCOMPENSE »
// Battre à vrai une dame située dans la table des grands jans
// Battre à vrai une dame située dans la table des petits jans
let mut jans = self.get_jans_by_dice_order(board_ini, dices); let mut jans = self.get_jans_by_dice_order(board_ini, dices);
let jans_revert_dices = self.get_jans_by_dice_order(board_ini, &dices_reversed); let jans_revert_dices = self.get_jans_by_dice_order(board_ini, dices_reversed);
jans.merge(jans_revert_dices); jans.merge(jans_revert_dices);
// « JAN DE REMPLISSAGE »
// Faire un petit jan, un grand jan ou un jan de retour
let filling_moves_sequences = self.move_rules.get_quarter_filling_moves_sequences();
if !filling_moves_sequences.is_empty() {
jans.insert(Jan::FilledQuarter, filling_moves_sequences);
}
jans jans
} }
@ -192,14 +203,20 @@ impl PointsRules {
pub fn get_points(&self) -> i8 { pub fn get_points(&self) -> i8 {
let mut points: i8 = 0; let mut points: i8 = 0;
let jans = self.get_jans(&self.board, &vec![self.dice.values.0, self.dice.values.1]); // « JAN DE RÉCOMPENSE »
// Battre à vrai une dame située dans la table des grands jans
// Battre à vrai une dame située dans la table des petits jans
// TODO : Battre le coin adverse
let jans = self.get_jans(&self.board);
points += jans.into_iter().fold(0, |acc: i8, (jan, moves)| { points += jans.into_iter().fold(0, |acc: i8, (jan, moves)| {
acc + jan.get_points(self.dice.is_double()) * (moves.len() as i8) acc + jan.get_points(self.dice.is_double()) * (moves.len() as i8)
}); });
// Jans de remplissage // « JAN DE REMPLISSAGE »
let filling_moves_sequences = self.move_rules.get_quarter_filling_moves_sequences(); // Faire un petit jan, un grand jan ou un jan de retour
points += 4 * filling_moves_sequences.len() as i8; // let filling_moves_sequences = self.move_rules.get_quarter_filling_moves_sequences();
// points += 4 * filling_moves_sequences.len() as i8;
// cf. https://fr.wikipedia.org/wiki/Trictrac // cf. https://fr.wikipedia.org/wiki/Trictrac
// Points par simple par moyen | Points par doublet par moyen Nombre de moyens possibles Bénéficiaire // Points par simple par moyen | Points par doublet par moyen Nombre de moyens possibles Bénéficiaire
// « JAN RARE » // « JAN RARE »
@ -208,19 +225,12 @@ impl PointsRules {
// Jan de mézéas 4 6 1 Joueur // Jan de mézéas 4 6 1 Joueur
// Contre jan de deux tables 4 6 1 Adversaire // Contre jan de deux tables 4 6 1 Adversaire
// Contre jan de mézéas 4 6 1 Adversaire // Contre jan de mézéas 4 6 1 Adversaire
// « JAN DE RÉCOMPENSE »
// Battre à vrai une dame située dans la table des grands jans 2 | 4 1, 2 ou 3 (sauf doublet) Joueur
// Battre à vrai une dame située dans la table des petits jans 4 | 6 1, 2 ou 3 Joueur
// Battre le coin adverse 4 6 1 Joueur
// « JAN QUI NE PEUT » // « JAN QUI NE PEUT »
// Battre à faux une dame // Battre à faux une dame
// située dans la table des grands jans 2 4 1 Adversaire // située dans la table des grands jans 2 4 1 Adversaire
// Battre à faux une dame // Battre à faux une dame
// située dans la table des petits jans 4 6 1 Adversaire // située dans la table des petits jans 4 6 1 Adversaire
// Pour chaque dé non jouable (dame impuissante) 2 2 n/a Adversaire // Pour chaque dé non jouable (dame impuissante) 2 2 n/a Adversaire
// « JAN DE REMPLISSAGE »
// Faire un petit jan, un grand jan ou un jan de retour 4 1, 2, ou 3 Joueur
// 6 1 ou 2 Joueur
// Conserver un petit jan, un grand jan ou un jan de retour 4 6 1 Joueur // Conserver un petit jan, un grand jan ou un jan de retour 4 6 1 Joueur
// « AUTRE » // « AUTRE »
// Sortir le premier toutes ses dames 4 6 n/a Joueur // Sortir le premier toutes ses dames 4 6 n/a Joueur
@ -320,11 +330,26 @@ mod tests {
#[test] #[test]
fn get_points() { fn get_points() {
// ----- Jan de récompense
let mut rules = PointsRules::default(); let mut rules = PointsRules::default();
rules.board.set_positions([ rules.board.set_positions([
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.dice = Dice { values: (2, 3) }; rules.dice = Dice { values: (2, 3) };
assert_eq!(12, rules.get_points()); assert_eq!(12, rules.get_points());
// ---- Jan de remplissage
let mut rules = PointsRules::default();
rules.board.set_positions([
2, 0, 1, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
]);
rules.dice = Dice { values: (1, 1) };
assert_eq!(6, rules.get_points());
rules.board.set_positions([
3, 1, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
]);
rules.dice = Dice { values: (2, 1) };
assert_eq!(8, rules.get_points());
} }
} }