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
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, []
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
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
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
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
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, []
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,[]