Ejemplo n.º 1
0
    def _on_lead_action(self, game_view: GameState) -> PlayerAction:
        # Store the available actions.
        available_actions = get_available_actions(game_view)
        self._actions = {}
        for action in available_actions:
            # Always exchange the trump card if possible.
            if isinstance(action, ExchangeTrumpCardAction):
                return action
            if isinstance(action, (AnnounceMarriageAction, PlayCardAction)):
                self._actions[action.card] = action
        assert len(self._actions) == len(self._my_cards)

        # Check if we have a preferred marriage in hand, but don't play it yet
        # because we might have higher cards that cannot be beaten by the opponent
        # (e.g., Trump Ace) and can secure the necessary points such that showing
        # the marriage will end the game.
        self._marriage_suit = None
        marriage_action = get_best_marriage(available_actions, game_view.trump)
        if marriage_action is not None:
            logging.debug("HeuristicPlayer: Storing marriage suit: %s",
                          marriage_action.card.suit)
            self._marriage_suit = marriage_action.card.suit

        # Maybe close the talon.
        close_talon_action = self._should_close_talon(game_view)
        if close_talon_action is not None:
            return close_talon_action

        # Get the preferred action to be played depending on the game state.
        if game_view.must_follow_suit():
            return self._on_lead_follow_suit(game_view)
        return self._on_lead_do_not_follow_suit(game_view)
Ejemplo n.º 2
0
 def test_no_marriage_available(self):
   self.assertIsNone(get_best_marriage(
     [
       PlayCardAction(PlayerId.ONE, Card.from_string("jh")),
       PlayCardAction(PlayerId.ONE, Card.from_string("ad")),
       PlayCardAction(PlayerId.ONE, Card.from_string("js")),
       PlayCardAction(PlayerId.ONE, Card.from_string("ts")),
       PlayCardAction(PlayerId.ONE, Card.from_string("qc")),
     ], Suit.SPADES))
Ejemplo n.º 3
0
 def test_trump_marriage_is_preferred(self):
   self.assertIn(get_best_marriage(
     [
       PlayCardAction(PlayerId.ONE, Card.from_string("jh")),
       PlayCardAction(PlayerId.ONE, Card.from_string("ad")),
       PlayCardAction(PlayerId.ONE, Card.from_string("js")),
       PlayCardAction(PlayerId.ONE, Card.from_string("ts")),
       PlayCardAction(PlayerId.ONE, Card.from_string("qc")),
       AnnounceMarriageAction(PlayerId.ONE, Card.from_string("kh")),
       AnnounceMarriageAction(PlayerId.ONE, Card.from_string("qh")),
       AnnounceMarriageAction(PlayerId.ONE, Card.from_string("ks")),
       AnnounceMarriageAction(PlayerId.ONE, Card.from_string("qs")),
       AnnounceMarriageAction(PlayerId.ONE, Card.from_string("kc")),
       AnnounceMarriageAction(PlayerId.ONE, Card.from_string("qc")),
     ], Suit.SPADES),
     {
       AnnounceMarriageAction(PlayerId.ONE, Card.from_string("ks")),
       AnnounceMarriageAction(PlayerId.ONE, Card.from_string("qs")),
     })
    def request_next_action(
            self,
            game_view: GameState,
            game_points: Optional[PlayerPair[int]] = None) -> PlayerAction:
        assert game_view.next_player == self.id, "Not my turn"
        available_actions = get_available_actions(game_view)
        if self._never_close_talon:
            available_actions = [
                action for action in available_actions
                if not isinstance(action, CloseTheTalonAction)
            ]

        if self._force_trump_exchange:
            for action in available_actions:
                if isinstance(action, ExchangeTrumpCardAction):
                    return action

        if self._force_marriage_announcement:
            marriage = get_best_marriage(available_actions, game_view.trump)
            if marriage is not None:
                return marriage

        return random.choice(available_actions)
Ejemplo n.º 5
0
 def test_non_trump_marriages_are_preferred_randomly(self):
   self.assertIn(get_best_marriage(
     [
       PlayCardAction(PlayerId.ONE, Card.from_string("jh")),
       PlayCardAction(PlayerId.ONE, Card.from_string("ad")),
       PlayCardAction(PlayerId.ONE, Card.from_string("js")),
       PlayCardAction(PlayerId.ONE, Card.from_string("ts")),
       PlayCardAction(PlayerId.ONE, Card.from_string("qc")),
       AnnounceMarriageAction(PlayerId.ONE, Card.from_string("kh")),
       AnnounceMarriageAction(PlayerId.ONE, Card.from_string("qh")),
       AnnounceMarriageAction(PlayerId.ONE, Card.from_string("ks")),
       AnnounceMarriageAction(PlayerId.ONE, Card.from_string("qs")),
       AnnounceMarriageAction(PlayerId.ONE, Card.from_string("kc")),
       AnnounceMarriageAction(PlayerId.ONE, Card.from_string("qc")),
     ], Suit.DIAMONDS),
     {
       AnnounceMarriageAction(PlayerId.ONE, Card.from_string("kh")),
       AnnounceMarriageAction(PlayerId.ONE, Card.from_string("qh")),
       AnnounceMarriageAction(PlayerId.ONE, Card.from_string("ks")),
       AnnounceMarriageAction(PlayerId.ONE, Card.from_string("qs")),
       AnnounceMarriageAction(PlayerId.ONE, Card.from_string("kc")),
       AnnounceMarriageAction(PlayerId.ONE, Card.from_string("qc")),
     })