Fix bug in Vbot

master
En Yi 2019-06-15 13:17:48 +01:00
parent 1abed6b82a
commit d6c7b77f21
2 changed files with 17 additions and 5 deletions

View File

@ -204,7 +204,7 @@ class VivianAI(RandomAI):
card_viability = [1] * n_cards card_viability = [1] * n_cards
card_nums = [cards.get_card_number(play) for play in valid_plays] card_nums = [cards.get_card_number(play) for play in valid_plays]
card_suits = [cards.get_card_suit(play) for play in valid_plays] card_suits = [cards.get_card_suit(play) for play in valid_plays]
high_cards = [max(card_set) if card_set else 0 for card_set in self.unplayed_cards] high_cards = [max(card_set) + (i+1)*100 if card_set else 0 for i, card_set in enumerate(self.unplayed_cards)]
suit_counts = [0] * 4 suit_counts = [0] * 4
for i in range(4): for i in range(4):
@ -224,12 +224,18 @@ class VivianAI(RandomAI):
for i in range(n_cards): for i in range(n_cards):
card_viability[i] += any([valid_plays[i] == card for card in high_cards]) * 1.2 card_viability[i] += any([valid_plays[i] == card for card in high_cards]) * 1.2
else: else:
# Get the played cards
played_cards = [card.value if card else None for card in self.table_status["played cards"]] played_cards = [card.value if card else None for card in self.table_status["played cards"]]
played_nums = [cards.get_card_number(card) if card else 0 for card in played_cards] played_nums = [cards.get_card_number(card) if card else 0 for card in played_cards]
played_suits = [cards.get_card_suit(card) if card else 0 for card in played_cards] played_suits = [cards.get_card_suit(card) if card else 0 for card in played_cards]
leading_card = self.table_status["played cards"][self.table_status["leading player"]]
leading_suit = leading_card.suit()
# Find any trump cards
trumped = any([suit == self.table_status['trump suit'] for suit in played_suits]) trumped = any([suit == self.table_status['trump suit'] for suit in played_suits])
max_played_num = max(played_nums)
# Find the highest number played,
max_played_num = max([num for num, suit in zip(played_nums, played_suits) if suit == leading_suit])
max_trump_played = [num for suit, num in zip(played_suits, played_nums) max_trump_played = [num for suit, num in zip(played_suits, played_nums)
if suit == self.table_status['trump suit']] if suit == self.table_status['trump suit']]
if max_trump_played: if max_trump_played:
@ -238,13 +244,17 @@ class VivianAI(RandomAI):
max_trump_played = 1 max_trump_played = 1
for i in range(n_cards): for i in range(n_cards):
if trumped and card_suits[i] != self.table_status['trump suit']: if trumped:
card_viability[i] *= card_nums[i]/7 card_viability[i] -= card_nums[i]/7 * (card_suits[i] != self.table_status['trump suit'])
card_viability[i] += (card_nums[i] < max_played_num) / card_nums[i] card_viability[i] += (card_nums[i] < max_played_num) / card_nums[i]
if card_suits[i] == self.table_status['trump suit'] and\ if card_suits[i] == self.table_status['trump suit'] and\
card_nums[i]>max_trump_played : card_nums[i] > max_trump_played:
card_viability[i] *= 2 / card_nums[i] card_viability[i] *= 2 / card_nums[i]
if self.table_status["partner reveal"]:
pass
best_viability = max(card_viability) best_viability = max(card_viability)
best_cards = [play for viability, play in zip(card_viability, valid_plays) if viability == best_viability] best_cards = [play for viability, play in zip(card_viability, valid_plays) if viability == best_viability]
return random.choice(best_cards) return random.choice(best_cards)

View File

@ -712,10 +712,12 @@ class Table:
def reveal_all_roles(self, partner): def reveal_all_roles(self, partner):
""" """
Update all roles once the partner card is shown Update all roles once the partner card is shown
Also updates the partner to the player number
:param partner: :param partner:
:return: :return:
""" """
self.players[partner].role = PlayerRole.PARTNER self.players[partner].role = PlayerRole.PARTNER
self.table_status["partner"] = partner
self.table_status['defender']['wins'] += self.players[partner].score self.table_status['defender']['wins'] += self.players[partner].score
for i in range(NUM_OF_PLAYERS): for i in range(NUM_OF_PLAYERS):
if self.players[i].role == PlayerRole.UNKNOWN: if self.players[i].role == PlayerRole.UNKNOWN: