diff --git a/src/logic/game_master.rs b/src/logic/game_master.rs index 2dc7117..abfdaf0 100644 --- a/src/logic/game_master.rs +++ b/src/logic/game_master.rs @@ -3,10 +3,14 @@ use crate::logic::{ board::Board, pawn::{CapturePath, MovePath}, }, - math::position::Position, player::Player, }; +pub enum GameResult { + Lost(uuid::Uuid), + Draw, +} + struct PlayerList { pub players: [Player; 2], current_turn: usize, @@ -29,6 +33,10 @@ impl PlayerList { pub fn get_current_turn(&self) -> &Player { &self.players[self.current_turn] } + + pub fn get_passive_player(&self) -> &Player { + &self.players[(self.current_turn + 1) % self.size] + } } pub struct GameMaster { @@ -69,4 +77,31 @@ impl GameMaster { .flatten() .collect() } + + fn is_player_lost(&self, player: &Player) -> bool { + let player_pawns = self.board.get_player_pawns_positions(player); + + player_pawns.len() == 0 + || player_pawns + .iter() + .all(|pos| self.board.get_available_moves(*pos, player).is_none()) + } + + pub fn get_game_result(&self) -> Option { + let active: &Player = self.players.get_current_turn(); + let passive: &Player = self.players.get_passive_player(); + + let active_lost: bool = self.is_player_lost(active); + let passive_lost: bool = self.is_player_lost(passive); + + if active_lost && passive_lost { + Some(GameResult::Draw) + } else if active_lost { + Some(GameResult::Lost(active.id)) + } else if passive_lost { + Some(GameResult::Lost(passive.id)) + } else { + None + } + } }