From 53a70903478a6ad400604e71b64b809e08193431 Mon Sep 17 00:00:00 2001 From: En Yi Date: Fri, 14 Jun 2019 16:15:25 +0100 Subject: [PATCH] Implement partner calling method --- ai_comp/ai.py | 39 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/ai_comp/ai.py b/ai_comp/ai.py index d4d3d3c..7b0b8d9 100644 --- a/ai_comp/ai.py +++ b/ai_comp/ai.py @@ -64,6 +64,7 @@ class RandomAI(BaseAI): :return: int - the bid """ + return 0 if self.player: current_round_bid = self.table_status["bid"] // 10 current_suit_bid = self.table_status["bid"] % 10 @@ -142,6 +143,42 @@ class VivianAI(RandomAI): return next_bid_num*10 + favourable_suit return 0 + def call_partner(self): + """ + + :return: int - the card value + """ + player_cards = self.player.get_deck_values() + card_suits = [cards.get_card_suit(crd) for crd in player_cards] + card_nums = [cards.get_card_number(crd) for crd in player_cards] + trump_suit = self.table_status["bid"] % 10 + trump_nums = [num for suit, num in zip(card_suits, card_nums) if suit == trump_suit] + + if 14 not in trump_nums: + return trump_suit*100 + 14 + if 13 not in trump_nums: + return trump_suit*100 + 13 + if 12 not in trump_nums: + return trump_suit*100 + 12 + + suit_values = [] + + for i in range(4): + suit_values.append(sum([num for suit, num in zip(card_suits, card_nums) if suit == i+1])) + + min_val = min(suit_values) + weakest_suit = [i + 1 for i, val in enumerate(suit_values) if suit_values == min_val] + if len(weakest_suit) > 1: + weakest_suit = random.choice(weakest_suit) + else: + weakest_suit = weakest_suit[0] + + all_nums = [i+2 for i in range(13)] + weak_nums = [num for suit, num in zip(card_suits, card_nums) if suit == weakest_suit] + [all_nums.remove(num) for num in weak_nums] + return weakest_suit*100 + max(weak_nums) + + def estimate_wins(self): player_cards = self.player.get_deck_values() card_suits = [cards.get_card_suit(crd) for crd in player_cards] @@ -152,7 +189,7 @@ class VivianAI(RandomAI): n_cards.append(card_suits.count(i+1)) bids = [0] * 5 - trump_points = [num-10 if num >=10 else 0.001 for num in card_nums] + trump_points = [num-10 if num >= 10 else 0.001 for num in card_nums] non_trump_points = [self.calc_win_points(num, n_cards[suit-1]) if num > 10 else 0.001 for (num, suit) in zip(card_nums, card_suits)]