Esempio n. 1
0
 def isMenQing(self):
     '''
     胡牌时没有碰过牌,没有明杠过
     '''
     # 判断房间配置中,是否有门清选项    
     if not self.tableTileMgr.tableConfig.get(MTDefine.MEN_CLEAR_DOUBLE, 0):
         ftlog.debug('MSiChuanTilePattern.isMenQing False because roomConfig')
         return False
     
     handTiles = self.playerAllTiles[MHand.TYPE_HAND]
     
     # 获取杠的牌
     allGangPattern = []
     for gangObj in self.playerAllTiles[MHand.TYPE_GANG]:
         gang = {}
         if gangObj.has_key('pattern'):
             gang['pattern'] = gangObj['pattern']
         if gangObj.has_key('style'):
             gang['style'] = gangObj['style']
         if gangObj.has_key('actionID'):
             gang['actionID'] = gangObj['actionID']
         if gangObj.has_key('styleScore'):
             gang['styleScore'] = gangObj['styleScore']
         allGangPattern.append(gang)
     
     _, an = MTile.calcGangCount(allGangPattern)
     
     ftlog.debug('MSichuanTilePattern.isMenQing handTiles:', handTiles
                         , 'allGang:', allGangPattern
                         , 'an:', an)
     if len(handTiles) == 14 - an * 3:
         return True
     else:
         return False
Esempio n. 2
0
    def SatisyKe2(self, tiles):
        #有刻
        if len(tiles[MHand.TYPE_PENG]) > 0:
            return True

        ming, an = MTile.calcGangCount(tiles[MHand.TYPE_GANG])
        if (ming + an) > 0:
            return True

        return False
Esempio n. 3
0
    def SatisyKe(self,tiles):
        #有刻
        if len(tiles[MHand.TYPE_PENG])==0:
            ming,an = MTile.calcGangCount(tiles[MHand.TYPE_GANG])
            if (ming + an) ==0:
                allTiles = MHand.copyAllTilesToList(tiles)
                tilesArr = MTile.changeTilesToValueArr(allTiles)
                #中发白做将
                if tilesArr[MTile.TILE_HONG_ZHONG] < 2 and tilesArr[MTile.TILE_FA_CAI] < 2 and tilesArr[MTile.TILE_BAI_BAN] < 2:
                    #中发白
                    if not self.hasKe(tiles[MHand.TYPE_HAND]):
                        return False

        return True
Esempio n. 4
0
    def SatisyKe2(self,tiles):
        #有刻
        if len(tiles[MHand.TYPE_MAO])>0 or len(tiles[MHand.TYPE_PENG])>0:
            return True
        
        ming,an = MTile.calcGangCount(tiles[MHand.TYPE_GANG])
        if (ming + an) >0:
            return True
        
        allTiles = MHand.copyAllTilesToList(tiles)
        tilesArr = MTile.changeTilesToValueArr(allTiles)
        #中发白做将
        if tilesArr[MTile.TILE_HONG_ZHONG] >= 2 or tilesArr[MTile.TILE_FA_CAI] >= 2 or tilesArr[MTile.TILE_BAI_BAN] >= 2:
            return True
        
        #中发白
        if (tilesArr[MTile.TILE_HONG_ZHONG]>0 and tilesArr[MTile.TILE_FA_CAI]>0 and tilesArr[MTile.TILE_BAI_BAN]>0):
            return True

        return False
Esempio n. 5
0
    def canTing(self, tiles, leftTiles, tile, magicTiles=[], winSeatId=0):
        """子类必须实现
        参数:
        1)tiles 该玩家的手牌
        2)leftTiles 剩余手牌
        返回值:
        是否可以听牌,听牌详情
        """
        handCount = len(tiles[MHand.TYPE_HAND])
        if handCount < 5:
            return False, []

        isTing, tingResults = MTing.canTing(self.tilePatternChecker,
                                            self.tableTileMgr,
                                            MTile.cloneTiles(tiles), leftTiles,
                                            self.winRuleMgr, tile, magicTiles,
                                            winSeatId)
        ftlog.debug('MTingHaerbinRule.MTing.canTing isTing:', isTing,
                    ' tingResults:', tingResults)
        #         [{'dropTile': 11, 'winNodes': [{'winTile': 1, 'winTileCount': 3, 'pattern': [[6, 6], [5, 6, 7], [4, 5, 6], [1, 2, 3]]}, {'winTile': 2, 'winTileCount': 2, 'pattern': [[6, 6, 6], [5, 6, 7], [3, 4, 5], [2, 2]]}, {'winTile': 4, 'winTileCount': 3, 'pattern': [[6, 6], [5, 6, 7], [4, 5, 6], [2, 3, 4]]}, {'winTile': 5, 'winTileCount': 2, 'pattern': [[6, 6, 6], [5, 6, 7], [5, 5], [2, 3, 4]]}, {'winTile': 7, 'winTileCount': 1, 'pattern': [[6, 6], [5, 6, 7], [5, 6, 7], [2, 3, 4]]}, {'winTile': 8, 'winTileCount': 1, 'pattern': [[6, 7, 8], [6, 6, 6], [5, 5], [2, 3, 4]]}]}]

        if not isTing:
            return False, []

        chiCount = len(tiles[MHand.TYPE_CHI])
        pengCount = len(tiles[MHand.TYPE_PENG])
        gangCount = len(tiles[MHand.TYPE_GANG])

        mingGangCount = 0
        anGangCount = 0
        #计算明杠个数,因为暗杠不算开门
        if gangCount != 0:
            mingGangCount, anGangCount = MTile.calcGangCount(
                tiles[MHand.TYPE_GANG])
        ftlog.debug('MTingHaerbinRule.gang tiles:', tiles[MHand.TYPE_GANG],
                    ' mingGangCount=', mingGangCount, ' anGangCount=',
                    anGangCount)

        if (chiCount + pengCount + mingGangCount) == 0:
            return False, []

        # 检查刻,刻的来源,碰牌/明杠牌/手牌
        keCount = pengCount + mingGangCount + anGangCount
        # 必须有顺牌
        shunCount = chiCount

        newTingResults = []
        for tingResult in tingResults:
            newWinNodes = []
            winNodes = tingResult['winNodes']
            for winNode in winNodes:
                newTiles = MTile.cloneTiles(tiles)
                newTiles[MHand.TYPE_HAND].remove(tingResult['dropTile'])
                newTiles[MHand.TYPE_HAND].append(winNode['winTile'])
                tileArr = MTile.changeTilesToValueArr(
                    MHand.copyAllTilesToList(newTiles))
                #       ftlog.debug( 'MTingHaerbinRule.canTing tileArr:', tileArr )

                # 清一色不可以听牌/和牌
                if self.getTableConfig(MTDefine.YISE_CAN_TING, 0) != 1:
                    newTileArr = copy.deepcopy(tileArr)
                    newTileArr[MTile.TILE_HONG_ZHONG] = 0
                    colorCount = MTile.getColorCount(newTileArr)
                    if colorCount == 1:
                        # 清一色不能和牌
                        ftlog.debug('MTingHaerbinRule.canTing colorCount:',
                                    colorCount, ' can not win, continue....')
                        continue

                # 检查牌中的幺/九
                # 1软 听牌可以没有19,只要胡牌带19就可以
                # 2硬 听牌时就要有19
                RuanYaoJiuConfig = self.getTableConfig(MTDefine.RUAN_YAO_JIU,
                                                       1)
                if RuanYaoJiuConfig == 0:
                    #硬幺九 :听牌必须有19
                    #tileArr 减去 winNode['winTile'] 后判断
                    tileArr[winNode['winTile']] -= 1
                    yaoCount = tileArr[MTile.TILE_ONE_WAN] + tileArr[
                        MTile.TILE_ONE_TONG] + tileArr[MTile.TILE_ONE_TIAO]
                    jiuCount = tileArr[MTile.TILE_NINE_WAN] + tileArr[
                        MTile.TILE_NINE_TONG] + tileArr[MTile.TILE_NINE_TIAO]
                    zhongCount = tileArr[MTile.TILE_HONG_ZHONG]
                    ftlog.debug('MTingJixiRule.canTing : YING yaoCount:',
                                yaoCount, 'jiuCount', jiuCount, 'zhongCount',
                                zhongCount)
                    if (yaoCount + jiuCount + zhongCount) <= 0:
                        continue
                else:
                    #软幺九 :只要胡牌有19就行
                    yaoCount = tileArr[MTile.TILE_ONE_WAN] + tileArr[
                        MTile.TILE_ONE_TONG] + tileArr[MTile.TILE_ONE_TIAO]
                    jiuCount = tileArr[MTile.TILE_NINE_WAN] + tileArr[
                        MTile.TILE_NINE_TONG] + tileArr[MTile.TILE_NINE_TIAO]
                    zhongCount = tileArr[MTile.TILE_HONG_ZHONG]
                    ftlog.debug('MTingJixiRule.canTing : RUAN yaoCount:',
                                yaoCount, 'jiuCount', jiuCount, 'zhongCount',
                                zhongCount)
                    if (yaoCount + jiuCount + zhongCount) == 0:
                        continue

                patterns = winNode['pattern']
                #夹起步(顺牌只能和夹和3,7) 除单吊
                chunJiaConfig = self.getTableConfig(MTDefine.MIN_MULTI, 0)
                if chunJiaConfig:
                    bianMulti = self.tableConfig.get(MTDefine.BIAN_MULTI, 0)
                    danDiaoJia = self.tableConfig.get(MTDefine.DAN_DIAO_JIA, 1)
                    hasJia = False
                    for pattern in patterns:
                        if winNode['winTile'] in pattern:
                            if len(pattern) == 3 and pattern[0] != pattern[1]:
                                if pattern.index(winNode['winTile']) == 2:
                                    if bianMulti:
                                        if MTile.getValue(
                                                winNode['winTile']) == 3:
                                            hasJia = True
                                            break
                                if pattern.index(winNode['winTile']) == 0:
                                    if bianMulti:
                                        if MTile.getValue(
                                                winNode['winTile']) == 7:
                                            hasJia = True
                                            break

                                if pattern.index(winNode['winTile']) == 1:
                                    hasJia = True
                                    break

                            #单吊
                            if len(pattern) == 2 and pattern[0] == pattern[
                                    1] and danDiaoJia:
                                hasJia = True
                                break

                    if not hasJia:
                        ftlog.debug(
                            'MTingHaerbinRule.canTing :, can not win tile:',
                            winNode['winTile'], ', not has jia continue....')
                        continue

                patterns = winNode['pattern']
                checkKeCount = keCount + self.getKeCount(patterns)
                checkShunCount = shunCount + self.getShunCount(patterns)
                ftlog.debug('MTingHaerbinRule.canTing keCount:', keCount,
                            ' shunCount:', shunCount)

                if checkKeCount and checkShunCount:
                    newWinNodes.append(winNode)

            if len(newWinNodes) > 0:
                newTingResult = {}
                newTingResult['dropTile'] = tingResult['dropTile']
                newTingResult['winNodes'] = newWinNodes
                newTingResults.append(newTingResult)

        return len(newTingResults) > 0, newTingResults
Esempio n. 6
0
    def canTing(self, tiles, leftTiles, tile, magicTiles=[], winSeatId=0):
        """子类必须实现
        参数:
        1)tiles 该玩家的手牌
        2)leftTiles 剩余手牌
        返回值:
        是否可以听牌,听牌详情
        """
        handCount = len(tiles[MHand.TYPE_HAND])
        if handCount < 5:
            return False, []

        isTing, tingResults = MTing.canTing(self.tilePatternChecker,
                                            self.tableTileMgr,
                                            MTile.cloneTiles(tiles), leftTiles,
                                            self.winRuleMgr, tile, magicTiles,
                                            winSeatId)
        ftlog.debug('MTingMudanjiangRule.MTing.canTing isTing:', isTing,
                    ' tingResults:', tingResults)
        #         [{'dropTile': 11, 'winNodes': [{'winTile': 1, 'winTileCount': 3, 'pattern': [[6, 6], [5, 6, 7], [4, 5, 6], [1, 2, 3]]}, {'winTile': 2, 'winTileCount': 2, 'pattern': [[6, 6, 6], [5, 6, 7], [3, 4, 5], [2, 2]]}, {'winTile': 4, 'winTileCount': 3, 'pattern': [[6, 6], [5, 6, 7], [4, 5, 6], [2, 3, 4]]}, {'winTile': 5, 'winTileCount': 2, 'pattern': [[6, 6, 6], [5, 6, 7], [5, 5], [2, 3, 4]]}, {'winTile': 7, 'winTileCount': 1, 'pattern': [[6, 6], [5, 6, 7], [5, 6, 7], [2, 3, 4]]}, {'winTile': 8, 'winTileCount': 1, 'pattern': [[6, 7, 8], [6, 6, 6], [5, 5], [2, 3, 4]]}]}]

        if not isTing:
            return False, []

        chiCount = len(tiles[MHand.TYPE_CHI])
        pengCount = len(tiles[MHand.TYPE_PENG])
        gangCount = len(tiles[MHand.TYPE_GANG])

        mingGangCount = 0
        anGangCount = 0
        #计算明杠个数,因为暗杠不算开门
        if gangCount != 0:
            mingGangCount, anGangCount = MTile.calcGangCount(
                tiles[MHand.TYPE_GANG])
        ftlog.debug('MTingMudanjiangRule.gang tiles:', tiles[MHand.TYPE_GANG],
                    ' mingGangCount=', mingGangCount, ' anGangCount=',
                    anGangCount)

        #daKouConfig = self.getTableConfig(MTDefine.DA_KOU, 0)
        daKouConfig = 1
        ftlog.debug('.canTing daKouConfig:', daKouConfig)
        if daKouConfig != 1:
            if (chiCount + pengCount + mingGangCount) == 0:
                return False, []

        # 检查刻,刻的来源,碰牌/明杠牌/手牌
        keCount = pengCount + mingGangCount + anGangCount
        # 必须有顺牌
        shunCount = chiCount

        newTingResults = []
        for tingResult in tingResults:
            newWinNodes = []
            winNodes = tingResult['winNodes']
            for winNode in winNodes:
                newTiles = MTile.cloneTiles(tiles)
                newTiles[MHand.TYPE_HAND].remove(tingResult['dropTile'])
                newTiles[MHand.TYPE_HAND].append(winNode['winTile'])
                tileArr = MTile.changeTilesToValueArr(
                    MHand.copyAllTilesToList(newTiles))
                #       ftlog.debug( 'MTingMudanjiangRule.canTing tileArr:', tileArr )

                # 清一色不可以听牌/和牌
                if self.getTableConfig(MTDefine.YISE_CAN_TING, 0) != 1:
                    newTileArr = copy.deepcopy(tileArr)
                    newTileArr[MTile.TILE_HONG_ZHONG] = 0
                    colorCount = MTile.getColorCount(newTileArr)
                    if colorCount == 1:
                        # 清一色不能和牌
                        ftlog.debug('MTingMudanjiangRule.canTing colorCount:',
                                    colorCount, ' can not win, continue....')
                        continue

                # 检查牌中的幺/九
                # 1软 听牌可以没有19,只要胡牌带19就可以
                # 2硬 听牌时就要有19
                RuanYaoJiuConfig = self.getTableConfig(MTDefine.RUAN_YAO_JIU,
                                                       1)
                if RuanYaoJiuConfig == 0:
                    #硬幺九 :听牌必须有19
                    #tileArr 减去 winNode['winTile'] 后判断
                    tileArr[winNode['winTile']] -= 1
                    yaoCount = tileArr[MTile.TILE_ONE_WAN] + tileArr[
                        MTile.TILE_ONE_TONG] + tileArr[MTile.TILE_ONE_TIAO]
                    jiuCount = tileArr[MTile.TILE_NINE_WAN] + tileArr[
                        MTile.TILE_NINE_TONG] + tileArr[MTile.TILE_NINE_TIAO]
                    zhongCount = tileArr[MTile.TILE_HONG_ZHONG]
                    ftlog.debug('MTingMudanjiangRule.canTing : YING yaoCount:',
                                yaoCount, 'jiuCount', jiuCount, 'zhongCount',
                                zhongCount)
                    if (yaoCount + jiuCount + zhongCount) <= 0:
                        continue
                else:
                    #软幺九 :只要胡牌有19就行
                    yaoCount = tileArr[MTile.TILE_ONE_WAN] + tileArr[
                        MTile.TILE_ONE_TONG] + tileArr[MTile.TILE_ONE_TIAO]
                    jiuCount = tileArr[MTile.TILE_NINE_WAN] + tileArr[
                        MTile.TILE_NINE_TONG] + tileArr[MTile.TILE_NINE_TIAO]
                    zhongCount = tileArr[MTile.TILE_HONG_ZHONG]
                    ftlog.debug('MTingMudanjiangRule.canTing : RUAN yaoCount:',
                                yaoCount, 'jiuCount', jiuCount, 'zhongCount',
                                zhongCount)
                    if (yaoCount + jiuCount + zhongCount) == 0:
                        continue

                patterns = winNode['pattern']
                winTile = winNode['winTile']

                #夹起步(顺牌只能和夹和3,7) 除单吊
                chunJiaConfig = self.getTableConfig(MTDefine.MIN_MULTI, 0)
                if chunJiaConfig:
                    hasJia = False

                    bianMulti = self.tableConfig.get(MTDefine.BIAN_MULTI, 0)
                    if bianMulti:
                        if MTile.getValue(
                                winTile
                        ) == 3 and winTile < MTile.TILE_DONG_FENG:
                            newTilesBian = copy.deepcopy(newTiles)
                            # 1,2,3
                            if ((winTile - 2)
                                    in newTilesBian[MHand.TYPE_HAND]) and (
                                        (winTile - 1)
                                        in newTilesBian[MHand.TYPE_HAND]):
                                newTilesBian[MHand.TYPE_HAND].remove(winTile -
                                                                     2)
                                newTilesBian[MHand.TYPE_HAND].remove(winTile -
                                                                     1)
                                newTilesBian[MHand.TYPE_HAND].remove(winTile)
                                newTilesBian[MHand.TYPE_CHI].append(
                                    [winTile - 2, winTile - 1, winTile])
                                rBian, rPattern = self.winRuleMgr.isHu(
                                    newTilesBian, winTile, True,
                                    MWinRule.WIN_BY_MYSELF, magicTiles)
                                if rBian:
                                    ftlog.debug(
                                        'MTingMudanjiangRule isJia 3 Bian : ',
                                        newTilesBian, ' patterns:', rPattern)
                                    hasJia = True

                        if not hasJia and MTile.getValue(
                                winTile
                        ) == 7 and winTile < MTile.TILE_DONG_FENG:
                            newTiles37 = copy.deepcopy(newTiles)
                            # 7,8,9
                            if ((winTile + 1)
                                    in newTiles37[MHand.TYPE_HAND]) and (
                                        (winTile + 2)
                                        in newTiles37[MHand.TYPE_HAND]):
                                newTiles37[MHand.TYPE_HAND].remove(winTile + 1)
                                newTiles37[MHand.TYPE_HAND].remove(winTile + 2)
                                newTiles37[MHand.TYPE_HAND].remove(winTile)
                                newTiles37[MHand.TYPE_CHI].append(
                                    [winTile, winTile + 1, winTile + 2])
                                rQi, qiPattern = self.winRuleMgr.isHu(
                                    newTiles37, winTile, True,
                                    MWinRule.WIN_BY_MYSELF, magicTiles)
                                if rQi:
                                    ftlog.debug(
                                        'MTingMudanjiangRule isJia 7 Bian : ',
                                        newTiles37, ' pattern:', qiPattern)
                                    hasJia = True

                    danDiaoJia = self.tableConfig.get(MTDefine.DAN_DIAO_JIA, 1)
                    if not hasJia and danDiaoJia:
                        newTilesDan = copy.deepcopy(newTiles)
                        ftlog.debug(
                            'MTingMudanjiangRule isJia in >> danDiao : ',
                            newTilesDan)
                        # 5,5
                        if winTile in newTilesDan[MHand.TYPE_HAND]:
                            rDan, danPattern = MWin.isHuWishSpecialJiang(
                                newTilesDan[MHand.TYPE_HAND],
                                [winTile, winTile], magicTiles)
                            if rDan:
                                ftlog.debug(
                                    'MTingMudanjiangRule isJia danDiao : ',
                                    newTilesDan, ' winTile:', winTile,
                                    ' pattern:', danPattern)
                                hasJia = True

                    if not hasJia:
                        newTilesJia = copy.deepcopy(newTiles)
                        # 2,3,4
                        if ((winTile - 1)
                                in newTilesJia[MHand.TYPE_HAND]) and (
                                    (winTile + 1)
                                    in newTilesJia[MHand.TYPE_HAND]):
                            newTilesJia[MHand.TYPE_HAND].remove(winTile + 1)
                            newTilesJia[MHand.TYPE_HAND].remove(winTile - 1)
                            newTilesJia[MHand.TYPE_HAND].remove(winTile)
                            newTilesJia[MHand.TYPE_CHI].append(
                                [winTile - 1, winTile, winTile + 1])
                            rJia, jiaPattern = self.winRuleMgr.isHu(
                                newTilesJia, winTile, True,
                                MWinRule.WIN_BY_MYSELF, magicTiles)
                            if rJia:
                                ftlog.debug('MTingMudanjiangRule isJia : ',
                                            newTilesJia, ' pattern:',
                                            jiaPattern)
                                hasJia = True

                    # winNodes中的patterns只是胡牌的一种方式,不是全部的胡牌解,判断夹牌,只使用patterns的组合会有遗漏的情况
                    # 合理的做法是先把夹拿出来,在判断剩下的牌是否能胡。
                    if not hasJia:
                        ftlog.debug(
                            'MTingMudanjiangRule.canTing :, can not win tile:',
                            winNode['winTile'], ', not has jia continue....')
                        continue

                patterns = winNode['pattern']
                checkKeCount = keCount + self.getKeCount(patterns)
                checkShunCount = shunCount + self.getShunCount(patterns)
                ftlog.debug('MTingMudanjiangRule.canTing checkKeCount:',
                            checkKeCount, ' checkShunCount:', checkShunCount)

                if checkKeCount and checkShunCount:
                    newWinNodes.append(winNode)

            if len(newWinNodes) > 0:
                newTingResult = {}
                newTingResult['dropTile'] = tingResult['dropTile']
                newTingResult['winNodes'] = newWinNodes
                newTingResults.append(newTingResult)

        return len(newTingResults) > 0, newTingResults