refact
This commit is contained in:
parent
fb5e954b85
commit
41f8b0ac6e
|
|
@ -85,7 +85,7 @@ impl MoveRules {
|
||||||
}
|
}
|
||||||
|
|
||||||
let (dice1, dice2) = self.dice.values;
|
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);
|
let move1_dices = self.get_move_compatible_dices(move1);
|
||||||
if move1_dices.is_empty() {
|
if move1_dices.is_empty() {
|
||||||
|
|
|
||||||
|
|
@ -105,6 +105,16 @@ impl PointsRules {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_jans(&self, board_ini: &Board, dices: &Vec<u8>) -> PossibleJans {
|
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 jans = PossibleJans::default();
|
||||||
let mut dices = dices.clone();
|
let mut dices = dices.clone();
|
||||||
if let Some(dice) = dices.pop() {
|
if let Some(dice) = dices.pop() {
|
||||||
|
|
@ -157,13 +167,15 @@ impl PointsRules {
|
||||||
// Try tout d'une :
|
// Try tout d'une :
|
||||||
// - use original board before first die move
|
// - use original board before first die move
|
||||||
// - use a virtual dice by adding current dice to remaining dice
|
// - use a virtual dice by adding current dice to remaining dice
|
||||||
let next_dice_jan = self
|
let next_dice_jan = self.get_jans_by_dice_order(
|
||||||
.get_jans(&board_ini, &dices.iter().map(|d| d + dice).collect());
|
&board_ini,
|
||||||
|
&dices.iter().map(|d| d + dice).collect(),
|
||||||
|
);
|
||||||
jans.merge(next_dice_jan);
|
jans.merge(next_dice_jan);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Second die
|
// 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);
|
jans.merge(next_dice_jan);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -180,10 +192,7 @@ 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 mut jans = self.get_jans(&self.board, &vec![self.dice.values.0, self.dice.values.1]);
|
let 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);
|
|
||||||
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)
|
||||||
});
|
});
|
||||||
|
|
@ -224,28 +233,28 @@ impl PointsRules {
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
#[test]
|
#[test]
|
||||||
fn get_jans() {
|
fn get_jans_by_dice_order() {
|
||||||
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,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
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.len());
|
||||||
assert_eq!(3, jans.get(&Jan::TrueHitSmallJan).unwrap().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.len());
|
||||||
assert_eq!(1, jans.get(&Jan::TrueHitSmallJan).unwrap().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
|
// mais pas par une case remplie par l'adversaire
|
||||||
rules.board.set_positions([
|
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,
|
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 mut jans = rules.get_jans_by_dice_order(&rules.board, &vec![2, 3]);
|
||||||
let jans_revert_dices = rules.get_jans(&rules.board, &vec![3, 2]);
|
let jans_revert_dices = rules.get_jans_by_dice_order(&rules.board, &vec![3, 2]);
|
||||||
assert_eq!(1, jans.len());
|
assert_eq!(1, jans.len());
|
||||||
assert_eq!(1, jans_revert_dices.len());
|
assert_eq!(1, jans_revert_dices.len());
|
||||||
jans.merge(jans_revert_dices);
|
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,
|
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!(1, jans.len());
|
||||||
assert_eq!(2, jans.get(&Jan::TrueHitSmallJan).unwrap().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,
|
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.len());
|
||||||
assert_eq!(1, jans.get(&Jan::TrueHitSmallJan).unwrap().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,
|
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!(1, jans.len());
|
||||||
assert_eq!(3, jans.get(&Jan::TrueHitSmallJan).unwrap().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,
|
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
|
// 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));
|
// println!("jans (dés bloqués) : {:?}", jans.get(&Jan::TrueHit));
|
||||||
assert_eq!(0, jans.len());
|
assert_eq!(0, jans.len());
|
||||||
|
|
||||||
|
|
@ -290,15 +299,15 @@ mod tests {
|
||||||
rules.board.set_positions([
|
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,
|
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());
|
assert_eq!(1, jans.len());
|
||||||
|
|
||||||
// premier dé bloqué, mais tout d'une possible en commençant par le second
|
// premier dé bloqué, mais tout d'une possible en commençant par le second
|
||||||
rules.board.set_positions([
|
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,
|
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 mut jans = rules.get_jans_by_dice_order(&rules.board, &vec![3, 1]);
|
||||||
let jans_revert_dices = rules.get_jans(&rules.board, &vec![1, 3]);
|
let jans_revert_dices = rules.get_jans_by_dice_order(&rules.board, &vec![1, 3]);
|
||||||
assert_eq!(1, jans_revert_dices.len());
|
assert_eq!(1, jans_revert_dices.len());
|
||||||
|
|
||||||
jans.merge(jans_revert_dices);
|
jans.merge(jans_revert_dices);
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue