def isLanPaiHu(cls, tiles, magicTiles): """先做简单的牌型检查,如果符合再进行细节判断""" if len(tiles[MHand.TYPE_CHI]) != 0: return False if len(tiles[MHand.TYPE_PENG]) != 0: return False if len(tiles[MHand.TYPE_GANG]) != 0: return False # 去除手牌赖子,并计数 haveMagicCount = 0 lanpaiTiles = copy.deepcopy(tiles[MHand.TYPE_HAND]) for magicTile in magicTiles: while magicTile in lanpaiTiles: lanpaiTiles.remove(magicTile) haveMagicCount += 1 tileArr = MTile.changeTilesToValueArr(lanpaiTiles) # 去除赖子后手牌数不能有超过2张的 for count in tileArr: if count <= 1: continue else: return False # 去除赖子后不重复字牌加赖子数要大于等于5,并且可用赖子数=字牌+赖子-5 # canUseMagicCount = haveMagicCount tempFengTiles = MTile.traverseTile(MTile.TILE_FENG) fengArr = tileArr[tempFengTiles[0]:tempFengTiles[len(tempFengTiles) - 1] + 1] # 检查字牌种类和每种的数量,之前因为已经判断过数量小于等于1,这里不再重复 fengCount = 0 for count in fengArr: if count == 1: fengCount += 1 # 如果字牌每种不超过1张且有五种,开始判断其它花色 if fengCount + haveMagicCount >= 5: # 分别判断三种花色 if cls.checkBukao(tileArr, MTile.TILE_WAN) and cls.checkBukao( tileArr, MTile.TILE_TONG) and cls.checkBukao( tileArr, MTile.TILE_TIAO): return True else: return False return False
def isLanPaiCheck(self, tiles, magicTiles): """先做简单的牌型检查,如果符合再进行细节判断""" if len(tiles[MHand.TYPE_HAND]) != 14: return False, 0, 0 ftlog.debug("isLanPaiCheck handcard is ok") # 去除手牌赖子,并计数 haveMagicCount = 0 lanpaiTiles = copy.deepcopy(tiles[MHand.TYPE_HAND]) for magicTile in magicTiles: while magicTile in lanpaiTiles: lanpaiTiles.remove(magicTile) haveMagicCount += 1 ftlog.debug("isLanPaiCheck haveMagicCount =", haveMagicCount, "lanpaiTiles =", lanpaiTiles) tileArr = MTile.changeTilesToValueArr(lanpaiTiles) # 去除赖子后手牌数不能有超过2张的 for count in tileArr: if count <= 1: continue else: return False, 0, 0 # 去除赖子后不重复字牌加赖子数要大于等于5,并且可用赖子数=字牌+赖子-5 # canUseMagicCount = haveMagicCount tempFengTiles = MTile.traverseTile(MTile.TILE_FENG) fengArr = tileArr[tempFengTiles[0]:tempFengTiles[len(tempFengTiles) - 1] + 1] ftlog.debug("isLanPaiCheck fengArr =", fengArr) # 检查字牌种类和每种的数量,之前因为已经判断过数量小于等于1,这里不再重复 fengCount = 0 for count in fengArr: if count == 1: fengCount += 1 # 如果字牌每种不超过1张且有五种,开始判断其它花色 if fengCount + haveMagicCount >= 5: # 分别判断三种花色 ftlog.debug("isLanPaiCheck checkBukao begin tileArr = ", tileArr) if self.checkBukao(tileArr, MTile.TILE_WAN) and self.checkBukao(tileArr, MTile.TILE_TONG) and self.checkBukao( tileArr, MTile.TILE_TIAO): return True, fengCount, haveMagicCount else: return False, 0, 0 return False, 0, 0
def isLanPaiHu(cls, tiles, magicTiles): """先做简单的牌型检查,如果符合再进行细节判断""" if len(tiles[MHand.TYPE_CHI]) != 0: return False if len(tiles[MHand.TYPE_PENG]) != 0: return False if len(tiles[MHand.TYPE_GANG]) != 0: return False # 去除手牌赖子,并计数 haveMagicCount = 0 lanpaiTiles = copy.deepcopy(tiles[MHand.TYPE_HAND]) for magicTile in magicTiles: while magicTile in lanpaiTiles: lanpaiTiles.remove(magicTile) haveMagicCount += 1 tileArr = MTile.changeTilesToValueArr(lanpaiTiles) # 去除赖子后手牌数不能有超过2张的 for count in tileArr: if count <= 1: continue else: return False # 去除赖子后不重复字牌加赖子数要大于等于5,并且可用赖子数=字牌+赖子-5 # canUseMagicCount = haveMagicCount tempFengTiles = MTile.traverseTile(MTile.TILE_FENG) fengArr = tileArr[tempFengTiles[0]:tempFengTiles[len(tempFengTiles) - 1] + 1] # 检查字牌种类和每种的数量,之前因为已经判断过数量小于等于1,这里不再重复 fengCount = 0 for count in fengArr: if count == 1: fengCount += 1 # 如果字牌每种不超过1张且有五种,开始判断其它花色 if fengCount + haveMagicCount >= 5: # 分别判断三种花色 if cls.checkBukao(tileArr, MTile.TILE_WAN) and cls.checkBukao(tileArr, MTile.TILE_TONG) and cls.checkBukao( tileArr, MTile.TILE_TIAO): return True else: return False return False
def checkBukao(cls, tileArr, tileType): """烂牌检查三种花色的不靠""" tempTiles = MTile.traverseTile(tileType) colorArr = tileArr[tempTiles[0]:tempTiles[len(tempTiles) - 1] + 1] colorTiles = [] for i in range(len(colorArr)): if colorArr[i] > 0: colorTiles.append(i) if len(colorTiles) > 3: return False # 然后只需要判断不靠即可 elif len(colorTiles) == 2: if (colorTiles[0] - colorTiles[1]) % 3 != 0: return False elif len(colorTiles) == 3: if (colorTiles[0] - colorTiles[1]) % 3 != 0 or (colorTiles[0] - colorTiles[2]) % 3 != 0 or ( colorTiles[1] - colorTiles[2]) % 3 != 0: return False return True
def checkBukao(cls, tileArr, tileType): """烂牌检查三种花色的不靠""" tempTiles = MTile.traverseTile(tileType) colorArr = tileArr[tempTiles[0]:tempTiles[len(tempTiles) - 1] + 1] colorTiles = [] for i in range(len(colorArr)): if colorArr[i] > 0: colorTiles.append(i) if len(colorTiles) > 3: return False # 然后只需要判断不靠即可 elif len(colorTiles) == 2: if (colorTiles[0] - colorTiles[1]) % 3 != 0: return False elif len(colorTiles) == 3: if (colorTiles[0] - colorTiles[1]) % 3 != 0 or ( colorTiles[0] - colorTiles[2]) % 3 != 0 or ( colorTiles[1] - colorTiles[2]) % 3 != 0: return False return True
def isBu(cls, tileArr, resultArr, magicArr, tileType, hasJiang): """ 判断某个花色是否是三朴,缺的牌从癞子中获取,如果没有癞子牌了,也形不成三朴,和牌失败 """ if 0 == cls.getCardNumByType(tileArr, tileType): # 这个花色没有牌 return True, hasJiang # ftlog.debug('check card:', MTile.traverseTile(tileType)) for tileIndex in MTile.traverseTile(tileType): if tileArr[tileIndex] == 0: continue if tileArr[tileIndex] >= 3: # 刻,没有占用癞子 tileArr[tileIndex] -= 3 resultTmp, hasJiang = cls.isBu(tileArr, resultArr, magicArr, tileType, hasJiang) if resultTmp: resultArr.append([tileIndex, tileIndex, tileIndex]) return True, hasJiang # 还原手牌,继续判断 tileArr[tileIndex] += 3 if (tileArr[tileIndex] == 2) and (len(magicArr) >= 1): # 对子,尝试加一张癞子组成刻 tileArr[tileIndex] -= 2 mTile = magicArr.pop(-1) resultTmp, hasJiang = cls.isBu(tileArr, resultArr, magicArr, tileType, hasJiang) if resultTmp: resultArr.append([tileIndex, tileIndex, mTile]) return True, hasJiang # 还原手牌,继续判断 tileArr[tileIndex] += 2 magicArr.append(mTile) if (tileArr[tileIndex] == 1) and (len(magicArr) >= 2): # 单张,尝试加两张癞子组成刻 tileArr[tileIndex] -= 1 mTile1 = magicArr.pop(-1) mTile2 = magicArr.pop(-1) resultTmp, hasJiang = cls.isBu(tileArr, resultArr, magicArr, tileType, hasJiang) if resultTmp: resultArr.append([tileIndex, mTile1, mTile2]) return True, hasJiang # 还原手牌,继续判断 tileArr[tileIndex] += 1 magicArr.append(mTile1) magicArr.append(mTile2) if not hasJiang and tileArr[tileIndex] > 0 and (tileArr[tileIndex] + len(magicArr) >= 2): # 凑对了 tileArr[tileIndex] -= 1 isMagicJiang = False jiangTile = tileIndex if tileArr[tileIndex] > 0: tileArr[tileIndex] -= 1 else: isMagicJiang = True jiangTile = magicArr.pop(-1) oldJiang = hasJiang # 当前的对子当将测测是否成胡 resultTmp, hasJiang = cls.isBu(tileArr, resultArr, magicArr, tileType, True) if resultTmp: resultArr.append([tileIndex, jiangTile]) hasJiang = True return True, hasJiang else: # 还原将牌标记 hasJiang = oldJiang # 还原手牌 tileArr[tileIndex] += 1 if isMagicJiang: magicArr.append(jiangTile) else: tileArr[tileIndex] += 1 if tileIndex >= MTile.TILE_DONG_FENG: # 风箭牌不能组成顺 return False, hasJiang # 提取顺牌组合 if tileArr[tileIndex] > 0: # 测试顺子 0 1 2 if MTile.getValue(tileIndex) <= 7: tile0 = tileIndex needMagic = 0 is1Magic = False is2Magic = False if tileArr[tileIndex + 1] == 0: needMagic += 1 is1Magic = True if tileArr[tileIndex + 2] == 0: needMagic += 1 is2Magic = True if needMagic <= len(magicArr): pattern = [tile0, None, None] tileArr[tileIndex] -= 1 if is1Magic: pattern[1] = (magicArr.pop(-1)) else: pattern[1] = (tileIndex + 1) tileArr[tileIndex + 1] -= 1 if is2Magic: pattern[2] = (magicArr.pop(-1)) else: pattern[2] = (tileIndex + 2) tileArr[tileIndex + 2] -= 1 resultTmp, hasJiang = cls.isBu(tileArr, resultArr, magicArr, tileType, hasJiang) if resultTmp: resultArr.append(pattern) return True, hasJiang # 还原手牌 tileArr[tileIndex] += 1 if is1Magic: magicArr.append(pattern[1]) else: tileArr[tileIndex + 1] += 1 if is2Magic: magicArr.append(pattern[2]) else: tileArr[tileIndex + 2] += 1 # 测试顺子 -1 0 1 if 8 >= MTile.getValue(tileIndex) >= 2: tile1 = tileIndex needMagic = 0 is0Magic = False is2Magic = False if tileArr[tileIndex - 1] == 0: needMagic += 1 is0Magic = True if tileArr[tileIndex + 1] == 0: needMagic += 1 is2Magic = True if needMagic <= len(magicArr): pattern = [None, tile1, None] tileArr[tileIndex] -= 1 if is0Magic: pattern[0] = (magicArr.pop(-1)) else: pattern[0] = (tileIndex - 1) tileArr[tileIndex - 1] -= 1 if is2Magic: pattern.append(magicArr.pop(-1)) else: pattern.append(tileIndex + 1) tileArr[tileIndex + 1] -= 1 resultTmp, hasJiang = cls.isBu(tileArr, resultArr, magicArr, tileType, hasJiang) if resultTmp: resultArr.append(pattern) return True, hasJiang # 还原手牌 tileArr[tileIndex] += 1 if is0Magic: magicArr.append(pattern[0]) else: tileArr[tileIndex - 1] += 1 if is2Magic: magicArr.append(pattern[2]) else: tileArr[tileIndex + 1] += 1 # 测试顺子 -2 -1 0 if MTile.getValue(tileIndex) >= 3: tile2 = tileIndex needMagic = 0 is0Magic = False is1Magic = False if tileArr[tileIndex - 2] == 0: needMagic += 1 is0Magic = True if tileArr[tileIndex - 1] == 0: needMagic += 1 is1Magic = True if needMagic <= len(magicArr): pattern = [None, None, tile2] tileArr[tileIndex] -= 1 if is0Magic: pattern[0] = (magicArr.pop(-1)) else: pattern[0] = (tileIndex - 2) tileArr[tileIndex - 2] -= 1 if is1Magic: pattern[1] = (magicArr.pop(-1)) else: pattern[1] = (tileIndex - 1) tileArr[tileIndex - 1] -= 1 resultTmp, hasJiang = cls.isBu(tileArr, resultArr, magicArr, tileType, hasJiang) if resultTmp: resultArr.append(pattern) return True, hasJiang # 还原手牌 tileArr[tileIndex] += 1 if is0Magic: magicArr.append(pattern[0]) else: tileArr[tileIndex - 2] += 1 if is1Magic: magicArr.append(pattern[1]) else: tileArr[tileIndex - 1] += 1 # 无和牌可能 return False, hasJiang
def getCardNumByType(cls, tileArr, tileType): num = 0 for tile in MTile.traverseTile(tileType): num += tileArr[tile] return num
def isBu(cls, tileArr, resultArr, magicArr, tileType, hasJiang): """ 判断某个花色是否是三朴,缺的牌从癞子中获取,如果没有癞子牌了,也形不成三朴,和牌失败 """ if 0 == cls.getCardNumByType(tileArr, tileType): # 这个花色没有牌 return True, hasJiang # ftlog.debug('check card:', MTile.traverseTile(tileType)) for tileIndex in MTile.traverseTile(tileType): if tileArr[tileIndex] == 0: continue if tileArr[tileIndex] >= 3: # 刻,没有占用癞子 tileArr[tileIndex] -= 3 resultTmp, hasJiang = cls.isBu(tileArr, resultArr, magicArr, tileType, hasJiang) if resultTmp: resultArr.append([tileIndex, tileIndex, tileIndex]) return True, hasJiang # 还原手牌,继续判断 tileArr[tileIndex] += 3 if (tileArr[tileIndex] == 2) and (len(magicArr) >= 1): # 对子,尝试加一张癞子组成刻 tileArr[tileIndex] -= 2 mTile = magicArr.pop(-1) resultTmp, hasJiang = cls.isBu(tileArr, resultArr, magicArr, tileType, hasJiang) if resultTmp: resultArr.append([tileIndex, tileIndex, mTile]) return True, hasJiang # 还原手牌,继续判断 tileArr[tileIndex] += 2 magicArr.append(mTile) if (tileArr[tileIndex] == 1) and (len(magicArr) >= 2): # 单张,尝试加两张癞子组成刻 tileArr[tileIndex] -= 1 mTile1 = magicArr.pop(-1) mTile2 = magicArr.pop(-1) resultTmp, hasJiang = cls.isBu(tileArr, resultArr, magicArr, tileType, hasJiang) if resultTmp: resultArr.append([tileIndex, mTile1, mTile2]) return True, hasJiang # 还原手牌,继续判断 tileArr[tileIndex] += 1 magicArr.append(mTile1) magicArr.append(mTile2) if not hasJiang and tileArr[tileIndex] > 0 and ( tileArr[tileIndex] + len(magicArr) >= 2): # 凑对了 tileArr[tileIndex] -= 1 isMagicJiang = False jiangTile = tileIndex if tileArr[tileIndex] > 0: tileArr[tileIndex] -= 1 else: isMagicJiang = True jiangTile = magicArr.pop(-1) oldJiang = hasJiang # 当前的对子当将测测是否成胡 resultTmp, hasJiang = cls.isBu(tileArr, resultArr, magicArr, tileType, True) if resultTmp: resultArr.append([tileIndex, jiangTile]) hasJiang = True return True, hasJiang else: # 还原将牌标记 hasJiang = oldJiang # 还原手牌 tileArr[tileIndex] += 1 if isMagicJiang: magicArr.append(jiangTile) else: tileArr[tileIndex] += 1 if tileIndex >= MTile.TILE_DONG_FENG: # 风箭牌不能组成顺 return False, hasJiang # 提取顺牌组合 if tileArr[tileIndex] > 0: # 测试顺子 0 1 2 if MTile.getValue(tileIndex) <= 7: tile0 = tileIndex needMagic = 0 is1Magic = False is2Magic = False if tileArr[tileIndex + 1] == 0: needMagic += 1 is1Magic = True if tileArr[tileIndex + 2] == 0: needMagic += 1 is2Magic = True if needMagic <= len(magicArr): pattern = [tile0, None, None] tileArr[tileIndex] -= 1 if is1Magic: pattern[1] = (magicArr.pop(-1)) else: pattern[1] = (tileIndex + 1) tileArr[tileIndex + 1] -= 1 if is2Magic: pattern[2] = (magicArr.pop(-1)) else: pattern[2] = (tileIndex + 2) tileArr[tileIndex + 2] -= 1 resultTmp, hasJiang = cls.isBu(tileArr, resultArr, magicArr, tileType, hasJiang) if resultTmp: resultArr.append(pattern) return True, hasJiang # 还原手牌 tileArr[tileIndex] += 1 if is1Magic: magicArr.append(pattern[1]) else: tileArr[tileIndex + 1] += 1 if is2Magic: magicArr.append(pattern[2]) else: tileArr[tileIndex + 2] += 1 # 测试顺子 -1 0 1 if 8 >= MTile.getValue(tileIndex) >= 2: tile1 = tileIndex needMagic = 0 is0Magic = False is2Magic = False if tileArr[tileIndex - 1] == 0: needMagic += 1 is0Magic = True if tileArr[tileIndex + 1] == 0: needMagic += 1 is2Magic = True if needMagic <= len(magicArr): pattern = [None, tile1, None] tileArr[tileIndex] -= 1 if is0Magic: pattern[0] = (magicArr.pop(-1)) else: pattern[0] = (tileIndex - 1) tileArr[tileIndex - 1] -= 1 if is2Magic: pattern.append(magicArr.pop(-1)) else: pattern.append(tileIndex + 1) tileArr[tileIndex + 1] -= 1 resultTmp, hasJiang = cls.isBu(tileArr, resultArr, magicArr, tileType, hasJiang) if resultTmp: resultArr.append(pattern) return True, hasJiang # 还原手牌 tileArr[tileIndex] += 1 if is0Magic: magicArr.append(pattern[0]) else: tileArr[tileIndex - 1] += 1 if is2Magic: magicArr.append(pattern[2]) else: tileArr[tileIndex + 1] += 1 # 测试顺子 -2 -1 0 if MTile.getValue(tileIndex) >= 3: tile2 = tileIndex needMagic = 0 is0Magic = False is1Magic = False if tileArr[tileIndex - 2] == 0: needMagic += 1 is0Magic = True if tileArr[tileIndex - 1] == 0: needMagic += 1 is1Magic = True if needMagic <= len(magicArr): pattern = [None, None, tile2] tileArr[tileIndex] -= 1 if is0Magic: pattern[0] = (magicArr.pop(-1)) else: pattern[0] = (tileIndex - 2) tileArr[tileIndex - 2] -= 1 if is1Magic: pattern[1] = (magicArr.pop(-1)) else: pattern[1] = (tileIndex - 1) tileArr[tileIndex - 1] -= 1 resultTmp, hasJiang = cls.isBu(tileArr, resultArr, magicArr, tileType, hasJiang) if resultTmp: resultArr.append(pattern) return True, hasJiang # 还原手牌 tileArr[tileIndex] += 1 if is0Magic: magicArr.append(pattern[0]) else: tileArr[tileIndex - 2] += 1 if is1Magic: magicArr.append(pattern[1]) else: tileArr[tileIndex - 1] += 1 # 无和牌可能 return False, hasJiang
def getCardNumByType(cls, tileArr, tileType): num = 0 for tile in MTile.traverseTile(tileType): num += tileArr[tile] return num
def checkSpecialHu(cls, tiles, magicTiles, magicTileCount, tile): # 判断七对系列 if cls.isPairs(tiles, magicTiles): return True # 判定五六七星烂,手牌数必须为14,所有花色最多一张牌,字牌不重复且大于等于5种,其它花色必须都存在且互相不靠 if cls.isLanPaiHu(tiles, magicTiles): return True # 判断其它特殊牌型 allTiles = MHand.copyAllTilesToList(tiles) tempTiles = copy.deepcopy(allTiles) for magicTile in magicTiles: while magicTile in tempTiles: tempTiles.remove(magicTile) tileArr = MTile.changeTilesToValueArr(tempTiles) colorState = MTile.getColorCount(tileArr) tempFengTiles = MTile.traverseTile(MTile.TILE_FENG) ziState = tileArr[tempFengTiles[0]:tempFengTiles[len(tempFengTiles) - 1] + 1] # menState = 0 # if len(allTiles) == 14: # menState = 1 playerGangCount = len(tiles[MHand.TYPE_GANG]) if playerGangCount >= 2 \ or colorState == 1 or colorState == 0 \ or len(tiles[MHand.TYPE_HAND]) == 2 or len(tiles[MHand.TYPE_HAND]) == 3: return True # 三元和混三元 baibanCount = cls.getZiCountByTypeBySeatId(MTile.TILE_BAI_BAN, ziState) hongzhongCount = cls.getZiCountByTypeBySeatId(MTile.TILE_HONG_ZHONG, ziState) facaiCount = cls.getZiCountByTypeBySeatId(MTile.TILE_FA_CAI, ziState) if baibanCount + magicTileCount >= 2 \ and hongzhongCount + magicTileCount >= 2 \ and facaiCount + magicTileCount >= 2: if baibanCount + hongzhongCount + magicTileCount >= 5 \ and baibanCount + facaiCount + magicTileCount >= 5 \ and hongzhongCount + facaiCount + magicTileCount >= 5: if baibanCount + hongzhongCount + facaiCount + magicTileCount >= 8: return True # 大对子,门前不能有吃,手牌多加一个赖子,能保证都是3张 if len(tiles[MHand.TYPE_CHI]) == 0: duiziTiles = copy.deepcopy(tiles[MHand.TYPE_HAND]) for magicTile in magicTiles: while magicTile in duiziTiles: duiziTiles.remove(magicTile) # 如果点炮胡,需要给牌堆里加回去一张赖子,并当普通牌处理 if tile in magicTiles: duiziTiles.append(tile) duiziArr = MTile.changeTilesToValueArr(duiziTiles) ftlog.debug("MYunnanOneResult duiziArr = ", duiziArr) cardTypeCount = 0 # 假设多一张可用赖子 duiziMagicCount = magicTileCount + 1 for index in range(len(duiziArr)): if duiziArr[index] != 0: cardTypeCount += 1 if duiziArr[index] < 3: duiziMagicCount = duiziMagicCount - (3 - duiziArr[index]) if cardTypeCount <= 5 and duiziMagicCount >= 0: return True return False
def checkSpecialHu(cls, tiles, magicTiles, magicTileCount, tile): # 判断七对系列 if cls.isPairs(tiles, magicTiles): return True # 判定五六七星烂,手牌数必须为14,所有花色最多一张牌,字牌不重复且大于等于5种,其它花色必须都存在且互相不靠 if cls.isLanPaiHu(tiles, magicTiles): return True # 判断其它特殊牌型 allTiles = MHand.copyAllTilesToList(tiles) tempTiles = copy.deepcopy(allTiles) for magicTile in magicTiles: while magicTile in tempTiles: tempTiles.remove(magicTile) tileArr = MTile.changeTilesToValueArr(tempTiles) colorState = MTile.getColorCount(tileArr) tempFengTiles = MTile.traverseTile(MTile.TILE_FENG) ziState = tileArr[tempFengTiles[0]:tempFengTiles[len(tempFengTiles) - 1] + 1] # menState = 0 # if len(allTiles) == 14: # menState = 1 playerGangCount = len(tiles[MHand.TYPE_GANG]) if playerGangCount >= 2 \ or colorState == 1 or colorState == 0 \ or len(tiles[MHand.TYPE_HAND]) == 2 or len(tiles[MHand.TYPE_HAND]) == 3: return True # 三元和混三元 baibanCount = cls.getZiCountByTypeBySeatId(MTile.TILE_BAI_BAN, ziState) hongzhongCount = cls.getZiCountByTypeBySeatId(MTile.TILE_HONG_ZHONG, ziState) facaiCount = cls.getZiCountByTypeBySeatId(MTile.TILE_FA_CAI, ziState) if baibanCount + magicTileCount >= 2 \ and hongzhongCount + magicTileCount >= 2 \ and facaiCount + magicTileCount >= 2: if baibanCount + hongzhongCount + magicTileCount >= 5 \ and baibanCount + facaiCount + magicTileCount >= 5 \ and hongzhongCount + facaiCount + magicTileCount >= 5: if baibanCount + hongzhongCount + facaiCount + magicTileCount >= 8: return True # 大对子,门前不能有吃,手牌多加一个赖子,能保证都是3张 if len(tiles[MHand.TYPE_CHI]) == 0: duiziTiles = copy.deepcopy(tiles[MHand.TYPE_HAND]) for magicTile in magicTiles: while magicTile in duiziTiles: duiziTiles.remove(magicTile) # 如果点炮胡,需要给牌堆里加回去一张赖子,并当普通牌处理 if tile in magicTiles: duiziTiles.append(tile) duiziArr = MTile.changeTilesToValueArr(duiziTiles) ftlog.debug("MYunnanOneResult duiziArr = ", duiziArr) cardTypeCount = 0 # 假设多一张可用赖子 duiziMagicCount = magicTileCount + 1 for index in range(len(duiziArr)): if duiziArr[index] != 0: cardTypeCount += 1 if duiziArr[index] < 3: duiziMagicCount = duiziMagicCount - (3 - duiziArr[index]) if cardTypeCount <= 5 and duiziMagicCount >= 0: return True return False