fix: exit with farthest rule (2)
This commit is contained in:
parent
8732512736
commit
bd4c75228b
1 changed files with 34 additions and 18 deletions
|
|
@ -361,17 +361,24 @@ impl MoveRules {
|
||||||
let _ = board_to_check.move_checker(&Color::White, moves.0);
|
let _ = board_to_check.move_checker(&Color::White, moves.0);
|
||||||
let farthest_on_move2 = Self::get_board_exit_farthest(&board_to_check);
|
let farthest_on_move2 = Self::get_board_exit_farthest(&board_to_check);
|
||||||
|
|
||||||
let (is_move1_exedant, is_move2_exedant) = self.move_excedants(moves);
|
// dice normal order
|
||||||
if (is_move1_exedant && moves.0.get_from() != farthest_on_move1)
|
let (is_move1_exedant, is_move2_exedant) = self.move_excedants(moves, true);
|
||||||
|| (is_move2_exedant && moves.1.get_from() != farthest_on_move2)
|
let is_not_farthest1 = (is_move1_exedant && moves.0.get_from() != farthest_on_move1)
|
||||||
{
|
|| (is_move2_exedant && moves.1.get_from() != farthest_on_move2);
|
||||||
|
|
||||||
|
// dice reversed order
|
||||||
|
let (is_move1_exedant, is_move2_exedant) = self.move_excedants(moves, false);
|
||||||
|
let is_not_farthest2 = (is_move1_exedant && moves.0.get_from() != farthest_on_move1)
|
||||||
|
|| (is_move2_exedant && moves.1.get_from() != farthest_on_move2);
|
||||||
|
|
||||||
|
if is_not_farthest1 && is_not_farthest2 {
|
||||||
return Err(MoveError::ExitNotFarthest);
|
return Err(MoveError::ExitNotFarthest);
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn move_excedants(&self, moves: &(CheckerMove, CheckerMove)) -> (bool, bool) {
|
fn move_excedants(&self, moves: &(CheckerMove, CheckerMove), dice_order: bool) -> (bool, bool) {
|
||||||
let move1to = if moves.0.get_to() == 0 {
|
let move1to = if moves.0.get_to() == 0 {
|
||||||
25
|
25
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -386,20 +393,16 @@ impl MoveRules {
|
||||||
};
|
};
|
||||||
let dist2 = move2to - moves.1.get_from();
|
let dist2 = move2to - moves.1.get_from();
|
||||||
|
|
||||||
let dist_min = cmp::min(dist1, dist2);
|
let (dice1, dice2) = if dice_order {
|
||||||
let dist_max = cmp::max(dist1, dist2);
|
self.dice.values
|
||||||
|
|
||||||
let dice_min = cmp::min(self.dice.values.0, self.dice.values.1) as usize;
|
|
||||||
let dice_max = cmp::max(self.dice.values.0, self.dice.values.1) as usize;
|
|
||||||
|
|
||||||
let min_excedant = dist_min != 0 && dist_min < dice_min;
|
|
||||||
let max_excedant = dist_max != 0 && dist_max < dice_max;
|
|
||||||
|
|
||||||
if dist_min == dist1 {
|
|
||||||
(min_excedant, max_excedant)
|
|
||||||
} else {
|
} else {
|
||||||
(max_excedant, min_excedant)
|
(self.dice.values.1, self.dice.values.0)
|
||||||
}
|
};
|
||||||
|
|
||||||
|
(
|
||||||
|
dist1 != 0 && dist1 < dice1 as usize,
|
||||||
|
dist2 != 0 && dist2 < dice2 as usize,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_board_exit_farthest(board: &Board) -> Field {
|
fn get_board_exit_farthest(board: &Board) -> Field {
|
||||||
|
|
@ -1587,6 +1590,19 @@ mod tests {
|
||||||
CheckerMove::new(22, 0).unwrap(),
|
CheckerMove::new(22, 0).unwrap(),
|
||||||
);
|
);
|
||||||
assert!(state.check_exit_rules(&moves).is_ok());
|
assert!(state.check_exit_rules(&moves).is_ok());
|
||||||
|
|
||||||
|
state.dice.values = (6, 4);
|
||||||
|
state.board.set_positions(
|
||||||
|
&crate::Color::White,
|
||||||
|
[
|
||||||
|
-4, -1, -2, -1, 0, 0, 0, -1, 0, 0, 0, 0, -5, -1, 0, 0, 0, 0, 2, 3, 2, 2, 5, 1,
|
||||||
|
],
|
||||||
|
);
|
||||||
|
let moves = (
|
||||||
|
CheckerMove::new(20, 24).unwrap(),
|
||||||
|
CheckerMove::new(23, 0).unwrap(),
|
||||||
|
);
|
||||||
|
assert!(state.check_exit_rules(&moves).is_ok());
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue