This commit is contained in:
Henri Bourcereau 2024-06-24 18:10:24 +02:00
parent fb5e954b85
commit 41f8b0ac6e
2 changed files with 30 additions and 21 deletions

View file

@ -85,7 +85,7 @@ impl MoveRules {
}
let (dice1, dice2) = self.dice.values;
let (move1, move2): &(CheckerMove, CheckerMove) = &moves;
let (move1, move2): &(CheckerMove, CheckerMove) = moves;
let move1_dices = self.get_move_compatible_dices(move1);
if move1_dices.is_empty() {

View file

@ -105,6 +105,16 @@ impl PointsRules {
}
fn get_jans(&self, board_ini: &Board, dices: &Vec<u8>) -> PossibleJans {
let mut dices_reversed = dices.clone();
dices_reversed.reverse();
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);
jans.merge(jans_revert_dices);
jans
}
fn get_jans_by_dice_order(&self, board_ini: &Board, dices: &Vec<u8>) -> PossibleJans {
let mut jans = PossibleJans::default();
let mut dices = dices.clone();
if let Some(dice) = dices.pop() {
@ -157,13 +167,15 @@ impl PointsRules {
// Try tout d'une :
// - use original board before first die move
// - use a virtual dice by adding current dice to remaining dice
let next_dice_jan = self
.get_jans(&board_ini, &dices.iter().map(|d| d + dice).collect());
let next_dice_jan = self.get_jans_by_dice_order(
&board_ini,
&dices.iter().map(|d| d + dice).collect(),
);
jans.merge(next_dice_jan);
}
}
// Second die
let next_dice_jan = self.get_jans(&board_ini, &dices);
let next_dice_jan = self.get_jans_by_dice_order(&board_ini, &dices);
jans.merge(next_dice_jan);
}
}
@ -180,10 +192,7 @@ impl PointsRules {
pub fn get_points(&self) -> i8 {
let mut points: i8 = 0;
let mut jans = self.get_jans(&self.board, &vec![self.dice.values.0, self.dice.values.1]);
let jans_revert_dices =
self.get_jans(&self.board, &vec![self.dice.values.1, self.dice.values.0]);
jans.merge(jans_revert_dices);
let jans = self.get_jans(&self.board, &vec![self.dice.values.0, self.dice.values.1]);
points += jans.into_iter().fold(0, |acc: i8, (jan, moves)| {
acc + jan.get_points(self.dice.is_double()) * (moves.len() as i8)
});
@ -224,28 +233,28 @@ impl PointsRules {
mod tests {
use super::*;
#[test]
fn get_jans() {
fn get_jans_by_dice_order() {
let mut rules = PointsRules::default();
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,
]);
let jans = rules.get_jans(&rules.board, &vec![2, 3]);
let jans = rules.get_jans_by_dice_order(&rules.board, &vec![2, 3]);
assert_eq!(1, jans.len());
assert_eq!(3, jans.get(&Jan::TrueHitSmallJan).unwrap().len());
let jans = rules.get_jans(&rules.board, &vec![2, 2]);
let jans = rules.get_jans_by_dice_order(&rules.board, &vec![2, 2]);
assert_eq!(1, jans.len());
assert_eq!(1, jans.get(&Jan::TrueHitSmallJan).unwrap().len());
// On peut passer par un une dame battue pour battre une autre dame
// On peut passer par une dame battue pour battre une autre dame
// mais pas par une case remplie par l'adversaire
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,
]);
let mut jans = rules.get_jans(&rules.board, &vec![2, 3]);
let jans_revert_dices = rules.get_jans(&rules.board, &vec![3, 2]);
let mut jans = rules.get_jans_by_dice_order(&rules.board, &vec![2, 3]);
let jans_revert_dices = rules.get_jans_by_dice_order(&rules.board, &vec![3, 2]);
assert_eq!(1, jans.len());
assert_eq!(1, jans_revert_dices.len());
jans.merge(jans_revert_dices);
@ -255,7 +264,7 @@ mod tests {
2, 0, -1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
]);
let jans = rules.get_jans(&rules.board, &vec![2, 3]);
let jans = rules.get_jans_by_dice_order(&rules.board, &vec![2, 3]);
assert_eq!(1, jans.len());
assert_eq!(2, jans.get(&Jan::TrueHitSmallJan).unwrap().len());
@ -263,7 +272,7 @@ mod tests {
2, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
]);
let jans = rules.get_jans(&rules.board, &vec![2, 3]);
let jans = rules.get_jans_by_dice_order(&rules.board, &vec![2, 3]);
assert_eq!(1, jans.len());
assert_eq!(1, jans.get(&Jan::TrueHitSmallJan).unwrap().len());
@ -271,7 +280,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,
]);
let jans = rules.get_jans(&rules.board, &vec![2, 3]);
let jans = rules.get_jans_by_dice_order(&rules.board, &vec![2, 3]);
assert_eq!(1, jans.len());
assert_eq!(3, jans.get(&Jan::TrueHitSmallJan).unwrap().len());
@ -282,7 +291,7 @@ mod tests {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
]);
// le premier dé traité est le dernier du vecteur : 1
let jans = rules.get_jans(&rules.board, &vec![2, 1]);
let jans = rules.get_jans_by_dice_order(&rules.board, &vec![2, 1]);
// println!("jans (dés bloqués) : {:?}", jans.get(&Jan::TrueHit));
assert_eq!(0, jans.len());
@ -290,15 +299,15 @@ mod tests {
rules.board.set_positions([
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
]);
let mut jans = rules.get_jans(&rules.board, &vec![3, 3]);
let mut jans = rules.get_jans_by_dice_order(&rules.board, &vec![3, 3]);
assert_eq!(1, jans.len());
// premier dé bloqué, mais tout d'une possible en commençant par le second
rules.board.set_positions([
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
]);
let mut jans = rules.get_jans(&rules.board, &vec![3, 1]);
let jans_revert_dices = rules.get_jans(&rules.board, &vec![1, 3]);
let mut jans = rules.get_jans_by_dice_order(&rules.board, &vec![3, 1]);
let jans_revert_dices = rules.get_jans_by_dice_order(&rules.board, &vec![1, 3]);
assert_eq!(1, jans_revert_dices.len());
jans.merge(jans_revert_dices);