def big_double(handlist, rogue): """ :大对 :param handlist: :param rogue: :return: """ temp = list() temp.extend(handlist) san = MahjongUtils.get_san(temp) for i in range(0, 3): for s in san: temp.remove(s) rogueSize = MahjongUtils.containSize(handlist, rogue) if 0 == rogueSize and 2 == len(temp) and temp[0] == temp[1]: return True if rogue not in san: for i in range(0, rogueSize): temp.remove(rogue) if rogue in temp: temp.remove(rogue) dui = MahjongUtils.get_dui(temp) if 1 == rogueSize and ((2 == len(dui) and 4 == len(temp)) or 1 == len(temp)): return True if 2 == rogueSize and ( (1 == len(dui) and 3 == len(temp)) or (3 == len(dui) and 6 == len(temp)) or 0 == len(temp)): return True if 3 == rogueSize and ((4 == len(dui) and 8 == len(temp)) or ( 2 == len(dui) and 5 == len(temp)) or 2 == len(temp)): return True if 4 == rogueSize and ((5 == len(dui) and 10 == len(temp)) or (3 == len(dui) and 7 == len(temp)) or ( 0 < len(dui) and 4 == len(temp)) or 1 == len(temp)): return True return False
def getCardType(handlist, penglist, gangdata, rogue, hucard): """ :获取牌型 :return: """ card_type = list() allcard = list() allcard.extend(handlist) allcard.extend(penglist) for gang in gangdata: allcard.append(gang.gangvalue) allcard = sorted(allcard) if MahjongCardType.gold_hook(handlist): card_type.append(11) elif MahjongCardType.big_double(handlist, rogue): card_type.append(7) if MahjongCardType.same_color(allcard, rogue): card_type.append(8) double7 = MahjongCardType.double7(handlist, rogue) if 0 <= double7: if 4 == MahjongUtils.containSize(handlist, hucard): card_type.append(10) else: card_type.append(9) return card_type
def same_color(allcards, rogue): """ :清一色 :param allcards: :return: """ temp = list() temp.extend(allcards) rogueSize = MahjongUtils.containSize(allcards, rogue) for i in range(0, rogueSize): temp.remove(rogue) return temp[0] / 10 == temp[len(temp) - 1] / 10
def double7(handlist, rogue): """ :七对 :param handlist: :param rogue: :return: """ temp = list() temp.extend(handlist) sorted(temp) rogueSize = MahjongUtils.containSize(handlist, rogue) for i in range(0, rogueSize): temp.remove(rogue) si = MahjongUtils.get_si(temp) if 14 == len(handlist) and 14 - (2 * (len(MahjongUtils.get_dui(temp)) + len(si))) <= 2 * rogueSize: siCount = 0 temp1 = list() temp1.extend(temp) for i in range(0, 4): for s in si: temp1.remove(s) siCount += len(si) san = MahjongUtils.get_san(temp1) for i in range(0, 3): for s in san: temp1.remove(s) siCount += len(san) rogueSize -= len(san) dui = MahjongUtils.get_dui(temp1) for i in range(0, 2): for d in dui: temp1.remove(d) rogueSize -= len(temp1) siCount += rogueSize / 2 return siCount return -1
def settle(self, request, context): """ :结算 :param request: :param context: :return: """ settle = SettleResult() user_settles = {} users = {} cannothu_user = [] for user in request.player: user_settle = settle.userSettleResule.add() user_settle.userId = user.player_id user_settles.setdefault(user.player_id, user_settle) users.setdefault(user.player_id, user) cannothu_user.append(user.player_id) if 1 == request.alloc_id: for user in request.player: for g in user.gang: if g.type == BGANG: user_settles[user.player_id].gangScore += len( g.fighter) for f in g.fighter: user_settles[f].gangScore -= 1 if g.type == MGANG: user_settles[user.player_id].gangScore += 3 * len( g.fighter) for f in g.fighter: user_settles[f].gangScore -= 3 if g.type == AGANG: user_settles[user.player_id].gangScore += 2 * len( g.fighter) for f in g.fighter: user_settles[f].gangScore -= 2 for hudata in request.hudata: if hudata.huUser in cannothu_user: cannothu_user.remove(hudata.huUser) tempcard = list() tempcard.extend(users[hudata.huUser].handlist) tempcard.append(hudata.majong) cardtype = wanzhou_mahjong.getCardType( tempcard, users[hudata.huUser].peng, users[hudata.huUser].gang, request.rogue) score = wanzhou_mahjong.getScore(cardtype) if score < 48 and request.rogue != 0 and 21 in CardUtils.get_si( tempcard): cardtype = 25 score = 48 for s in hudata.settle: if s != 0: if 1 == score: score = 12 else: score *= 2 if 0 in hudata.settle and score == 1: score += 1 if score > request.fengding: score = request.fengding user_settles[hudata.huUser].settlePatterns.append(cardtype) user_settles[hudata.huUser].settlePatterns.extend( hudata.settle) for u in hudata.loseUsers: if users[u].baojiao: if 2 == score or 1 == score: user_settles[u].cardScore -= 12 user_settles[hudata.huUser].cardScore += 12 else: user_settles[u].cardScore -= score * 2 user_settles[hudata.huUser].cardScore += score * 2 else: user_settles[u].cardScore -= score user_settles[hudata.huUser].cardScore += score if request.peijiao: peijiao_users = list() user_score = {} if 1 < len(cannothu_user): for c in cannothu_user: hucards = MahjongUtils.get_hu(users[c].handlist, request.rogue) # 有叫 if 0 < len(hucards): score = 0 for h in hucards: tempcard = list() tempcard.extend(users[c].handlist) tempcard.append(h) cardtype = wanzhou_mahjong.getCardType( tempcard, users[c].peng, users[c].gang, request.rogue) cardscore = wanzhou_mahjong.getScore(cardtype) if cardscore < 48 and request.rogue != 0 and 21 in CardUtils.get_si( tempcard): cardtype = 25 cardscore = 48 if 1 == cardscore: cardscore = 12 else: cardscore *= 2 if cardscore > score: score = cardscore if score > 0: user_score.setdefault(c, score) else: peijiao_users.append(c) if 0 < len(user_score) and 0 < len(peijiao_users): for key, value in user_score.items(): for p in peijiao_users: user_settles[p].cardScore -= value user_settles[key].cardScore += value if 2 == request.alloc_id: for user in request.player: for g in user.gang: if g.type == BGANG: user_settles[user.player_id].gangScore += len( g.fighter) for f in g.fighter: user_settles[f].gangScore -= 1 if g.type == MGANG: user_settles[user.player_id].gangScore += 2 * len( g.fighter) for f in g.fighter: user_settles[f].gangScore -= 2 if g.type == AGANG: user_settles[user.player_id].gangScore += 2 * len( g.fighter) for f in g.fighter: user_settles[f].gangScore -= 2 for hudata in request.hudata: if hudata.huUser in cannothu_user: cannothu_user.remove(hudata.huUser) tempcard = list() tempcard.extend(users[hudata.huUser].handlist) tempcard.append(hudata.majong) cardtype = wanzhou_mahjong.getCardType( tempcard, users[hudata.huUser].peng, users[hudata.huUser].gang, request.rogue) user_settles[hudata.huUser].settlePatterns.append(cardtype) score = wanzhou_mahjong.getScore(cardtype) for s in hudata.settle: if s != 0: if 1 == score: score = 12 else: score *= 2 if 0 in hudata.settle and score == 1: score += 1 if score > request.fengding: score = request.fengding for u in hudata.loseUsers: if users[u].baojiao: if 2 == score or 1 == score: user_settles[u].cardScore -= 12 user_settles[hudata.huUser].cardScore += 12 else: user_settles[u].cardScore -= score * 2 user_settles[hudata.huUser].cardScore += score * 2 else: user_settles[u].cardScore -= score user_settles[hudata.huUser].cardScore += score peijiao_users = list() user_score = {} if 4 == len(cannothu_user): for c in cannothu_user: hucards = MahjongUtils.get_hu(users[c].handlist, request.rogue) # 有叫 if 0 < len(hucards): score = 0 for h in hucards: tempcard = list() tempcard.extend(users[c].handlist) tempcard.append(h) cardtype = wanzhou_mahjong.getCardType( tempcard, users[c].peng, users[c].gang, request.rogue) cardscore = wanzhou_mahjong.getScore(cardtype) if cardscore > score: score = cardscore if score > request.fengding: score = request.fengding if score > 0: user_score.setdefault(c, score) else: peijiao_users.append(c) if 0 < len(user_score) and 0 < len(peijiao_users): for key, value in user_score.items(): for p in peijiao_users: user_settles[p].cardScore -= value user_settles[key].cardScore += value if 3 == request.alloc_id: for hudata in request.hudata: if hudata.huUser in cannothu_user: cannothu_user.remove(hudata.huUser) tempcard = list() tempcard.extend(users[hudata.huUser].handlist) tempcard.append(hudata.majong) ct = rongchang_mahjong.getCardType(tempcard, users[hudata.huUser].peng, users[hudata.huUser].gang, 0, hudata.majong) ct.extend(hudata.settle) if 3 in ct and 10 in ct: ct.remove(3) if 3 in ct and 7 in ct: ct.remove(3) ct.remove(7) ct.append(10) if 0 == len(ct): ct.append(0) user_settles[hudata.huUser].settlePatterns.extend(ct) score = rongchang_mahjong.getScore(ct) if 1 == score and 1 in ct: score += 1 for u in hudata.loseUsers: if users[u].baojiao: if 1 == score or 2 == score: user_settles[u].cardScore -= score + 5 user_settles[hudata.huUser].cardScore += score + 5 else: user_settles[u].cardScore -= score + 6 user_settles[hudata.huUser].cardScore += score + 6 else: user_settles[u].cardScore -= score user_settles[hudata.huUser].cardScore += score for user in request.player: if user.player_id == hudata.huUser: for g in user.gang: if g.type == BGANG: user_settles[user.player_id].gangScore += len( g.fighter) for f in g.fighter: user_settles[f].gangScore -= 1 if g.type == MGANG: user_settles[ user.player_id].gangScore += 2 * len( g.fighter) for f in g.fighter: user_settles[f].gangScore -= 2 if g.type == AGANG: user_settles[ user.player_id].gangScore += 3 * len( g.fighter) for f in g.fighter: user_settles[f].gangScore -= 3 break peijiao_users = list() user_score = {} if 1 < len(cannothu_user): for c in cannothu_user: hasCard = set() for u in request.player: if u.player_id != c: hasCard = hasCard.union(u.handlist) for g in u.gang: if g.type == AGANG: hasCard.add(g.gangvalue) hucards = set() huTemp = MahjongUtils.get_hu(users[c].handlist, request.rogue) for h in huTemp: if h in hasCard: hucards.add(h) # 有叫 if 0 < len(hucards): score = 0 for h in hucards: tempcard = list() tempcard.extend(users[c].handlist) tempcard.append(h) cardtype = rongchang_mahjong.getCardType( tempcard, users[c].peng, users[c].gang, request.rogue, h) if 0 == len(cardtype): cardtype.append(0) if 4 == MahjongUtils.containSize( tempcard, h) and 10 not in cardtype: cardtype.append(3) cardscore = rongchang_mahjong.getScore(cardtype) if cardscore > score: score = cardscore if score > 0: if users[c].baojiao: if 1 == score: score = 6 else: score += 6 user_score.setdefault(c, score) for user in request.player: if user.player_id == c: for g in user.gang: if g.type == BGANG: user_settles[ user.player_id].gangScore += len( g.fighter) for f in g.fighter: user_settles[f].gangScore -= 1 if g.type == MGANG: user_settles[ user. player_id].gangScore += 2 * len( g.fighter) for f in g.fighter: user_settles[f].gangScore -= 2 if g.type == AGANG: user_settles[ user. player_id].gangScore += 3 * len( g.fighter) for f in g.fighter: user_settles[f].gangScore -= 3 break else: peijiao_users.append(c) if 0 < len(user_score) and 0 < len(peijiao_users): for key, value in user_score.items(): for p in peijiao_users: if users[p].baojiao: user_settles[ p].cardScore -= 6 if value == 1 else value + 6 user_settles[ key].cardScore += 6 if value == 1 else value + 6 else: user_settles[p].cardScore -= value user_settles[key].cardScore += value else: for c in cannothu_user: for user in request.player: if user.player_id == c: for g in user.gang: if g.type == BGANG: user_settles[ user.player_id].gangScore += len( g.fighter) for f in g.fighter: user_settles[f].gangScore -= 1 if g.type == MGANG: user_settles[ user.player_id].gangScore += 2 * len( g.fighter) for f in g.fighter: user_settles[f].gangScore -= 2 if g.type == AGANG: user_settles[ user.player_id].gangScore += 3 * len( g.fighter) for f in g.fighter: user_settles[f].gangScore -= 3 break for sett in settle.userSettleResule: logging.info("userid") logging.info(sett.userId) logging.info("cardScore") logging.info(sett.cardScore) logging.info("gangScore") logging.info(sett.gangScore) logging.info("settlePatterns") logging.info(sett.settlePatterns) return settle