moves allowed : check if player can fill a quarter
This commit is contained in:
parent
3c3c6d8458
commit
86220f6408
|
|
@ -384,6 +384,25 @@ impl Board {
|
||||||
has_checker && !blocked
|
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`
|
/// Returns whether the `color` player can still fill the quarter containing the `field`
|
||||||
/// * `color` - color of the player
|
/// * `color` - color of the player
|
||||||
/// * `field` - field belonging to the quarter
|
/// * `field` - field belonging to the quarter
|
||||||
|
|
|
||||||
|
|
@ -476,8 +476,11 @@ impl GameState {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// --- remplir cadran si possible ----
|
// --- remplir cadran si possible & conserver cadran rempli 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
|
// no rule was broken
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
|
@ -490,6 +493,22 @@ impl GameState {
|
||||||
moves_seqs
|
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(
|
fn get_possible_moves_sequences_by_dices(
|
||||||
&self,
|
&self,
|
||||||
color: &Color,
|
color: &Color,
|
||||||
|
|
@ -993,7 +1012,7 @@ mod tests {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn move_check_fillable_quarter() {
|
fn move_check_oponnent_fillable_quarter() {
|
||||||
let mut state = GameState::default();
|
let mut state = GameState::default();
|
||||||
state.board.set_positions([
|
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,
|
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));
|
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));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue