Exemplo n.º 1
0
    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
Exemplo n.º 2
0
    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
Exemplo n.º 3
0
    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
Exemplo n.º 4
0
    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