Esempio n. 1
0
    def to_dict(self):
        gems = GemsCollection()
        gems.gems_dict[GemColor.GOLD] += 1
        if self.return_gem_color is not None:
            gems.gems_dict[self.return_gem_color] -= 1

        return {
            "action_type": self.action_type,
            'gems_flow': gems.to_dict(),
            'card': self.card.to_dict()
        }
Esempio n. 2
0
    def evaluate(self, state: State):
        gems = GemsCollection()
        gems.gems_dict[GemColor.GOLD] += 1
        if self.return_gem_color is not None:
            gems.gems_dict[self.return_gem_color] -= 1

        card_properties = self.card.evaluate()

        return {
            "gems_flow": gems.to_dict(),
            "card": [0, None, 0],
            "card_booked": [1, card_properties[0], card_properties[1]],
            "nobles": 0
        }
Esempio n. 3
0
class PlayersHand:
    """A class that describes possessions of one player."""
    def __init__(self, name: str = "Player") -> None:
        """Creates a hand with empty gems collections, empty set of cards, nobles and reserved cards.
        Parameters:
        _ _ _ _ _ _
        name: The name of player who has this hand (optional)."""
        self.name = name
        self.gems_possessed = GemsCollection()
        self.cards_possessed = set()
        self.cards_reserved = set()
        self.nobles_possessed = set()

    def discount(self):
        """Returns gems collection that contains the sum of profits of card possessed by the players_hand."""
        discount_dict = {gem_color: 0 for gem_color in GemColor}
        for card in self.cards_possessed:
            discount_dict[card.discount_profit] += 1
        return GemsCollection(discount_dict)

    def can_afford_card(self,
                        card: Card,
                        discount: GemsCollection = None) -> bool:
        """Returns true if players_hand can afford card"""
        if discount is None:
            discount = self.discount()
        price_after_discount = card.price % discount
        trade = [
            a - b for a, b in zip(price_after_discount.to_dict(),
                                  self.gems_possessed.to_dict())
        ]
        return sum([max(a, 0) for a in trade[1:6]]) <= -trade[0]

    def min_gold_needed_to_buy_card(self, card: Card) -> int:
        price_after_discount = card.price % self.discount()
        missing_gems = 0
        for gem_color in GemColor:
            if gem_color != GemColor.GOLD:
                missing_gems += max(
                    price_after_discount.value(gem_color) -
                    self.gems_possessed.value(gem_color), 0)
        return missing_gems

    def can_reserve_card(self):
        return len(self.cards_reserved) < MAX_RESERVED_CARDS

    def number_of_my_points(self) -> int:
        return sum([
            card.victory_points for card in self.cards_possessed
        ]) + sum([noble.victory_points for noble in self.nobles_possessed])

    def to_dict(self):
        return {
            'noble_possessed_ids':
            {x.to_dict()
             for x in self.nobles_possessed},
            'cards_possessed_ids': {x.to_dict()
                                    for x in self.cards_possessed},
            'cards_reserved_ids': {x.to_dict()
                                   for x in self.cards_reserved},
            'gems_possessed': self.gems_possessed.to_dict(),
            'name': self.name
        }

    def from_dict(self, vector):
        self.name = vector['name']
        gems = vector['gems_possessed']
        self.gems_possessed = self.gems_possessed + GemsCollection(
            {
                GemColor.GOLD: gems[0],
                GemColor.RED: gems[1],
                GemColor.GREEN: gems[2],
                GemColor.BLUE: gems[3],
                GemColor.WHITE: gems[4],
                GemColor.BLACK: gems[5]
            })