feat: points : sortir le premier toutes ses dames

This commit is contained in:
Henri Bourcereau 2024-09-16 16:29:36 +02:00
parent 5fd11f7ef2
commit 8be3de3ede

View file

@ -1,3 +1,4 @@
use std::cmp;
use std::collections::HashMap; use std::collections::HashMap;
use crate::board::{Board, EMPTY_MOVE}; use crate::board::{Board, EMPTY_MOVE};
@ -13,6 +14,7 @@ enum Jan {
TrueHitSmallJan, TrueHitSmallJan,
TrueHitBigJan, TrueHitBigJan,
TrueHitOpponentCorner, TrueHitOpponentCorner,
FirstPlayerToExit,
// jans de récompense : // jans de récompense :
// - battre une dame seule (par autant de façons de le faire, y compris // - battre une dame seule (par autant de façons de le faire, y compris
// utilisant une dame du coin de repos) // utilisant une dame du coin de repos)
@ -169,6 +171,39 @@ impl PointsRules {
jans.insert(Jan::FilledQuarter, filling_moves_sequences); jans.insert(Jan::FilledQuarter, filling_moves_sequences);
} }
// « AUTRE »
// sortir le premier toutes ses dames
let mut checkers = board_ini.get_color_fields(Color::White);
checkers.sort_by(|a, b| b.0.cmp(&a.0));
let checkers_count = checkers.iter().fold(0, |acc, (_f, count)| acc + count);
if checkers_count < 3 {
let mut farthest = 24;
let mut next_farthest = 24;
if let Some((field, count)) = checkers.first() {
farthest = *field;
if *count > 1 {
next_farthest = *field;
} else if let Some((field, _count)) = checkers.get(1) {
next_farthest = *field;
}
}
if farthest + cmp::max(self.dice.values.0, self.dice.values.1) as usize > 23
&& next_farthest + cmp::min(self.dice.values.0, self.dice.values.1) as usize > 23
{
let exit_moves = vec![(
CheckerMove::new(farthest, 0).unwrap(),
if checkers_count > 1 {
CheckerMove::new(next_farthest, 0).unwrap()
} else {
CheckerMove::new(0, 0).unwrap()
},
)];
jans.insert(Jan::FirstPlayerToExit, exit_moves);
}
}
jans jans
} }
@ -433,5 +468,19 @@ mod tests {
]); ]);
rules.set_dice(Dice { values: (1, 1) }); rules.set_dice(Dice { values: (1, 1) });
assert_eq!(6, rules.get_points()); assert_eq!(6, rules.get_points());
// Sortir toutes ses dames avant l'adversaire (simple)
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, 1,
]);
rules.set_dice(Dice { values: (3, 1) });
assert_eq!(4, rules.get_points());
// 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());
} }
} }