コード例 #1
0
ファイル: win_rule_yunnan.py プロジェクト: zhaozw/hall37
    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
コード例 #2
0
    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
コード例 #3
0
ファイル: win_rule_yunnan.py プロジェクト: zhaozw/hall37
    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
コード例 #4
0
ファイル: win_rule_yunnan.py プロジェクト: zhaozw/hall37
 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
コード例 #5
0
ファイル: win_rule_yunnan.py プロジェクト: zhaozw/hall37
 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
コード例 #6
0
ファイル: win.py プロジェクト: zhaozw/hall37
    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
コード例 #7
0
ファイル: win.py プロジェクト: zhaozw/hall37
 def getCardNumByType(cls, tileArr, tileType):
     num = 0
     for tile in MTile.traverseTile(tileType):
         num += tileArr[tile]
     return num
コード例 #8
0
    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
コード例 #9
0
 def getCardNumByType(cls, tileArr, tileType):
     num = 0
     for tile in MTile.traverseTile(tileType):
         num += tileArr[tile]
     return num
コード例 #10
0
ファイル: win_rule_yunnan.py プロジェクト: zhaozw/hall37
    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
コード例 #11
0
ファイル: win_rule_yunnan.py プロジェクト: zhaozw/hall37
    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