def player_finished(self, player: Player) -> GameUpdate: """ Finaliza la partida para un jugador en concreto. """ if player.has_finished(): raise GameLogicException("El jugador ya ha terminado") self._players_finished += 1 player.position = self._players_finished logger.info(f"{player.name} has finished at position {player.position}") # Vaciamos la mano del jugador y devolvemos las cartas a la baraja player.empty_hand(return_to=self.deck) # Vaciamos el cuerpo del jugador player.empty_body(return_to=self.deck) # Generamos un GameUpdate donde: # 1. Avisamos a todos los jugadores de que el jugador ha acabado. update = GameUpdate(self) update.repeat({"leaderboard": self._leaderboard()}) # 2. Mostramos las pilas vacías empty_piles = GameUpdate(self) empty_piles.repeat({"bodies": {player.name: player.body.piles}}) update.merge_with(empty_piles) # 3. Le enviamos al jugador la mano vacía empty_hand = GameUpdate(self) empty_hand.add(player.name, {"hand": player.hand}) update.merge_with(empty_hand) return update
def draw_hand(self, player) -> None: """ Roba cartas para un jugador hasta que tiene el mínimo de ellas. """ update = GameUpdate(self) while len(self.turn_player().hand) < MIN_HAND_CARDS: self.draw_card(self.turn_player()) update.add( player_name=self.turn_player().name, value={"hand": self.turn_player().hand}, ) return update
def apply(self, action: "PlayCard", game: "Game") -> GameUpdate: logger.info("latex-glove played") update = GameUpdate(game) for player in game.get_unfinished_players(): if player == action.caller: continue # Vaciamos la mano del oponente player.empty_hand(return_to=game.deck) # Añadimos la mano vacía al GameUpdate update.add(player.name, {"hand": []}) update.msg = "un Guante de Látex" return update
def apply(self, caller: "Player", game: "Game") -> GameUpdate: logger.info( f"{caller.name} discards their card at position {self.position}") # Activa la fase de descarte game.discarding = True if len(caller.hand) == 0: raise GameLogicException("El jugador no tiene cartas") # Elimina la carta de la mano del jugador y la añade al principio del # mazo, como indican las reglas del juego. caller.remove_card(self.position, return_to=game.deck) # No hay mensaje: ya se mostrará al pasar de turno de forma condensada. update = GameUpdate(game) update.add(caller.name, {"hand": caller.hand}) return update