Ejemplo n.º 1
0
 def getCanWinTiles(self, handTiles, win_op, idx):
     handCopyTiles = list(handTiles)
     handCopyTiles = sorted(handCopyTiles)
     kings, handTilesButKing = utility.classifyKingTiles(
         handCopyTiles, self.kingTiles)
     kingTilesNum = len(kings)
     allTiles = const.CHARACTER + const.BAMBOO + const.DOT + const.WINDS + const.DRAGONS
     canWinTiles = []
     for tile in allTiles:
         handCopyTiles.append(tile)
         is_win, _, _ = self.can_win(handCopyTiles, tile, win_op, idx)
         if is_win:
             canWinTiles.append(tile)
         handCopyTiles.pop()
     DEBUG_MSG(
         "room:{},curround:{} getCanWinTiles idx:{} canWinTiles:{}".format(
             self.roomID, self.current_round, idx, canWinTiles))
     return canWinTiles
Ejemplo n.º 2
0
	def can_win(self, handTiles, finalTile, win_op, idx):
		#"""平胡 爆头 七对子 清七对"""
		#"""杠 + 飘"""
		result_list = [0] * 4
		multiply = 0
		if len(handTiles) % 3 != 2:
			DEBUG_MSG("room:{},curround:{} handTiles:{} finalTile:{} win_op:{} idx:{}".format(self.roomID, self.current_round, handTiles, finalTile, win_op, idx))
			return False, self.base_score * (2**multiply), result_list
		if win_op == const.OP_WREATH_WIN:
			DEBUG_MSG("room:{},curround:{} handTiles:{} finalTile:{} win_op:{} idx:{}".format(self.roomID, self.current_round, handTiles, finalTile, win_op, idx))
			return False, 2 ** multiply, result_list
		if win_op == const.OP_GIVE_WIN and finalTile in self.kingTiles:
			DEBUG_MSG("room:{},curround:{} handTiles:{} finalTile:{} win_op:{} idx:{}".format(self.roomID, self.current_round, handTiles, finalTile, win_op, idx))
			return False, 2 ** multiply, result_list

		p = self.players_list[idx]
		handCopyTiles = list(handTiles)
		handCopyTiles = sorted(handCopyTiles)
		kings, handTilesButKing = utility.classifyKingTiles(handCopyTiles, self.kingTiles)
		kingTilesNum = len(kings)
		# 白板代替财神
		if len(self.kingTiles) > 0:
			handTilesButKing = list(map(lambda x:self.kingTiles[0] if x == const.DRAGON_WHITE else x, handTilesButKing))
			insteadFinalTile = self.kingTiles[0] if finalTile == const.DRAGON_WHITE else finalTile
		else:
			insteadFinalTile = finalTile
		handTilesButKing = sorted(handTilesButKing)
		#2N
		is7Pair, isBaoTou, kongNum = utility.checkIs7Pair(handCopyTiles, handTilesButKing, kingTilesNum, self.kingTiles, insteadFinalTile)
		if is7Pair:
			DEBUG_MSG("room:{},curround:{} is7Pair".format(self.roomID, self.current_round))
			result_list[2] = 1 + kongNum
			multiply += result_list[2]
			if isBaoTou:
				result_list[1] = 1
				kingKongList = [1 if op == const.OP_DISCARD else -1 for op in utility.serialKingKong(p.op_r, self.kingTiles)]
				multiply += len(kingKongList) + 1
				result_list.extend(kingKongList)
				DEBUG_MSG("room:{},curround:{} is7Pair baotou".format(self.roomID, self.current_round))
				return True , self.base_score * (2 ** multiply), result_list
			elif kingTilesNum <= 0:
				result_list[3] = 1
				multiply += 1
				DEBUG_MSG("room:{},curround:{} is7Pair not baotou kingNum:0".format(self.roomID, self.current_round))
				return True, self.base_score * (2 ** multiply), result_list
			if self.bao_tou == 0:
				return True, self.base_score * (2**multiply), result_list

		#3N2
		result_list = [0] * 4
		multiply = 0
		if kingTilesNum <= 0: 	#无财神(只要满足能胡就可以胡)
			DEBUG_MSG("room:{},curround:{} kingTilesNum <= 0".format(self.roomID, self.current_round))
			if utility.meld_with_pair_need_num(handTilesButKing) <= kingTilesNum:
				result_list[0] = 1
				for op in utility.serialKingKong(p.op_r, self.kingTiles): #只有连续杠开
					if op != const.OP_DISCARD:
						result_list.append(-1)
						multiply += 1
					else:
						break
				DEBUG_MSG("room:{},curround:{} 3N2 kingNum:0".format(self.roomID, self.current_round))
				return True, self.base_score * (2**multiply), result_list
			DEBUG_MSG("room:{},curround:{} handTiles:{} finalTile:{} win_op:{} idx:{}".format(self.roomID, self.current_round, handTiles, finalTile, win_op, idx))
			return False, self.base_score * (2**multiply), result_list
		else:					#有财神(只要暴头都可以胡, 如果有财必暴,非暴头不能胡)
			# 除去暴头一对组成3N
			baotou_n3_list = []
			tryKingsNum = kingTilesNum
			if finalTile in self.kingTiles: # 最后一张 摸的是财神
				if tryKingsNum >= 2:
					tryKingsNum -= 2
					baotou_n3_list.append(list(handTilesButKing))
			else:
				tryKingsNum -= 1
				tryList = list(handTilesButKing)
				tryList.remove(insteadFinalTile) # 若最后一张不是财神 则用代替后的牌
				baotou_n3_list.append(tryList)
			DEBUG_MSG("room:{},curround:{} baotou_n3_list:{}".format(self.roomID, self.current_round, baotou_n3_list))
			#优先尝试暴头
			for tryList in baotou_n3_list:
				if utility.getMeldNeed(tryList) <= tryKingsNum:
					result_list[1] = 1
					# 连续飘杠胜利
					kingKongList = [1 if op == const.OP_DISCARD else -1 for op in utility.serialKingKong(p.op_r, self.kingTiles)]
					multiply += len(kingKongList) + 1
					result_list.extend(kingKongList)
					DEBUG_MSG("room:{},curround:{} 3N baotou".format(self.roomID, self.current_round))
					return True, self.base_score * (2 ** multiply), result_list
			else:
				DEBUG_MSG("room:{},curround:{} try not baotou".format(self.roomID, self.current_round))
				if self.bao_tou == 0 and utility.winWith3N2NeedKing(handTilesButKing) <= kingTilesNum:
					result_list[0] = 1
					# 连续杠胜利
					for op in utility.serialKingKong(p.op_r, self.kingTiles):  # 只有连续杠开
						if op != const.OP_DISCARD:
							result_list.append(-1)
							multiply += 1
						else:
							break
					DEBUG_MSG("room:{},curround:{} 3N not baotou".format(self.roomID, self.current_round))
					return True, self.base_score * (2 ** multiply), result_list
				DEBUG_MSG("room:{},curround:{} handTiles:{} finalTile:{} win_op:{} idx:{}".format(self.roomID, self.current_round, handTiles, finalTile, win_op, idx))
				return False, self.base_score * (2 ** multiply), result_list
Ejemplo n.º 3
0
    def can_win(self, handTiles, finalTile, win_op, idx):
        #"""0自摸 1点炮 2抢杠 3明杠 4暗杠 5庄家 6边张 7砍张 8吊将 9缺门 10清一色 11一条龙 12清龙"""
        result_list = [0] * 13
        base_score = 1
        p = self.players_list[idx]
        if p.state == const.DISCARD_FREE:
            DEBUG_MSG(
                "room:{},curround:{} 0 handTiles:{} finalTile:{} win_op:{} idx:{}"
                .format(self.roomID, self.current_round, handTiles, finalTile,
                        win_op, idx))
            return False, base_score, result_list
        if len(handTiles) % 3 != 2:
            DEBUG_MSG(
                "room:{},curround:{} 1 handTiles:{} finalTile:{} win_op:{} idx:{}"
                .format(self.roomID, self.current_round, handTiles, finalTile,
                        win_op, idx))
            return False, base_score, result_list
        if win_op == const.OP_WREATH_WIN:
            DEBUG_MSG(
                "room:{},curround:{} 2 handTiles:{} finalTile:{} win_op:{} idx:{}"
                .format(self.roomID, self.current_round, handTiles, finalTile,
                        win_op, idx))
            return False, base_score, result_list

        # DEBUG_MSG("room:{},curround:{} handTiles:{} finalTile:{} win_op:{} idx:{}".format(self.roomID, self.current_round, handTiles, finalTile, win_op, idx))

        handCopyTiles = list(handTiles)
        handCopyTiles = sorted(handCopyTiles)
        kings, handTilesButKing = utility.classifyKingTiles(
            handCopyTiles, self.kingTiles)
        kingTilesNum = len(kings)
        uptiles = p.upTiles

        #3N2
        if kingTilesNum <= 0:  #无财神(只要满足能胡就可以胡)
            if utility.meld_with_pair_need_num(
                    handTilesButKing) <= kingTilesNum:
                result_list[0] = 1 if win_op == const.OP_DRAW_WIN else 0
                # result_list[1] = 1 if win_op == const.OP_GIVE_WIN else 0
                # result_list[2] = 1 if win_op == const.OP_KONG_WIN else 0
                exposed_kong_num = sum(
                    [1 for op in p.op_r if op[0] == const.OP_EXPOSED_KONG])
                concealed_kong_num = sum(
                    [1 for op in p.op_r if op[0] == const.OP_CONCEALED_KONG])
                continue_kong_num = sum(
                    [1 for op in p.op_r if op[0] == const.OP_CONTINUE_KONG])
                if exposed_kong_num > 0 or continue_kong_num > 0:  # 明杠
                    result_list[3] = 1
                if concealed_kong_num > 0:  # 暗杠
                    result_list[4] = 1
                if p.idx == self.dealer_idx:  # 庄家
                    result_list[5] = 1
                    base_score += 1
                result_list[6], result_list[7], result_list[
                    8] = utility.checkIsEdgeMidSingle(handTilesButKing,
                                                      finalTile)
                if len(p.canWinTiles) != 1:
                    result_list[6] = 0
                    result_list[7] = 0
                    result_list[8] = 0
                if result_list[6] == 1 or result_list[7] == 1 or result_list[
                        8] == 1:  # 边张 砍张 吊将
                    base_score += 1
                colorType = utility.getTileColorType(handTilesButKing, uptiles)
                if colorType == const.LACK_DOOR:  # 缺门
                    result_list[9] = 1
                    base_score += 1
                if self.same_suit_mode == 1 and colorType == const.SAME_SUIT:  # 清一色
                    result_list[10] = 1
                    base_score += 10
                if utility.checkIsOneDragon(handTilesButKing):  # 一条龙
                    result_list[11] = 1
                    base_score += 10
                if self.same_suit_loong == 1 and result_list[
                        10] == 1 and result_list[11] == 1:  # 清龙
                    result_list[12] = 1
                DEBUG_MSG("room:{},curround:{} 3N2 result_list:{}".format(
                    self.roomID, self.current_round, result_list))
                return True, (
                    base_score *
                    [2 if result_list[0] == 1 else 1][0]), result_list
            DEBUG_MSG(
                "room:{},curround:{} 3 handTiles:{} finalTile:{} win_op:{} idx:{}"
                .format(self.roomID, self.current_round, handTiles, finalTile,
                        win_op, idx))
            return False, base_score, result_list
Ejemplo n.º 4
0
    def can_win(self, handTiles, finalTile, win_op, idx):
        #"""平胡 四财神 爆头 七对子 碰碰胡 清一色 乱风  清风 天胡 地胡 十三不搭 海底捞月"""
        #"""杠 + 飘"""
        is_win = False
        is_bao_tou = False
        result_list = [0] * 12
        score = 0
        DEBUG_MSG("{} {}".format(self.prefixLogStr, "****begin***" * 5))
        DEBUG_MSG(
            "{} idx:{} win_op:{} handTiles:{} upTiles:{} finalTile:{}".format(
                self.prefixLogStr, idx, win_op, handTiles,
                self.players_list[idx].upTiles, finalTile))
        if len(handTiles) % 3 != 2:
            return is_win, score, result_list
        if win_op == const.OP_WREATH_WIN:
            return False, score, result_list

        p = self.players_list[idx]
        upTiles = p.upTiles
        handCopyTiles = list(handTiles)
        handCopyTiles = sorted(handCopyTiles)
        kings, handTilesButKing = utility.classifyKingTiles(
            handCopyTiles, self.kingTiles)
        kingTilesNum = len(kings)
        handTilesButKing = sorted(handTilesButKing)

        def cut_list(lis, mid=0):  # 截取数组 到小于或者 大于 某个值为止
            min_list = []
            max_list = []
            for x in lis:
                if x < mid:
                    min_list.append(x)
                else:
                    break
            for x in lis:
                if x > mid:
                    max_list.append(x)
                else:
                    break
            return min_list, max_list

        def not_bao_tou_3n2(op_r, handTilesButKing, kingTilesNum, upTiles,
                            result_list):
            sum_score = 0
            if utility.winWith3N2NeedKing(handTilesButKing) <= kingTilesNum:
                # 只有连续杠开
                kingKongList = [
                    1 if op == const.OP_DISCARD else -1
                    for op in utility.serialKingKong(op_r, self.kingTiles)
                ]
                # 截取全部是 -1 的数组(杠)
                min_list, _ = cut_list(kingKongList)
                sum_score += len(min_list) * 2
                result_list.extend(min_list)
                # 碰碰胡
                if utility.isPongPongWin3N2(handTilesButKing, kingTilesNum,
                                            upTiles):
                    sum_score += 2
                    result_list[4] = 1
                elif len(min_list) <= 0:
                    result_list[0] = 1
                return True, sum_score
            return False, sum_score

        def bao_tou_3n(op_r, tryList, tryKingsNum, upTiles, result_list):
            sum_score = 0
            if utility.getMeldNeed(tryList) <= tryKingsNum:
                result_list[2] = 1
                # 连续飘杠胜利
                kingKongList = [
                    1 if op == const.OP_DISCARD else -1
                    for op in utility.serialKingKong(op_r, self.kingTiles)
                ]
                sum_score += (len(kingKongList) + 1) * 2
                result_list.extend(kingKongList)
                # 碰碰胡
                if utility.isPongPongWin3N(tryList, tryKingsNum, upTiles):
                    sum_score += 2
                    result_list[4] = 1
                return True, sum_score
            return False, sum_score

        # 十三不搭
        not_match_mode = utility.isThirteenNotMatch(handCopyTiles,
                                                    self.kingTiles)
        if not_match_mode > 0:
            is_win = True
            result_list[10] = not_match_mode
            DEBUG_MSG("{} thirteenNotMatch match mode:{}".format(
                self.prefixLogStr, not_match_mode))
            if not_match_mode == const.MATCH_NOT_STANDARD:
                score += 1
            elif not_match_mode == const.MATCH_NOT_STANDARD_7STAR:
                score += 2
            elif not_match_mode == const.MATCH_STANDARD:
                score += 2
            else:
                score += 4
        else:
            # 可能满足7对 也满足 平胡 条件的牌
            # 2N
            is7Pair, isBaoTou, _ = utility.checkIs7Pair(
                handCopyTiles, handTilesButKing, kingTilesNum, self.kingTiles,
                finalTile)
            if is7Pair:
                score += 2
                result_list[3] = 1
                is_win = True
                DEBUG_MSG("{} 7Pair".format(self.prefixLogStr))
                if isBaoTou:
                    is_bao_tou = True
                    result_list[2] = 1
                    # 连续 飘财
                    kingKongList = [
                        1 if op == const.OP_DISCARD else -1
                        for op in utility.serialKingKong(
                            p.op_r, self.kingTiles)
                    ]
                    result_list.extend(kingKongList)
                    score += (len(kingKongList) + 1) * 2
                    DEBUG_MSG("{} 7Pair baotou ".format(self.prefixLogStr))
            else:
                # 3N2
                if kingTilesNum <= 0:
                    is_win, sum_score = not_bao_tou_3n2(
                        p.op_r, handTilesButKing, kingTilesNum, upTiles,
                        result_list)
                    score += sum_score if is_win else 0
                    DEBUG_MSG(
                        "{} 3N2 kingTilesNum <= 0 is_win:{} sum_score:{}".
                        format(self.prefixLogStr, is_win, sum_score))
                else:
                    baotou_n3_list = []
                    tryKingsNum = kingTilesNum
                    if finalTile in self.kingTiles:  # 最后一张 摸的是财神
                        if tryKingsNum >= 2:
                            tryKingsNum -= 2
                            baotou_n3_list.append(list(handTilesButKing))
                    else:
                        tryKingsNum -= 1
                        tryList = list(handTilesButKing)
                        tryList.remove(finalTile)  # 若最后一张不是财神 则用代替后的牌
                        baotou_n3_list.append(tryList)
                    DEBUG_MSG("{} baotou_n3_list:{}".format(
                        self.prefixLogStr, baotou_n3_list))
                    # 优先尝试暴头
                    for tryList in baotou_n3_list:
                        is_win, sum_score = bao_tou_3n(p.op_r, tryList,
                                                       tryKingsNum, upTiles,
                                                       result_list)
                        if is_win:
                            is_bao_tou = True
                            score += sum_score
                            DEBUG_MSG("{} 3N baotou sum_score:{}".format(
                                self.prefixLogStr, sum_score))
                            break
                    else:
                        is_win, sum_score = not_bao_tou_3n2(
                            p.op_r, handTilesButKing, kingTilesNum, upTiles,
                            result_list)
                        score += sum_score if is_win else 0
                        DEBUG_MSG(
                            "{} 3N2 notbaotou is_win:{} sum_score:{}".format(
                                self.prefixLogStr, is_win, sum_score))

            # 是否是清一色(必须是 2N 3N2 胡法 十三幺不存在清一色)
            if is_win and utility.isAllSameCBDSuit(handTilesButKing,
                                                   upTiles):  # 清一色
                result_list[0] = 0
                result_list[5] = 2
                score += 10 if win_op == const.OP_GIVE_WIN else 8
                DEBUG_MSG("{} qingyise".format(self.prefixLogStr))
            elif is_win and len(
                    self.job_relation(idx)) > 0 and utility.isAllUpMeldCBDSuit(
                        upTiles):  # 门前清 承包
                result_list[5] = 1
                score += 8 if win_op == const.OP_DRAW_WIN else 10
                DEBUG_MSG("{} menqianqing".format(self.prefixLogStr))
                if win_op == const.OP_GIVE_WIN:
                    # 门前清 不能放炮胡
                    return False, score, result_list
            elif utility.isAllWindsDragons(handTilesButKing, upTiles):  # 全字
                result_list[0] = 0
                is_win = True
                if sum([i if i >= 0 else abs(i)
                        for i in result_list]) > 0:  # 清风
                    result_list[7] = 1
                    score += 20
                    DEBUG_MSG("{} qingfeng".format(self.prefixLogStr))
                else:
                    result_list[6] = 1  # 若不是清风 必定是乱风
                    score += 10
                    DEBUG_MSG("{} luanfeng".format(self.prefixLogStr))

        # 4财神 (额外)
        if kingTilesNum == 4:
            is_win = True
            result_list[1] = 4
            # score += 2
            DEBUG_MSG("{} hand king 4".format(self.prefixLogStr))
        elif is_win:
            # 连续 杠飘
            if is_bao_tou:
                kingKongList = [
                    1 if op == const.OP_DISCARD else -1
                    for op in utility.serialKingKong(p.op_r, self.kingTiles)
                ]
                if sum([1 for i in kingKongList if i > 0]) + kingTilesNum == 4:
                    result_list[1] = 4
                    # score += 2
                DEBUG_MSG("{} hand king {} allking {}".format(
                    self.prefixLogStr, kingTilesNum,
                    sum([1 for i in kingKongList if i > 0]) + kingTilesNum))

        # 满足胡的条件下
        if is_win:
            # 天胡
            if idx == self.dealer_idx and win_op == const.OP_DRAW_WIN and len(
                    p.op_r) == 1:
                score += 10
                result_list[8] = 1
                result_list[0] = 0
                DEBUG_MSG("{} tianhu".format(self.prefixLogStr))
            # 地胡
            elif idx != self.dealer_idx and win_op == const.OP_GIVE_WIN and len(
                    self.all_discard_tiles) == 1:
                score += 10
                result_list[9] = 1
                result_list[0] = 0
                DEBUG_MSG("{} dihu".format(self.prefixLogStr))
            # 海底捞月
            elif win_op == const.OP_DRAW_WIN and len(
                    self.tiles) <= self.end_tile_num:
                score += 2
                result_list[11] = 1
                result_list[0] = 0
                DEBUG_MSG("{} haidilaoyue".format(self.prefixLogStr))

        # 如果只有 平胡 还要 算 1分
        if result_list[0] == 1 and sum([1
                                        for i in result_list if i != 0]) == 1:
            score += 1
        # 能不能放炮 抢杠 条件筛选
        # 放炮胡 和 抢杠胡的条件是一样的, 只有大于等于2分以上的牌才可以放炮、抢杠,并且财神头不能 放炮、抢杠 除了清一色 清风 乱风 这三种财神头
        DEBUG_MSG("{} all score {}, all result_list:{}".format(
            self.prefixLogStr, score, result_list))
        DEBUG_MSG("{} {}".format(self.prefixLogStr, "****end***" * 5))
        if win_op == const.OP_KONG_WIN:
            score = max(2, score)
            if is_bao_tou and result_list[5] <= 0 and result_list[
                    6] <= 0 and result_list[7] <= 0:
                return False, score, result_list

        if win_op == const.OP_GIVE_WIN:
            if score < 2:
                return False, score, result_list
            if is_bao_tou and result_list[5] <= 0 and result_list[
                    6] <= 0 and result_list[7] <= 0:
                return False, score, result_list
        return is_win, score, result_list
Ejemplo n.º 5
0
    def can_win(self, handTiles, finalTile, win_op, idx):
        #"""平胡 清一色 七小对 豪华七小对 一条龙 十三幺"""
        result_list = [0] * 6
        base_score = 0
        # return False, multiply, result_list
        p = self.players_list[idx]
        if p.state == const.DISCARD_FREE:
            # DEBUG_MSG("room:{},curround:{} 0 handTiles:{} finalTile:{} win_op:{} idx:{}".format(self.roomID, self.current_round, handTiles, finalTile, win_op, idx))
            return False, base_score, result_list
        DEBUG_MSG("room:{},curround:{} state:{} idx:{}".format(
            self.roomID, self.current_round, p.state, idx))
        if self.pass_win_list[idx] == 1 and win_op != const.OP_DRAW_WIN:
            DEBUG_MSG(
                "room:{},curround:{} 00 handTiles:{} finalTile:{} win_op:{} idx:{}"
                .format(self.roomID, self.current_round, handTiles, finalTile,
                        win_op, idx))
            return False, base_score, result_list
        if len(handTiles) % 3 != 2:
            DEBUG_MSG(
                "room:{},curround:{} 1 handTiles:{} finalTile:{} win_op:{} idx:{}"
                .format(self.roomID, self.current_round, handTiles, finalTile,
                        win_op, idx))
            return False, base_score, result_list
        if win_op == const.OP_WREATH_WIN:
            DEBUG_MSG(
                "room:{},curround:{} 2 handTiles:{} finalTile:{} win_op:{} idx:{}"
                .format(self.roomID, self.current_round, handTiles, finalTile,
                        win_op, idx))
            return False, base_score, result_list
        # if win_op == const.OP_GIVE_WIN and finalTile in self.kingTiles:
        # 	DEBUG_MSG("room:{},curround:{} handTiles:{} finalTile:{} win_op:{} idx:{}".format(self.roomID, self.current_round, handTiles, finalTile, win_op, idx))
        # 	return False, base_score, result_list
        if self.is_win_limit(finalTile, win_op) == False:
            return False, base_score, result_list

        handCopyTiles = list(handTiles)
        handCopyTiles = sorted(handCopyTiles)
        kings, handTilesButKing = utility.classifyKingTiles(
            handCopyTiles, self.kingTiles)
        kingTilesNum = len(kings)
        uptiles = p.upTiles

        if finalTile in self.kingTiles:
            for winTile in self.canWinTiles:
                if winTile in self.kingTiles:
                    continue
                if winTile > const.BOUNDARY:
                    base_score = 10
                    break
                elif base_score < winTile % 10:
                    base_score = winTile % 10
        elif finalTile > const.BOUNDARY:
            base_score = 10
        else:
            base_score = finalTile % 10

        #十三幺
        if self.game_mode == const.SPECIAL_GAME_MODE:
            if utility.getThirteenOrphans(handTilesButKing, kingTilesNum):
                # if self.is_win_limit(finalTile, win_op) == False:
                # 	return False , base_score, result_list
                result_list[5] = 1
                DEBUG_MSG("room:{},curround:{} isThirteenOrphans".format(
                    self.roomID, self.current_round))
                return True, (base_score + utility.multiplyCalc(
                    self.game_mode, win_op, result_list)) * [
                        2 if win_op == const.OP_DRAW_WIN else 1
                    ][0], result_list
        #2N
        result_list = [0] * 6
        is7Pair, isBaoTou, kongNum = utility.checkIs7Pair(
            handCopyTiles, handTilesButKing, kingTilesNum, self.kingTiles,
            finalTile)
        if is7Pair:
            DEBUG_MSG(
                "room:{},curround:{} is7Pair isBaoTou:{} kongNum:{}".format(
                    self.roomID, self.current_round, isBaoTou, kongNum))
            result_list[2] = 1
            if kongNum > 0:
                result_list[3] = 1
            if isBaoTou and self.king_num == 1:
                if win_op != const.OP_DRAW_WIN:
                    return False, base_score, result_list
                # kingKongList = [1 if op == const.OP_DISCARD else -1 for op in utility.serialKingKong(p.op_r, self.kingTiles)]
                # result_list.extend(kingKongList)
                DEBUG_MSG("room:{},curround:{} is7Pair diaojiang".format(
                    self.roomID, self.current_round))
                if self.game_mode != const.SPECIAL_GAME_MODE:
                    return True, 20, result_list
                return True, (base_score + utility.multiplyCalc(
                    self.game_mode, win_op, result_list)) * [
                        2 if win_op == const.OP_DRAW_WIN else 1
                    ][0], result_list
            elif kingTilesNum <= 0:
                DEBUG_MSG(
                    "room:{},curround:{} is7Pair not diaojiang kingNum:0".
                    format(self.roomID, self.current_round))
                return True, (base_score + utility.multiplyCalc(
                    self.game_mode, win_op, result_list)) * [
                        2 if win_op == const.OP_DRAW_WIN else 1
                    ][0], result_list
            DEBUG_MSG(
                "room:{},curround:{} is7Pair not diaojiang kingNum>0".format(
                    self.roomID, self.current_round))
            return True, (base_score + utility.multiplyCalc(
                self.game_mode, win_op, result_list)) * [
                    2 if win_op == const.OP_DRAW_WIN else 1
                ][0], result_list

        #3N2
        result_list = [0] * 6
        if kingTilesNum <= 0:  #无财神(只要满足能胡就可以胡)
            DEBUG_MSG("room:{},curround:{} kingTilesNum <= 0".format(
                self.roomID, self.current_round))
            if utility.meld_with_pair_need_num(
                    handTilesButKing) <= kingTilesNum:
                # if self.is_win_limit(finalTile, win_op) == False:
                # 	return False , base_score, result_list
                if self.game_mode == const.SPECIAL_GAME_MODE:
                    if utility.getTileColorType(handTilesButKing,
                                                uptiles) == const.SAME_SUIT:
                        result_list[1] = 1
                    elif utility.checkIsOneDragon(handTilesButKing):
                        result_list[4] = 1
                else:
                    result_list[0] = 1
                DEBUG_MSG("room:{},curround:{} 3N2 kingNum:0".format(
                    self.roomID, self.current_round))
                return True, (base_score + utility.multiplyCalc(
                    self.game_mode, win_op, result_list)) * [
                        2 if win_op == const.OP_DRAW_WIN else 1
                    ][0], result_list
            DEBUG_MSG(
                "room:{},curround:{} 3 handTiles:{} finalTile:{} win_op:{} idx:{}"
                .format(self.roomID, self.current_round, handTiles, finalTile,
                        win_op, idx))
            return False, base_score, result_list
        else:  #有财神
            if utility.winWith3N2NeedKing(handTilesButKing) <= kingTilesNum:
                result_list[0] = 1
                DEBUG_MSG(
                    "room:{},curround:{} 3N win_op:{} finalTile:{}".format(
                        self.roomID, self.current_round, win_op, finalTile))
                # if self.is_win_limit(finalTile, win_op) == False:
                # 	return False , base_score, result_list
                isMouseGeneral = utility.isMouseGeneral(
                    handTiles, handTilesButKing, kingTilesNum, self.kingTiles,
                    finalTile)
                if isMouseGeneral and win_op != const.OP_DRAW_WIN:
                    DEBUG_MSG(
                        "room:{},curround:{} 3N win_op:{} isMouseGeneral:{}".
                        format(self.roomID, self.current_round, win_op,
                               isMouseGeneral))
                    return False, base_score, result_list
                elif isMouseGeneral and win_op == const.OP_DRAW_WIN:
                    return True, 20, result_list
                return True, (base_score + utility.multiplyCalc(
                    self.game_mode, win_op, result_list)) * [
                        2 if win_op == const.OP_DRAW_WIN else 1
                    ][0], result_list
            DEBUG_MSG(
                "room:{},curround:{} 4 handTiles:{} finalTile:{} win_op:{} idx:{}"
                .format(self.roomID, self.current_round, handTiles, finalTile,
                        win_op, idx))
            return False, base_score, result_list