fixed loose game spinning

This commit is contained in:
JOLIMAITRE Matthieu 2022-11-06 00:17:37 +01:00
parent 0f92ed9b7e
commit 1ae2336180

View file

@ -13,6 +13,12 @@ struct Config {
delay: Duration, delay: Duration,
} }
#[derive(Debug, Clone)]
enum Error {
Disconnect,
GameEnd,
}
#[tokio::main] #[tokio::main]
async fn main() { async fn main() {
let url = env::var("URL").unwrap_or_else(|_| "localhost:2048".to_string()); let url = env::var("URL").unwrap_or_else(|_| "localhost:2048".to_string());
@ -32,7 +38,7 @@ async fn main() {
} }
} }
async fn game(mut write: OwnedWriteHalf, config: Config) -> Option<()> { async fn game(mut write: OwnedWriteHalf, config: Config) {
'session: loop { 'session: loop {
let rules = GameRules::default(); let rules = GameRules::default();
let mut game = Game::new(rules); let mut game = Game::new(rules);
@ -40,8 +46,10 @@ async fn game(mut write: OwnedWriteHalf, config: Config) -> Option<()> {
'_game: loop { '_game: loop {
let result = turn(&mut game, &mut controller, &mut write, config.delay).await; let result = turn(&mut game, &mut controller, &mut write, config.delay).await;
if result.is_none() { match result {
continue 'session; Ok(()) => (),
Err(Error::GameEnd) => continue 'session,
Err(Error::Disconnect) => return,
} }
} }
} }
@ -52,16 +60,19 @@ async fn turn(
controller: &mut SimulatedController, controller: &mut SimulatedController,
write: &mut OwnedWriteHalf, write: &mut OwnedWriteHalf,
delay: Duration, delay: Duration,
) -> Option<()> { ) -> Result<(), Error> {
let displayer = GridDisplayer::new(1234); let displayer = GridDisplayer::new(1234);
let display = displayer.display(game.get_board()); let display = displayer.display(game.get_board());
let clear = clear::All; let clear = clear::All;
let goto = cursor::Goto(1, 1); let goto = cursor::Goto(1, 1);
let frame = format!("{clear}{goto}{display}"); let frame = format!("{clear}{goto}{display}");
write.write_all(frame.as_bytes()).await.ok()?; write
.write_all(frame.as_bytes())
.await
.map_err(|_| Error::Disconnect)?;
let movement = controller.next_move(&*game).ok()?; let movement = controller.next_move(&*game).map_err(|_| Error::GameEnd)?;
game.turn(movement).ok()?; game.turn(movement).map_err(|_| Error::GameEnd)?;
sleep(delay).await; sleep(delay).await;
Some(()) Ok(())
} }