def __init__(self): super(DouDiZhuPokerEnv, self).__init__() self.public_state = DouDiZhuPokerPublicState() self.private_state = DouDiZhuPokerPrivateState() self.person_states = [ DouDiZhuPokerPersonState() for i in range(3 + 1) ] ## Three players and one chance player
def __available_actions_generate_all__(cls): public_state = DouDiZhuPokerPublicState() person_state = DouDiZhuPokerPersonState() public_state.__is_response__ = False person_state.__hand_cards__ = DouDiZhuPokerHandCards("") for i in range(13): for j in range(4): person_state.hand_cards.add_cards( DouDiZhuActionElement.rank_to_str[i]) person_state.hand_cards.add_cards(DouDiZhuActionElement.rank_to_str[ DouDiZhuActionElement.str_to_rank["r"]]) person_state.hand_cards.add_cards(DouDiZhuActionElement.rank_to_str[ DouDiZhuActionElement.str_to_rank["R"]]) actions = dict() patterns = [] if public_state.phase == 0: patterns.append(AllPatterns["i_cheat"]) patterns.append(AllPatterns["i_bid"]) else: if public_state.is_response == False: for p in AllPatterns: if p != "i_cheat" and p != "i_invalid": patterns.append(AllPatterns[p]) else: patterns.append(public_state.license_action.pattern) if public_state.license_action.pattern[6] == 1: patterns.append(AllPatterns["p_4_1_0_0_0"]) # rank = 10 patterns.append(AllPatterns["x_rocket"]) # rank = 100 if public_state.license_action.pattern[6] == 10: patterns.append(AllPatterns["x_rocket"]) # rank = 100 patterns.append(AllPatterns["i_cheat"]) actions = dict() for pattern in patterns: numMaster = pattern[1] numMasterPoint = pattern[2] isStraight = pattern[3] numSlave = pattern[4] MasterCount = -1 SlaveCount = -1 if numMaster > 0: MasterCount = int(numMaster / numMasterPoint) if "i_invalid" == pattern[0]: continue if "i_cheat" == pattern[0]: action_key = DouDiZhuPokerAction.__master_slave_cards_to_key__( [DouDiZhuActionElement.str_to_rank["x"]], []) action = DouDiZhuPokerAction( [DouDiZhuActionElement.str_to_rank["x"]], []) if action_key in actions: if cls.__action_priority__(action, actions[action_key]) > 0: actions[action_key] = action else: actions[action_key] = action continue if "i_bid" == pattern[0]: action_key = DouDiZhuPokerAction.__master_slave_cards_to_key__( [DouDiZhuActionElement.str_to_rank["b"]], []) action = DouDiZhuPokerAction( [DouDiZhuActionElement.str_to_rank["b"]], []) if action_key in actions: if cls.__action_priority__(action, actions[action_key]) > 0: actions[action_key] = action else: actions[action_key] = action continue if pattern[0] == "x_rocket": if person_state.hand_cards.card_pointrank_count[DouDiZhuActionElement.str_to_rank["r"]] == 1 and \ person_state.hand_cards.card_pointrank_count[DouDiZhuActionElement.str_to_rank["R"]] == 1: action_key = DouDiZhuPokerAction.__master_slave_cards_to_key__( [ DouDiZhuActionElement.str_to_rank["r"], DouDiZhuActionElement.str_to_rank["R"] ], []) action = DouDiZhuPokerAction([ DouDiZhuActionElement.str_to_rank["r"], DouDiZhuActionElement.str_to_rank["R"] ], []) if action_key in actions: if cls.__action_priority__(action, actions[action_key]) > 0: actions[action_key] = action else: actions[action_key] = action continue if pattern[1] + pattern[4] > person_state.hand_cards.num_cards: continue sum1 = 0 for count in range(MasterCount, 5, 1): sum1 += person_state.hand_cards.count2num[count] if sum1 < numMasterPoint: continue ### action with cards mCardss = [] mCardss = DouDiZhuPokerEnv.__extractMasterCards__( person_state.hand_cards, pattern) for mCards in mCardss: if numSlave == 0: action_key = DouDiZhuPokerAction.__master_slave_cards_to_key__( mCards, []) action = DouDiZhuPokerAction(mCards, []) if action_key in actions: if cls.__action_priority__(action, actions[action_key]) > 0: actions[action_key] = action else: actions[action_key] = action continue sCardss = DouDiZhuPokerEnv.__extractSlaveCards__( person_state.hand_cards, mCards, pattern) for sCards in sCardss: action_key = DouDiZhuPokerAction.__master_slave_cards_to_key__( mCards, sCards) action = DouDiZhuPokerAction(mCards, sCards) if action_key in actions: if cls.__action_priority__(action, actions[action_key]) > 0: actions[action_key] = action else: actions[action_key] = action return actions
def init(self, params=dict()): ''' Initialize the DouDiZhuPoker game environment with the initialization params.\n The initialization is a dict with some options\n 1. param_backward_enable: whether to record all history states. if you need call the backward function, please set it to True. default False\n 2. param_start_turn: players[start_turn] is first normal player to take an action\n An example of the initialization param is {"param_start_turn":2,"param_backward_enable":True}\n :param params: the initialization params :return: infos, public_state, person_states, private_state ''' self.public_state = DouDiZhuPokerPublicState() self.private_state = DouDiZhuPokerPrivateState() self.person_states = [ DouDiZhuPokerPersonState() for i in range(3 + 1) ] ## Three players and one chance player logger = roomai.get_logger() if "param_backward_enable" in params: self.public_state.__param_backward_enable__ = params[ "param_backward_enable"] else: self.public_state.__param_backward_enable__ = False logger.info("param_backward_enable = " + str(self.public_state.param_backward_enable)) if "param_start_turn" in params: self.public_state.__param_start_turn__ = params["param_start_turn"] else: self.public_state.__param_start_turn__ = int(random.random() * 3) logger.info("param_start_turn = %d" % (self.public_state.param_start_turn)) if "param_num_normal_players" in params: logger.warning( "DouDiZhu is a game of 3 normal players (1 chance player). Ingores the \"num_normal_players\" option" ) self.public_state.__param_num_normal_players__ = 3 logger.info("param_num_normal_players = 3") self.public_state.__turn__ = 3 self.public_state.__phase__ = 0 self.public_state.__epoch__ = 0 self.public_state.__landlord_id = -1 self.public_state.__license_playerid__ = self.public_state.turn self.public_state.__license_action__ = None self.public_state.__is_terminal__ = False self.public_state.__scores__ = [0, 0, 0] self.private_state.__unused_cards__ = DouDiZhuPokerHandCards("") for i in range(13): for j in range(4): self.private_state.__unused_cards__.add_cards( DouDiZhuActionElement.rank_to_str[i]) self.private_state.__unused_cards__.add_cards( DouDiZhuActionElement.rank_to_str[13]) self.private_state.__unused_cards__.add_cards( DouDiZhuActionElement.rank_to_str[14]) for i in range(3): self.person_states[i].__hand_cards__ = DouDiZhuPokerHandCards("") self.person_states[i].__id__ = i self.person_states[i].__id__ = 3 self.person_states[3].__available_actions__ = dict() for card in self.private_state.__unused_cards__.key: self.person_states[3].__available_actions__[ card] = DouDiZhuPokerActionChance.lookup(card) infos = self.__gen_infos__() self.__gen_state_history_list__() return infos, self.public_state, self.person_states, self.private_state