Example #1
0
    def isHu(self,
             tiles,
             tile,
             isTing,
             getTileType,
             magicTiles=[],
             tingNodes=[],
             winSeatId=0):
        ftlog.debug(self.TAG, '.isHu tiles:', tiles, ' tile:', tile,
                    ' isTing:', isTing, ' getTileType:', getTileType,
                    ' magicTiles:', magicTiles, ' tingNodes:', tingNodes,
                    ' winSeatId:', winSeatId)
        # 平度麻将即可以听也可以不听,听牌后,校验tingNodes即可,无其他限制条件
        if isTing:
            #[{'winTile': 16, 'winTileCount': 0, 'pattern': [[16, 17, 18], [12, 12]]}, {'winTile': 19, 'winTileCount': 0, 'pattern': [[17, 18, 19], [12, 12]]}]
            for tingNode in tingNodes:
                if tingNode['winTile'] == tile:
                    pattern = tingNode['pattern']
                    return True, pattern

        # 检查8张的规则
        allTiles = MHand.copyAllTilesToListButHu(tiles)
        tilesArr = MTile.changeTilesToValueArr(allTiles)
        wanCount = MTile.getTileCountByColor(tilesArr, MTile.TILE_WAN)
        tiaoCount = MTile.getTileCountByColor(tilesArr, MTile.TILE_TIAO)
        tongCount = MTile.getTileCountByColor(tilesArr, MTile.TILE_TONG)
        fengCount = MTile.getTileCountByColor(tilesArr, MTile.TILE_FENG)
        ftlog.debug('win_rule_pingdu.isHu allTiles:', allTiles,
                    ' tilesLength:', len(allTiles), ' tilesArr:', tilesArr,
                    ' wanCount:', wanCount, ' tiaoCount:', tiaoCount,
                    ' tongCount:', tongCount, ' fengCount:', fengCount)

        if (wanCount >= 8) or (tiaoCount >= 8) or (tongCount >=
                                                   8) or (fengCount >= 8):
            pass
        else:
            #             ftlog.info('win_rule_pingdu.isHu ok but do not have >=8 tiles in one color, allTiles:', allTiles
            #                     , ' tilesLength:', len(allTiles)
            #                     , ' tilesArr:', tilesArr
            #                     , ' wanCount:', wanCount
            #                     , ' tiaoCount:', tiaoCount
            #                     , ' tongCount:', tongCount
            #                     , ' fengCount:', fengCount)
            return False, []

        # 平度麻将允许胡七对
        resultQiDui, patternQiDui = MWin.isQiDui(tiles[MHand.TYPE_HAND])
        if resultQiDui:
            return True, patternQiDui

        result, pattern = MWin.isHu(tiles[MHand.TYPE_HAND])
        return result, pattern
Example #2
0
    def isHu(self,
             tiles,
             tile,
             isTing,
             getTileType,
             magicTiles=[],
             tingNodes=[],
             winSeatId=0):
        # 检查是否过胡状态 自摸情况下不判断过胡
        if getTileType != MWinRule.WIN_BY_MYSELF and self.tableTileMgr.isPassHuTileBySeatId(
                winSeatId, tile):
            ftlog.debug('MWinRuleXueZhan.isHu passHu...')
            return False, []
        tileArr = MTile.changeTilesToValueArr(MHand.copyAllTilesToList(tiles))
        # 获取当前座位号定缺的花色
        colorAbsence = self.tableTileMgr.absenceColors[winSeatId]
        # 获取手牌中定缺花色牌的数量,大于0,不用判断胡
        colorAbsenceNum = MTile.getTileCountByColor(tileArr, colorAbsence)
        # ftlog.debug('MWinRuleXueZhan colorAbsenceNum:', colorAbsenceNum, 'tiles:', tiles, 'tile:', tile, 'colorAbsence:', colorAbsence)
        if colorAbsenceNum > 0:
            return False, []

        resultQidui, qiduiPattern = MWin.isQiDui(tiles[MHand.TYPE_HAND], [])
        if resultQidui:
            return True, qiduiPattern

        result, rePattern = MWin.isHu(tiles[MHand.TYPE_HAND])
        if result:
            return True, rePattern
        return False, []
Example #3
0
 def canTing(self, tiles, leftTiles, tile, magicTiles=[], winSeatId=0):
     """子类必须实现
     参数:
     1)tiles 该玩家的手牌
     返回值:
     是否可以听牌,听牌详情
     """
     # 血流 血战听牌 需要没有缺牌
     tileArr = MTile.changeTilesToValueArr(MHand.copyAllTilesToList(tiles))
     # 获取当前座位号定缺的花色
     colorAbsence = self.tableTileMgr.absenceColors[winSeatId]
     # 获取手牌中定缺花色牌的数量,大于1,不用判断听 缺牌为1张的时候,打出去缺牌,有可能会听牌
     colorAbsenceNum = MTile.getTileCountByColor(tileArr, colorAbsence)
     # ftlog.debug('MTingRuleSiChuan.canTing colorAbsenceNum:', colorAbsenceNum, 'tiles:', tiles, 'tile:', tile, 'colorAbsence:', colorAbsence)
     if colorAbsenceNum > 1:
         return False, []
     resultFlag, result = MTing.canTing(self.tilePatternChecker, self.tableTileMgr, tiles, leftTiles, self.winRuleMgr, tile, magicTiles, winSeatId)
     # 如果听牌中有定的缺色,需要把其余的听口去掉
     ftlog.debug('MTingRuleSiChuan.canTing result:', result)
     if resultFlag and colorAbsenceNum == 1:
         filterResult = []
         for tingNodes in result:
             if MTile.getColor(tingNodes['dropTile']) == colorAbsence:
                 filterResult.append(tingNodes)
         ftlog.debug('MTingRuleSiChuan.canTing filterResult:', filterResult)
         return len(filterResult) > 0, filterResult   
     else:
         return resultFlag, result 
Example #4
0
    def isHu(self, tiles, tile, isTing, getTileType, magicTiles = [], tingNodes = [], curSeatId = 0, winSeatId = 0, actionID = 0, isGangKai = False,isForHu = True):

	if self.tableTileMgr.playMode == "luosihu-luosihu" and isForHu:
	    if not isTing:
	        if not self.tableTileMgr.players[winSeatId].isWon():
		    return False,[],0

        allTiles = MHand.copyAllTilesToListButHu(tiles)
        tilesArr = MTile.changeTilesToValueArr(allTiles)	
        # 需要缺一门: 定缺的时候约定的那门
        if self.absenceColor:
            if MTile.getTileCountByColor(tilesArr, self.absenceColor[winSeatId]) > 0:
                return False, [],0
        result, pattern = self.isQidui(tiles)
        if result:
            if self.tableTileMgr.playMode == "luosihu-luosihu":
                self.fanXing[self.QIDUI]["index"] = 1 
            return True, pattern,self.fanXing[self.QIDUI]["index"]

        result, pattern = MWin.isHu(tiles[MHand.TYPE_HAND], magicTiles)

        if result:
            ftlog.debug('MWinRuleLuosihu.isHu result=',result,' getTileType=',getTileType,' pattern=',pattern)
            player = self.tableTileMgr.players[winSeatId]
            self.winSeatId = winSeatId
            self.__tile_pattern_checker = MTilePatternCheckerFactory.getTilePatternChecker(MPlayMode.LUOSIHU)
            playersAllTiles = [[] for _ in range(self.tableTileMgr.playCount)]
            self.__win_patterns = [[] for _ in range(self.tableTileMgr.playCount)]
            self.__win_patterns[winSeatId] = [pattern]
            for seatId in range(self.tableTileMgr.playCount):
                if seatId == winSeatId:
                    playersAllTiles[seatId] = copy.deepcopy(tiles)
                else:
                    playersAllTiles[seatId] = self.tableTileMgr.players[seatId].copyTiles()
            self.setAllPlayerTiles(playersAllTiles)
            # 判断和牌的时候
            self.__tile_pattern_checker.initChecker(playersAllTiles, tile, self.tableTileMgr, True, curSeatId, winSeatId, actionID)
            winnerResult = []
            if self.tableTileMgr.playMode == "luosihu-ctxuezhan":
                winnerResult = self.getWinnerResultsForXueZhanDaoDi(winSeatId)
            elif self.tableTileMgr.playMode == "luosihu-xuezhan":
                winnerResult = self.getWinnerResultsForLuoSiHuXueZhan(winSeatId)
            elif self.tableTileMgr.playMode == "luosihu-luosihu":
                winnerResult = self.getWinnerResultsForLuoSiHu(winSeatId)
            finalResult = []
            finalResult.extend(winnerResult)
            maxFan = self.tableConfig.get(MTDefine.MAX_FAN, 0)
            winScore,indexFan = self.getScoreByResults(finalResult, maxFan)
            ftlog.debug('MWinRuleLuosihu.isHu player.guoHuPoint :',winScore,' finalResult=',finalResult,' indexFan')
            # 过胡判断
            if getTileType == MWinRule.WIN_BY_MYSELF:
                return True,pattern,indexFan
            if player.guoHuPoint >= winScore and self.tableTileMgr.playMode == "luosihu-ctxuezhan":
                return False, [],0
            player.totalWinPoint = winScore
            return True,pattern,indexFan

	return False, [],0
Example #5
0
    def isHu(self, tiles, tile, isTing, getTileType, magicTiles = [], tingNodes = [], winSeatId = 0):
        ftlog.debug(self.TAG, '.isHu tiles:', tiles
                    , ' tile:', tile
                    , ' isTing:', isTing
                    , ' getTileType:', getTileType
                    , ' magicTiles:', magicTiles
                    , ' tingNodes:', tingNodes
                    , ' winSeatId:', winSeatId
                    )
        # 平度麻将即可以听也可以不听,听牌后,校验tingNodes即可,无其他限制条件
        if isTing:
            #[{'winTile': 16, 'winTileCount': 0, 'pattern': [[16, 17, 18], [12, 12]]}, {'winTile': 19, 'winTileCount': 0, 'pattern': [[17, 18, 19], [12, 12]]}] 
            for tingNode in tingNodes:
                if tingNode['winTile'] == tile:
                    pattern = tingNode['pattern']
                    return True, pattern

                # 三色全
        allTiles = MHand.copyAllTilesToList(tiles)
        tilesArr = MTile.changeTilesToValueArr(allTiles)
        wanCount = MTile.getTileCountByColor(tilesArr, MTile.TILE_WAN)
        tongCount = MTile.getTileCountByColor(tilesArr, MTile.TILE_TONG)
        tiaoCount = MTile.getTileCountByColor(tilesArr, MTile.TILE_TIAO)
        if wanCount==0 or tongCount==0 or tiaoCount==0:
            return False, []

        #有幺九
        if not self.SatisyYaoJiu(tiles):
            return False,[]
        
        if not self.SatisyKe(tiles):
            return False,[]
        
        result, pattern = MWin.isHu(tiles[MHand.TYPE_HAND])
        ftlog.debug('MWinRulePanjin.isHu tiles:', result, ' pattern:', pattern)

        return result, pattern
Example #6
0
    def isHu(self,
             tiles,
             tile,
             isTing,
             getTileType,
             magicTiles=[],
             tingNodes=[],
             curSeatId=0,
             winSeatId=0,
             actionID=0,
             isGangKai=False,
             isForHu=True):

        if self.tableTileMgr.playMode == "luosihu-luosihu" and isForHu:
            if not isTing:
                if not self.tableTileMgr.players[winSeatId].isWon():
                    return False, [], 0

        allTiles = MHand.copyAllTilesToListButHu(tiles)
        tilesArr = MTile.changeTilesToValueArr(allTiles)
        # 需要缺一门: 定缺的时候约定的那门
        if self.absenceColor:
            if MTile.getTileCountByColor(tilesArr,
                                         self.absenceColor[winSeatId]) > 0:
                return False, [], 0
        result, pattern = self.isQidui(tiles)
        if result:
            if self.tableTileMgr.playMode == "luosihu-luosihu":
                self.fanXing[self.QIDUI]["index"] = 1
            return True, pattern, self.fanXing[self.QIDUI]["index"]

        result, pattern = MWin.isHu(tiles[MHand.TYPE_HAND], magicTiles)

        if result:
            ftlog.debug('MWinRuleLuosihu.isHu result=', result,
                        ' getTileType=', getTileType, ' pattern=', pattern)
            player = self.tableTileMgr.players[winSeatId]
            self.winSeatId = winSeatId
            self.__tile_pattern_checker = MTilePatternCheckerFactory.getTilePatternChecker(
                MPlayMode.LUOSIHU)
            playersAllTiles = [[] for _ in range(self.tableTileMgr.playCount)]
            self.__win_patterns = [[]
                                   for _ in range(self.tableTileMgr.playCount)]
            self.__win_patterns[winSeatId] = [pattern]
            for seatId in range(self.tableTileMgr.playCount):
                if seatId == winSeatId:
                    playersAllTiles[seatId] = copy.deepcopy(tiles)
                else:
                    playersAllTiles[seatId] = self.tableTileMgr.players[
                        seatId].copyTiles()
            self.setAllPlayerTiles(playersAllTiles)
            # 判断和牌的时候
            self.__tile_pattern_checker.initChecker(playersAllTiles, tile,
                                                    self.tableTileMgr, True,
                                                    curSeatId, winSeatId,
                                                    actionID)
            winnerResult = []
            if self.tableTileMgr.playMode == "luosihu-ctxuezhan":
                winnerResult = self.getWinnerResultsForXueZhanDaoDi(winSeatId)
            elif self.tableTileMgr.playMode == "luosihu-xuezhan":
                winnerResult = self.getWinnerResultsForLuoSiHuXueZhan(
                    winSeatId)
            elif self.tableTileMgr.playMode == "luosihu-luosihu":
                winnerResult = self.getWinnerResultsForLuoSiHu(winSeatId)
            finalResult = []
            finalResult.extend(winnerResult)
            maxFan = self.tableConfig.get(MTDefine.MAX_FAN, 0)
            winScore, indexFan = self.getScoreByResults(finalResult, maxFan)
            ftlog.debug('MWinRuleLuosihu.isHu player.guoHuPoint :', winScore,
                        ' finalResult=', finalResult, ' indexFan')
            # 过胡判断
            if getTileType == MWinRule.WIN_BY_MYSELF:
                return True, pattern, indexFan
            if player.guoHuPoint >= winScore and self.tableTileMgr.playMode == "luosihu-ctxuezhan":
                return False, [], 0
            player.totalWinPoint = winScore
            return True, pattern, indexFan

        return False, [], 0
Example #7
0
    def isHu(self,
             tiles,
             tile,
             isTing,
             getTileType,
             magicTiles=[],
             tingNodes=[],
             winSeatId=0):

        #tile已经加入到tiles
        ftlog.debug('MWinRulePanjin.isHu tiles:', tiles, ' magicTiles:',
                    magicTiles, ' tile:', tile)

        if self.tableTileMgr.isPassHuTileBySeatId(winSeatId, tile):
            return False, []

        #是否允许闭门胡
        if not self.tableConfig.get(MTDefine.BI_MEN_FAN, 0):
            if len(tiles[MHand.TYPE_HAND]) == 14:
                return False, []

        # 三色全
        allTiles = MHand.copyAllTilesToList(tiles)
        #避免摸宝时候检查三色全问题,所以剔除最后一张
        allTiles.remove(tile)
        #会牌剔除
        if self.tableConfig.get(MTDefine.HUI_PAI, 0):
            magics = self.tableTileMgr.getMagicTiles(True)
            while magics[0] in allTiles:
                allTiles.remove(magics[0])

        tilesArr = MTile.changeTilesToValueArr(allTiles)
        wanCount = MTile.getTileCountByColor(tilesArr, MTile.TILE_WAN)
        tongCount = MTile.getTileCountByColor(tilesArr, MTile.TILE_TONG)
        tiaoCount = MTile.getTileCountByColor(tilesArr, MTile.TILE_TIAO)
        if wanCount == 0 or tongCount == 0 or tiaoCount == 0:
            return False, []

        #有幺九
        if not self.SatisyYaoJiu(tiles):
            return False, []

        result, pattern = MWin.isHu(tiles[MHand.TYPE_HAND], magicTiles, True)
        ftlog.debug('MWinRulePanjin.isHu tiles:', result, ' pattern:', pattern)
        if not result:
            return False, []
        else:
            keAlreadyhas = self.SatisyKe2(tiles)
            if keAlreadyhas:
                return True, pattern
            else:
                #检查胡牌番型pattern,要有刻
                for p in pattern:
                    if len(p) == 3 and (p[0] == p[2] or p[1] == p[2]
                                        or p[0] == p[1]):
                        return True, pattern
                    elif len(p) == 2:
                        if (p[0] in range(MTile.TILE_DONG_FENG,MTile.TILE_BAI_BAN+1)) \
                            or (p[1] in range(MTile.TILE_DONG_FENG,MTile.TILE_BAI_BAN+1)):
                            return True, pattern
                        if self.tableConfig.get(MTDefine.HUI_PAI, 0):
                            if (p[0] == p[1] == magicTiles[0]):
                                return True, pattern

        return False, []
Example #8
0
    def isHu(self, tiles, tile, isTing, getTileType, magicTiles = [], tingNodes = [], winSeatId = 0):
          
        '''
        三色全,玩家手中必须同时具有万饼条三种花色的牌
        有幺九(喜杠、幺九杠、中发白作将或刻时可免幺九)
        有刻(任意杠、中发白作将或刻时可免刻)
        '''
        
        ftlog.debug('MWinRuleBaicheng.isHu TIAN_HU:', self.tableConfig.get(MTDefine.TIAN_HU, 0), ' len(self.tableTileMgr.addTiles[winSeatId]):', len(self.tableTileMgr.addTiles[winSeatId]), ' winSeatId:', winSeatId)
        if getTileType == MWinRule.WIN_BY_MYSELF:
            if 0==self.tableConfig.get(MTDefine.TIAN_HU, 0):
                if len(self.tableTileMgr.addTiles[winSeatId]) == 1:
                    return False, []

        #tile已经加入到tiles
        ftlog.debug('MWinRuleBaicheng.isHu tiles:', tiles
            , ' magicTiles:', magicTiles
            , ' tile:', tile)

        # 三色全
        allTiles = MHand.copyAllTilesToList(tiles)
        #避免摸宝时候检查三色全问题,所以剔除最后一张
        allTiles.remove(tile)
        tilesArr = MTile.changeTilesToValueArr(allTiles)
        wanCount = MTile.getTileCountByColor(tilesArr, MTile.TILE_WAN)
        tongCount = MTile.getTileCountByColor(tilesArr, MTile.TILE_TONG)
        tiaoCount = MTile.getTileCountByColor(tilesArr, MTile.TILE_TIAO)
        if wanCount==0 or tongCount==0 or tiaoCount==0:
            return False, []


        #摸到宝牌
        if getTileType == MWinRule.WIN_BY_MYSELF:
            if (tile in magicTiles):
                canHuWithMagic = False
                for tileTry in range(MTile.TILE_MAX_VALUE):
                    handTile = copy.deepcopy(tiles[MHand.TYPE_HAND])
                    handTile.remove(tile)
                    handTile.append(tileTry)
                    ishu, pattern = MWin.isHu(handTile,[],True)
                    ftlog.debug('MWinRuleBaicheng.isHu handTile:', handTile,'tile',tile,'ishu',ishu,'pattern',pattern)
                    if ishu:
                        #摸宝的情况下,判断胡牌pattern里面是否有幺九,是否有刻
                        #把pattern胡牌加入到手牌,然后判断
                        allTilesMagicHu = copy.deepcopy(tiles)
                        allTilesMagicHu[MHand.TYPE_HAND] = []
                        for p in pattern:
                            allTilesMagicHu[MHand.TYPE_HAND].extend(p)

                        ftlog.debug('MWinRuleBaicheng.isHu allTilesMagicHu:', allTilesMagicHu)
                        #有幺九
                        if not self.SatisyYaoJiu(allTilesMagicHu):
                            continue
                        #有刻
                        if not self.SatisyKe(allTilesMagicHu):
                            continue
                        #可以胡,说明是摸宝胡牌
                        ftlog.debug('MWinRuleBaicheng.isHu canHuWithMagic:yes')
                        canHuWithMagic = True
                        return True,[]

                if not canHuWithMagic:
                    return False, []

        #有幺九
        if not self.SatisyYaoJiu(tiles):
            return False,[]
        
        result, pattern = MWin.isHu(tiles[MHand.TYPE_HAND],[],True)
        if not result:
            return False, []
        else:
            keAlreadyhas = self.SatisyKe2(tiles)
            if keAlreadyhas:
                return True, pattern
            else:
                #检查胡牌番型pattern,要有刻
                for p in pattern:
                    if len(p)==3 and p[0]==p[1]==p[2]:
                        return True,pattern
            
        return False,[]