fix: check moves possibles : prevent the move of the same checker twice

This commit is contained in:
Henri Bourcereau 2025-08-02 12:41:52 +02:00
parent 2e0a874879
commit ad5ae17168

View file

@ -93,6 +93,18 @@ impl MoveRules {
/// ---- moves_possibles : First of three checks for moves /// ---- moves_possibles : First of three checks for moves
fn moves_possible(&self, moves: &(CheckerMove, CheckerMove)) -> bool { fn moves_possible(&self, moves: &(CheckerMove, CheckerMove)) -> bool {
let color = &Color::White; let color = &Color::White;
let move0_from = moves.0.get_from();
if 0 < move0_from && move0_from == moves.1.get_from() {
if let Ok((field_count, Some(field_color))) = self.board.get_field_checkers(move0_from)
{
if color != field_color || field_count < 2 {
info!("Move not physically possible");
return false;
}
}
}
if let Ok(chained_move) = moves.0.chain(moves.1) { if let Ok(chained_move) = moves.0.chain(moves.1) {
// Check intermediary move and chained_move : "Tout d'une" // Check intermediary move and chained_move : "Tout d'une"
if !self.board.passage_possible(color, &moves.0) if !self.board.passage_possible(color, &moves.0)
@ -1005,7 +1017,7 @@ mod tests {
#[test] #[test]
fn moves_possible() { fn moves_possible() {
let state = MoveRules::default(); let mut state = MoveRules::default();
// Chained moves // Chained moves
let moves = ( let moves = (
@ -1021,6 +1033,17 @@ mod tests {
); );
assert!(!state.moves_possible(&moves)); assert!(!state.moves_possible(&moves));
// Can't move the same checker twice
state.board.set_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,
]);
state.dice.values = (2, 1);
let moves = (
CheckerMove::new(3, 5).unwrap(),
CheckerMove::new(3, 4).unwrap(),
);
assert!(!state.moves_possible(&moves));
// black moves // black moves
let state = MoveRules::new(&Color::Black, &Board::default(), Dice::default()); let state = MoveRules::new(&Color::Black, &Board::default(), Dice::default());
let moves = ( let moves = (