moves allowed : check if player can fill a quarter

This commit is contained in:
Henri Bourcereau 2024-05-19 12:30:41 +02:00
parent 3c3c6d8458
commit 86220f6408
2 changed files with 75 additions and 3 deletions

View file

@ -476,8 +476,11 @@ impl GameState {
return false;
}
// --- remplir cadran si possible ----
// --- conserver cadran rempli si possible ----
// --- remplir cadran si possible & conserver cadran rempli si possible ----
let filling_moves_sequences = self.get_quarter_filling_moves_sequences(color);
if !filling_moves_sequences.contains(moves) && !filling_moves_sequences.is_empty() {
return false;
}
// no rule was broken
true
}
@ -490,6 +493,22 @@ impl GameState {
moves_seqs
}
fn get_quarter_filling_moves_sequences(
&self,
color: &Color,
) -> Vec<(CheckerMove, CheckerMove)> {
let mut moves_seqs = Vec::new();
for moves in self.get_possible_moves_sequences(color) {
let mut board = self.board.clone();
board.move_checker(color, moves.0).unwrap();
board.move_checker(color, moves.1).unwrap();
if board.any_quarter_filled(*color) {
moves_seqs.push(moves);
}
}
moves_seqs
}
fn get_possible_moves_sequences_by_dices(
&self,
color: &Color,
@ -993,7 +1012,7 @@ mod tests {
}
#[test]
fn move_check_fillable_quarter() {
fn move_check_oponnent_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,
@ -1015,4 +1034,38 @@ mod tests {
);
assert!(!state.moves_allowed(&Color::White, &moves));
}
#[test]
fn move_check_fillable_quarter() {
let mut state = GameState::default();
state.board.set_positions([
3, 3, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 1, 0,
]);
state.dice.values = (5, 4);
let moves = (
CheckerMove::new(1, 6).unwrap(),
CheckerMove::new(2, 6).unwrap(),
);
assert!(state.moves_allowed(&Color::White, &moves));
let moves = (
CheckerMove::new(1, 5).unwrap(),
CheckerMove::new(2, 7).unwrap(),
);
assert!(!state.moves_allowed(&Color::White, &moves));
state.board.set_positions([
2, 3, 2, 2, 3, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
]);
state.dice.values = (2, 3);
let moves = (
CheckerMove::new(6, 8).unwrap(),
CheckerMove::new(6, 9).unwrap(),
);
assert!(!state.moves_allowed(&Color::White, &moves));
let moves = (
CheckerMove::new(2, 4).unwrap(),
CheckerMove::new(5, 8).unwrap(),
);
assert!(state.moves_allowed(&Color::White, &moves));
}
}