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

@ -384,6 +384,25 @@ impl Board {
has_checker && !blocked
}
/// Return if there is a quarter filled by the color
pub fn any_quarter_filled(&self, color: Color) -> bool {
[1, 7, 13, 19]
.iter()
.any(|field| self.is_quarter_filled(color, *field))
}
/// Return if the quarter containing `field` is filled by the `color`
pub fn is_quarter_filled(&self, color: Color, field: Field) -> bool {
let fields = self.get_quarter_fields(field);
!fields.iter().any(|field| {
if color == Color::White {
self.positions[field - 1] < 1
} else {
self.positions[field - 1] > -1
}
})
}
/// Returns whether the `color` player can still fill the quarter containing the `field`
/// * `color` - color of the player
/// * `field` - field belonging to the quarter

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));
}
}