wip mirror

This commit is contained in:
Henri Bourcereau 2025-08-05 21:53:42 +02:00
parent f9f4405943
commit 3dce910bea
3 changed files with 45 additions and 18 deletions

View file

@ -64,6 +64,7 @@ impl Bot {
pub fn handle_event(&mut self, event: &GameEvent) -> Option<GameEvent> { pub fn handle_event(&mut self, event: &GameEvent) -> Option<GameEvent> {
let game = self.strategy.get_mut_game(); let game = self.strategy.get_mut_game();
// println!("----- before : {:?}", game);
let internal_event = if self.color == Color::Black { let internal_event = if self.color == Color::Black {
&event.get_mirror() &event.get_mirror()
} else { } else {
@ -74,42 +75,53 @@ impl Bot {
if game.stage == Stage::Ended { if game.stage == Stage::Ended {
return None; return None;
} }
// TODO mirror let active_player_id = if self.color == Color::Black {
if game.active_player_id == self.player_id { if game.active_player_id == 1 {
return match game.turn_stage { 2
} else {
1
}
} else {
game.active_player_id
};
if active_player_id == self.player_id {
let internal_event = match game.turn_stage {
TurnStage::MarkAdvPoints => Some(GameEvent::Mark { TurnStage::MarkAdvPoints => Some(GameEvent::Mark {
player_id: self.player_id, player_id: 1,
points: self.strategy.calculate_adv_points(), points: self.strategy.calculate_adv_points(),
}), }),
TurnStage::RollDice => Some(GameEvent::Roll { TurnStage::RollDice => Some(GameEvent::Roll { player_id: 1 }),
player_id: self.player_id,
}),
TurnStage::MarkPoints => Some(GameEvent::Mark { TurnStage::MarkPoints => Some(GameEvent::Mark {
player_id: self.player_id, player_id: 1,
points: self.strategy.calculate_points(), points: self.strategy.calculate_points(),
}), }),
TurnStage::Move => Some(GameEvent::Move { TurnStage::Move => Some(GameEvent::Move {
player_id: self.player_id, player_id: 1,
moves: self.strategy.choose_move(), moves: self.strategy.choose_move(),
}), }),
TurnStage::HoldOrGoChoice => { TurnStage::HoldOrGoChoice => {
if self.strategy.choose_go() { if self.strategy.choose_go() {
Some(GameEvent::Go { Some(GameEvent::Go { player_id: 1 })
player_id: self.player_id,
})
} else { } else {
Some(GameEvent::Move { Some(GameEvent::Move {
player_id: self.player_id, player_id: 1,
moves: self.strategy.choose_move(), moves: self.strategy.choose_move(),
}) })
} }
} }
_ => None, _ => None,
}; };
return if self.color == Color::Black {
println!(" evt : {:?}", internal_event);
internal_event.map(|evt| evt.get_mirror())
} else {
internal_event
};
} }
None None
} }
// Only used in tests below
pub fn get_state(&self) -> &GameState { pub fn get_state(&self) -> &GameState {
self.strategy.get_game() self.strategy.get_game()
} }
@ -128,17 +140,31 @@ mod tests {
} }
#[test] #[test]
fn test_consume() { fn test_handle_event() {
let mut bot = Bot::new(Box::new(DefaultStrategy::default()), Color::Black); let mut bot = Bot::new(Box::new(DefaultStrategy::default()), Color::Black);
// let mut bot = Bot::new(Box::new(DefaultStrategy::default()), Color::Black, false); // let mut bot = Bot::new(Box::new(DefaultStrategy::default()), Color::Black, false);
let mut event = bot.handle_event(&GameEvent::BeginGame { goes_first: 2 }); let mut event = bot.handle_event(&GameEvent::BeginGame { goes_first: 2 });
assert_eq!(event, Some(GameEvent::Roll { player_id: 2 })); assert_eq!(event, Some(GameEvent::Roll { player_id: 2 }));
assert_eq!(bot.get_state().active_player_id, 2); assert_eq!(bot.get_state().active_player_id, 1); // bot internal active_player_id for black
event = bot.handle_event(&GameEvent::RollResult {
player_id: 2,
dice: Dice { values: (2, 3) },
});
assert_eq!(
event,
Some(GameEvent::Move {
player_id: 2,
moves: (
CheckerMove::new(24, 21).unwrap(),
CheckerMove::new(24, 22).unwrap()
)
})
);
event = bot.handle_event(&GameEvent::BeginGame { goes_first: 1 }); event = bot.handle_event(&GameEvent::BeginGame { goes_first: 1 });
assert_eq!(event, None); assert_eq!(event, None);
assert_eq!(bot.get_state().active_player_id, 1); assert_eq!(bot.get_state().active_player_id, 2); //internal active_player_id
bot.handle_event(&GameEvent::RollResult { bot.handle_event(&GameEvent::RollResult {
player_id: 1, player_id: 1,
dice: Dice { values: (2, 3) }, dice: Dice { values: (2, 3) },

View file

@ -67,6 +67,7 @@ impl GameRunner {
} else { } else {
println!("{}", self.state); println!("{}", self.state);
println!("event not valid : {:?}", event); println!("event not valid : {:?}", event);
panic!("crash and burn");
&GameEvent::PlayError &GameEvent::PlayError
}; };

View file

@ -9,8 +9,8 @@ shell:
runcli: runcli:
RUST_LOG=info cargo run --bin=client_cli RUST_LOG=info cargo run --bin=client_cli
runclibots: runclibots:
#RUST_LOG=info cargo run --bin=client_cli -- --bot dqn,dummy RUST_LOG=info cargo run --bin=client_cli -- --bot dqn,dummy
RUST_LOG=info cargo run --bin=client_cli -- --bot dummy,dqn # RUST_LOG=info cargo run --bin=client_cli -- --bot dummy,dqn
match: match:
cargo build --release --bin=client_cli cargo build --release --bin=client_cli
LD_LIBRARY_PATH=./target/release ./target/release/client_cli -- --bot dummy,dqn LD_LIBRARY_PATH=./target/release ./target/release/client_cli -- --bot dummy,dqn