moves allowed : check if opponent corner can be filled #2
This commit is contained in:
parent
84b5ab6a5f
commit
3c3c6d8458
|
|
@ -37,7 +37,7 @@ Si on peut remplir le coin de l'adversaire avec deux dames (ce qui est interdit)
|
|||
|
||||
Si on a le choix entre remplir son coin directement ou par puissance, on doit obligatoirement le faire directement.
|
||||
|
||||
Tant que l'adversaire à la possibilité de remplir un cadran, on ne peut pas jouer dans ce cadran.
|
||||
Tant que l'adversaire à la possibilité de remplir un des deux cadrans de son côté (son jeu "ordinaire", par opposition au jeu "de retour"), on ne peut pas jouer dans ce cadran.
|
||||
|
||||
Quand on joue dans ses propres deux cadrans, on dit qu'on joue le jeu ordinaire
|
||||
Quand on joue dans les deux cadrans de l'adversaire, on dit qu'on joue le jeu de retour
|
||||
|
|
|
|||
|
|
@ -103,6 +103,9 @@ impl Board {
|
|||
}
|
||||
|
||||
pub fn count_checkers(&self, color: Color, from: Field, to: Field) -> u8 {
|
||||
if to == 0 || from == 0 {
|
||||
return 0;
|
||||
}
|
||||
self.positions[(from - 1)..to]
|
||||
.iter()
|
||||
.filter(|count| {
|
||||
|
|
@ -421,6 +424,9 @@ impl Board {
|
|||
|
||||
/// Returns the 6 fields of the quarter containing the `field`
|
||||
fn get_quarter_fields(&self, field: Field) -> [Field; 6] {
|
||||
if field == 0 {
|
||||
return [0; 6];
|
||||
}
|
||||
let min = 1 + ((field - 1) / 6) * 6;
|
||||
core::array::from_fn(|i| i + min)
|
||||
}
|
||||
|
|
@ -548,5 +554,9 @@ mod tests {
|
|||
assert!(!board.is_quarter_fillable(Color::Black, 24));
|
||||
assert!(!board.is_quarter_fillable(Color::White, 1));
|
||||
assert!(board.is_quarter_fillable(Color::White, 12));
|
||||
board.set_positions([
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, -12, 0, 0, 0, 0, 1, 0,
|
||||
]);
|
||||
assert!(board.is_quarter_fillable(Color::Black, 16));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -456,9 +456,28 @@ impl GameState {
|
|||
}
|
||||
}
|
||||
|
||||
// --- interdit de jouer dans cadran que l'adversaire peut encore remplir ----
|
||||
let farthest = if *color == Color::White {
|
||||
cmp::max(moves.0.get_to(), moves.1.get_to())
|
||||
} else {
|
||||
cmp::min(moves.0.get_to(), moves.1.get_to())
|
||||
};
|
||||
let in_opponent_side = if *color == Color::White {
|
||||
farthest > 12
|
||||
} else {
|
||||
farthest < 13
|
||||
};
|
||||
|
||||
if in_opponent_side
|
||||
&& self
|
||||
.board
|
||||
.is_quarter_fillable(color.opponent_color(), farthest)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
// --- remplir cadran si possible ----
|
||||
// --- conserver cadran rempli si possible ----
|
||||
// --- interdit de jouer dans cadran que l'adversaire peut encore remplir ----
|
||||
// no rule was broken
|
||||
true
|
||||
}
|
||||
|
|
@ -972,4 +991,28 @@ mod tests {
|
|||
assert!(state.moves_follows_dices(&Color::White, &moves));
|
||||
assert!(state.moves_allowed(&Color::White, &moves));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn move_check_fillable_quarter() {
|
||||
let mut state = GameState::default();
|
||||
state.board.set_positions([
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 1, 0,
|
||||
]);
|
||||
state.dice.values = (5, 5);
|
||||
let moves = (
|
||||
CheckerMove::new(11, 16).unwrap(),
|
||||
CheckerMove::new(11, 16).unwrap(),
|
||||
);
|
||||
assert!(state.moves_allowed(&Color::White, &moves));
|
||||
|
||||
state.board.set_positions([
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, -12, 0, 0, 0, 0, 1, 0,
|
||||
]);
|
||||
state.dice.values = (5, 5);
|
||||
let moves = (
|
||||
CheckerMove::new(11, 16).unwrap(),
|
||||
CheckerMove::new(11, 16).unwrap(),
|
||||
);
|
||||
assert!(!state.moves_allowed(&Color::White, &moves));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue