Ejemplo n.º 1
0
 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
Ejemplo n.º 2
0
    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
Ejemplo n.º 3
0
    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