def __init__(self, np_random): self.np_random = np_random self.trace = [] self.played_cards = np.zeros((len(CARD_RANK_STR), ), dtype=np.int) self.greater_player = None self.dealer = Dealer(self.np_random) self.deck_str = cards2str(self.dealer.deck)
def __init__(self, players, np_random): ''' Initilize the Judger class for DouDizhu ''' self.playable_cards = [set() for _ in range(3)] self._recorded_removed_playable_cards = [[] for _ in range(3)] for player in players: player_id = player.player_id current_hand = cards2str(player.current_hand) self.playable_cards[player_id] = self.playable_cards_from_hand( current_hand)
def deal_cards(self, players): ''' Deal cards to players Args: players (list): list of DoudizhuPlayer objects ''' hand_num = (len(self.deck) - 3) // len(players) for index, player in enumerate(players): current_hand = self.deck[index*hand_num:(index+1)*hand_num] current_hand.sort(key=functools.cmp_to_key(doudizhu_sort_card)) player.set_current_hand(current_hand) player.initial_hand = cards2str(player.current_hand)
def get_state(self, public, others_hands, actions): state = {} state['deck'] = public['deck'] state['seen_cards'] = public['seen_cards'] state['landlord'] = public['landlord'] state['trace'] = public['trace'].copy() state['played_cards'] = public['played_cards'].copy() state['self'] = self.player_id state['initial_hand'] = self.initial_hand state['current_hand'] = cards2str(self._current_hand) state['others_hand'] = others_hands state['actions'] = actions return state
def initiate(self, players): ''' Call dealer to deal cards and bid landlord. Args: players (list): list of DoudizhuPlayer objects ''' landlord_id = self.dealer.determine_role(players) seen_cards = self.dealer.deck[-3:] seen_cards.sort(key=functools.cmp_to_key(doudizhu_sort_card)) self.seen_cards = cards2str(seen_cards) self.landlord_id = landlord_id self.current_player = landlord_id self.public = {'deck': self.deck_str, 'seen_cards': self.seen_cards, 'landlord': self.landlord_id, 'trace': self.trace, 'played_cards': []}
def calc_playable_cards(self, player): ''' Recalculate all legal cards the player can play according to his current hand. Args: player (DoudizhuPlayer object): object of DoudizhuPlayer init_flag (boolean): For the first time, set it True to accelerate the process. Returns: list: list of string of playable cards ''' removed_playable_cards = [] player_id = player.player_id current_hand = cards2str(player.current_hand) missed = None for single in player.singles: if single not in current_hand: missed = single break playable_cards = self.playable_cards[player_id].copy() if missed is not None: position = player.singles.find(missed) player.singles = player.singles[position + 1:] for cards in playable_cards: if missed in cards or (not contains_cards(current_hand, cards)): removed_playable_cards.append(cards) self.playable_cards[player_id].remove(cards) else: for cards in playable_cards: if not contains_cards(current_hand, cards): # del self.playable_cards[player_id][cards] removed_playable_cards.append(cards) self.playable_cards[player_id].remove(cards) self._recorded_removed_playable_cards[player_id].append( removed_playable_cards) return self.playable_cards[player_id]
def determine_role(self, players): ''' Determine landlord and peasants according to players' hand Args: players (list): list of DoudizhuPlayer objects Returns: int: landlord's player_id ''' # deal cards self.shuffle() self.deal_cards(players) players[0].role = 'landlord' self.landlord = players[0] players[1].role = 'peasant' players[2].role = 'peasant' #players[0].role = 'peasant' #self.landlord = players[0] ## determine 'landlord' #max_score = get_landlord_score( # cards2str(self.landlord.current_hand)) #for player in players[1:]: # player.role = 'peasant' # score = get_landlord_score( # cards2str(player.current_hand)) # if score > max_score: # max_score = score # self.landlord = player #self.landlord.role = 'landlord' # give the 'landlord' the three cards self.landlord.current_hand.extend(self.deck[-3:]) self.landlord.current_hand.sort(key=functools.cmp_to_key(doudizhu_sort_card)) self.landlord.initial_hand = cards2str(self.landlord.current_hand) return self.landlord.player_id
def _get_others_current_hand(self, player): player_up = self.players[get_upstream_player_id(player, self.players)] player_down = self.players[get_downstream_player_id( player, self.players)] others_hand = merge(player_up.current_hand, player_down.current_hand, key=functools.cmp_to_key(doudizhu_sort_card)) return cards2str(list(others_hand))