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)
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))
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)
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")), })