fix: ajout étape de marquage de points par l'adversaire avant jet de dés

This commit is contained in:
Henri Bourcereau 2024-09-20 20:39:18 +02:00
parent 4c17148315
commit 08fd067a95
3 changed files with 27 additions and 12 deletions

View file

@ -52,6 +52,10 @@ impl Bot {
// println!("bot player_id {:?}", self.player_id); // println!("bot player_id {:?}", self.player_id);
if self.game.active_player_id == self.player_id { if self.game.active_player_id == self.player_id {
return match self.game.turn_stage { return match self.game.turn_stage {
TurnStage::MarkAdvPoints => Some(GameEvent::Mark {
player_id: self.player_id,
points: self.calculate_adv_points(),
}),
TurnStage::RollDice => Some(GameEvent::Roll { TurnStage::RollDice => Some(GameEvent::Roll {
player_id: self.player_id, player_id: self.player_id,
}), }),
@ -70,8 +74,13 @@ impl Bot {
} }
fn calculate_points(&self) -> u8 { fn calculate_points(&self) -> u8 {
// self.game.get_points().iter().map(|r| r.0).sum() let points_rules = PointsRules::new(&Color::White, &self.game.board, self.game.dice);
0 points_rules.get_points().0
}
fn calculate_adv_points(&self) -> u8 {
let points_rules = PointsRules::new(&Color::White, &self.game.board, self.game.dice);
points_rules.get_points().1
} }
fn choose_move(&self) -> (CheckerMove, CheckerMove) { fn choose_move(&self) -> (CheckerMove, CheckerMove) {

View file

@ -28,6 +28,7 @@ pub enum TurnStage {
RollWaiting, RollWaiting,
MarkPoints, MarkPoints,
Move, Move,
MarkAdvPoints,
} }
/// Represents a TricTrac game /// Represents a TricTrac game
@ -105,12 +106,13 @@ impl GameState {
.unwrap_or('0'), // White by default .unwrap_or('0'), // White by default
); );
// step -> 2 bits // step -> 3 bits
let step_bits = match self.turn_stage { let step_bits = match self.turn_stage {
TurnStage::RollWaiting => "00", TurnStage::RollWaiting => "000",
TurnStage::RollDice => "01", TurnStage::RollDice => "001",
TurnStage::MarkPoints => "10", TurnStage::MarkPoints => "010",
TurnStage::Move => "11", TurnStage::Move => "011",
TurnStage::MarkAdvPoints => "100",
}; };
pos_bits.push_str(step_bits); pos_bits.push_str(step_bits);
@ -365,7 +367,11 @@ impl GameState {
Mark { player_id, points } => { Mark { player_id, points } => {
self.mark_points(*player_id, *points); self.mark_points(*player_id, *points);
if self.stage != Stage::Ended { if self.stage != Stage::Ended {
self.turn_stage = TurnStage::Move; self.turn_stage = if self.turn_stage == TurnStage::MarkAdvPoints {
TurnStage::RollDice
} else {
TurnStage::Move
};
} }
} }
Move { player_id, moves } => { Move { player_id, moves } => {
@ -373,7 +379,7 @@ impl GameState {
self.board.move_checker(&player.color, moves.0).unwrap(); self.board.move_checker(&player.color, moves.0).unwrap();
self.board.move_checker(&player.color, moves.1).unwrap(); self.board.move_checker(&player.color, moves.1).unwrap();
self.active_player_id = *self.players.keys().find(|id| *id != player_id).unwrap(); self.active_player_id = *self.players.keys().find(|id| *id != player_id).unwrap();
self.turn_stage = TurnStage::RollDice; self.turn_stage = TurnStage::MarkAdvPoints;
} }
} }
@ -446,6 +452,6 @@ mod tests {
state.add_player(2, Player::new("player2".into(), Color::Black)); state.add_player(2, Player::new("player2".into(), Color::Black));
let string_id = state.to_string_id(); let string_id = state.to_string_id();
// println!("string_id : {}", string_id); // println!("string_id : {}", string_id);
assert!(string_id == "Dz8+AAAAAT8/MAAAAAQAADAD"); assert!(string_id == "Hz88AAAAAz8/IAAAAAQAADAD");
} }
} }

View file

@ -441,7 +441,7 @@ impl PointsRules {
jans jans
} }
pub fn get_points(&self) -> (i8, i8) { pub fn get_points(&self) -> (u8, u8) {
let jans = self.get_jans(&self.board); let jans = self.get_jans(&self.board);
let (points, adv_points) = jans let (points, adv_points) = jans
.into_iter() .into_iter()
@ -460,7 +460,7 @@ impl PointsRules {
} }
}); });
(points, adv_points) (points as u8, adv_points as u8)
} }
} }