feat: points : jan de mezeas, contre jan de 2 tables, contre jan de mezeas

This commit is contained in:
Henri Bourcereau 2024-09-18 17:35:36 +02:00
parent 6d785dcb94
commit 4f118319ed

View file

@ -17,11 +17,32 @@ enum Jan {
FirstPlayerToExit,
SixTables,
TwoTables,
Mezeas,
FalseHitSmallJan,
FalseHitBigJan,
ContreTwoTables,
ContreMezeas,
HelplessMan,
}
impl Jan {
pub fn get_points(&self, is_double: bool) -> i8 {
match self {
Self::FalseHitSmallJan | Self::ContreTwoTables | Self::ContreMezeas => {
if is_double {
-6
} else {
-4
}
}
Self::FalseHitBigJan | Self::HelplessMan => {
if is_double {
-4
} else {
-2
}
}
Self::TrueHitBigJan => {
if is_double {
4
@ -230,7 +251,13 @@ impl PointsRules {
let field2 = candidates_fields[1];
let dice1 = self.dice.values.0 as usize;
let dice2 = self.dice.values.1 as usize;
// Jan de 2 tables
// Jan de 2 tables et contre jan de 2 tables
let jan = if adv_corner_count == 0 {
Jan::TwoTables
} else {
Jan::ContreTwoTables
};
if (field1 + dice1 == 12 && field2 + dice2 == 13)
|| (field1 + dice2 == 12 && field2 + dice1 == 13)
{
@ -238,7 +265,7 @@ impl PointsRules {
CheckerMove::new(field1, 12).unwrap(),
CheckerMove::new(field2, 13).unwrap(),
)];
jans.insert(Jan::TwoTables, moves);
jans.insert(jan, moves);
} else if (field1 + dice1 == 13 && field2 + dice2 == 12)
|| (field1 + dice2 == 13 && field2 + dice1 == 12)
{
@ -246,12 +273,22 @@ impl PointsRules {
CheckerMove::new(field1, 13).unwrap(),
CheckerMove::new(field2, 12).unwrap(),
)];
jans.insert(Jan::TwoTables, moves);
jans.insert(jan, moves);
}
// Jan de Mezeas
// Contre jan de 2 tables
// Contre jan de Mezeas
// Jan de Mezeas et contre jan de Mezeas
let jan = if adv_corner_count == 0 {
Jan::Mezeas
} else {
Jan::ContreMezeas
};
if field1 == 12 && field2 == 12 && (dice1 == 1 || dice2 == 1) {
let moves = vec![(
CheckerMove::new(field1, field1 + dice1).unwrap(),
CheckerMove::new(field2, field2 + dice2).unwrap(),
)];
jans.insert(jan, moves);
}
}
jans
@ -327,43 +364,21 @@ impl PointsRules {
jans
}
pub fn get_points(&self) -> i8 {
let mut points: i8 = 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
// Battre le coin adverse
pub fn get_points(&self) -> (i8, i8) {
let jans = self.get_jans(&self.board);
points += jans.into_iter().fold(0, |acc: i8, (jan, moves)| {
let (points, adv_points) = jans
.into_iter()
.fold((0, 0), |acc: (i8, i8), (jan, moves)| {
println!("get_points : {:?}", jan);
acc + jan.get_points(self.dice.is_double()) * (moves.len() as i8)
let points = jan.get_points(self.dice.is_double()) * (moves.len() as i8);
if points < 0 {
(acc.0, acc.1 - points)
} else {
(acc.0 + points, acc.1)
}
});
// « 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();
// points += 4 * filling_moves_sequences.len() as i8;
// cf. https://fr.wikipedia.org/wiki/Trictrac
// Points par simple par moyen | Points par doublet par moyen Nombre de moyens possibles Bénéficiaire
// « JAN RARE »
// Jan de six tables 4 n/a 1 Joueur
// Jan de deux tables 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 mézéas 4 6 1 Adversaire
// « JAN QUI NE PEUT »
// Battre à faux une dame
// située dans la table des grands jans 2 4 1 Adversaire
// Battre à faux une dame
// située dans la table des petits jans 4 6 1 Adversaire
// Pour chaque dé non jouable (dame impuissante) 2 2 n/a Adversaire
// Conserver un petit jan, un grand jan ou un jan de retour 4 6 1 Joueur
// « AUTRE »
// Sortir le premier toutes ses dames 4 6 n/a Joueur
points
(points, adv_points)
}
}
@ -465,7 +480,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,
]);
rules.set_dice(Dice { values: (2, 3) });
assert_eq!(12, rules.get_points());
assert_eq!(12, rules.get_points().0);
// Battre à vrai une dame située dans la table des grands jans : 2 + 2 = 4
let mut rules = PointsRules::default();
@ -473,21 +488,21 @@ 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,
]);
rules.set_dice(Dice { values: (2, 4) });
assert_eq!(4, rules.get_points());
assert_eq!(4, rules.get_points().0);
// Battre à vrai le coin adverse par doublet : 6
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,
]);
rules.set_dice(Dice { values: (2, 2) });
assert_eq!(6, rules.get_points());
assert_eq!(6, rules.get_points().0);
// Cas de battage du coin de repos adverse impossible
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,
]);
rules.set_dice(Dice { values: (1, 1) });
assert_eq!(0, rules.get_points());
assert_eq!(0, rules.get_points().0);
// ---- Jan de remplissage
// Faire un petit jan : 4
@ -496,28 +511,28 @@ mod tests {
]);
rules.set_dice(Dice { values: (2, 1) });
assert_eq!(1, rules.get_jans(&rules.board).len());
assert_eq!(4, rules.get_points());
assert_eq!(4, rules.get_points().0);
// Faire un petit jan avec un doublet : 6
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,
]);
rules.set_dice(Dice { values: (1, 1) });
assert_eq!(6, rules.get_points());
assert_eq!(6, rules.get_points().0);
// Faire un petit jan avec 2 moyens : 6 + 6 = 12
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,
]);
rules.set_dice(Dice { values: (1, 1) });
assert_eq!(12, rules.get_points());
assert_eq!(12, rules.get_points().0);
// Conserver un jan avec un doublet : 6
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,
]);
rules.set_dice(Dice { values: (1, 1) });
assert_eq!(6, rules.get_points());
assert_eq!(6, rules.get_points().0);
// ---- Sorties
// Sortir toutes ses dames avant l'adversaire (simple)
@ -525,14 +540,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,
]);
rules.set_dice(Dice { values: (3, 1) });
assert_eq!(4, rules.get_points());
assert_eq!(4, rules.get_points().0);
// Sortir toutes ses dames avant l'adversaire (doublet)
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,
]);
rules.set_dice(Dice { values: (2, 2) });
assert_eq!(6, rules.get_points());
assert_eq!(6, rules.get_points().0);
// ---- JANS RARES
// Jan de six tables
@ -540,33 +555,55 @@ 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,
]);
rules.set_dice(Dice { values: (2, 3) });
assert_eq!(4, rules.get_points());
assert_eq!(4, rules.get_points().0);
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,
]);
rules.set_dice(Dice { values: (2, 3) });
assert_eq!(0, rules.get_points());
assert_eq!(0, rules.get_points().0);
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,
]);
rules.set_dice(Dice { values: (2, 3) });
assert_eq!(0, rules.get_points());
assert_eq!(0, rules.get_points().0);
// Jan de deux tables
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,
]);
rules.set_dice(Dice { values: (2, 2) });
assert_eq!(6, rules.get_points());
assert_eq!(6, rules.get_points().0);
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,
]);
rules.set_dice(Dice { values: (2, 2) });
assert_eq!(0, rules.get_points());
assert_eq!(0, rules.get_points().0);
// Contre jan de deux tables
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,
]);
rules.set_dice(Dice { values: (2, 2) });
assert_eq!((0, 6), rules.get_points());
// Jan de mézéas
// Contre jan de deux tables
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,
]);
rules.set_dice(Dice { values: (1, 1) });
assert_eq!(6, rules.get_points().0);
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,
]);
rules.set_dice(Dice { values: (1, 2) });
assert_eq!(4, rules.get_points().0);
// Contre jan de mézéas
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,
]);
rules.set_dice(Dice { values: (1, 1) });
assert_eq!((0, 6), rules.get_points());
// ---- JANS QUI NE PEUT
// Battre à faux une dame située dans la table des grands jans