def calculate_fan(hand, melds, is_self_draw, is_cleared, conditions): """ 根据规则动态计算番数。 参数: - hand: 当前胡牌的手牌(长度为108的列表,表示每张牌的数量)。 - melds: 碰杠等明牌列表。 - is_self_draw: 是否自摸。 - is_cleared: 是否清一色。 - conditions: 其他胡牌条件的字典,例如 {'is_seven_pairs': True, 'add_self_draw': True}。 返回: - fan: 总番数。 """ fan = 0 # 初始番数 # 定义番种规则 rules = { "basic_win": lambda: 1 if not (conditions.get("is_seven_pairs", False) or conditions.get("is_big_pairs", False)) else 0, # 平胡(七对或大对子不加基本胡) "is_cleared": lambda: 2 if is_cleared else 0, # 清一色 "is_pure_cleared": lambda: 3 if is_cleared and len(melds) >= 1 else 0, # 清对 "is_double_pure_cleared": lambda: 4 if is_cleared and len(melds) >= 2 else 0, # 极中极 "is_seven_pairs": lambda: 2 if conditions.get("is_seven_pairs", False) else 0, # 七对 "is_dragon_seven_pairs": lambda: 12 if conditions.get("is_dragon_seven_pairs", False) else 0, # 龙七对 "is_clear_seven_pairs": lambda: 12 if conditions.get("is_clear_seven_pairs", False) else 0, # 清七对 "is_big_pairs": lambda: 2 if conditions.get("is_big_pairs", False) else 0, # 大对子 "is_small_pairs": lambda: 2 if conditions.get("is_small_pairs", False) else 0, # 小七对 "is_full_request": lambda: 6 if conditions.get("is_full_request", False) else 0, # 全求人 "is_gang_flower": lambda: 1 if conditions.get("is_gang_flower", False) else 0, # 杠上开花 "is_rob_gang": lambda: 1 if conditions.get("is_rob_gang", False) else 0, # 抢杠胡 "is_under_the_sea": lambda: 1 if conditions.get("is_under_the_sea", False) else 0, # 海底捞月 "is_cannon": lambda: 1 if conditions.get("is_cannon", False) else 0, # 放炮 "is_tian_hu": lambda: 12 if conditions.get("is_tian_hu", False) else 0, # 天胡 "is_di_hu": lambda: 12 if conditions.get("is_di_hu", False) else 0, # 地胡 "is_self_draw": lambda: 1 if is_self_draw and conditions.get("add_self_draw", True) else 0, # 自摸 } # 逐一应用规则 for rule, func in rules.items(): fan += func() return fan def is_seven_pairs(hand): """ 检查手牌是否是七对。 """ return sum(1 for count in hand if count == 2) == 7 def is_cleared(hand): """ 检查手牌是否是清一色。 """ suits = [tile // 36 for tile, count in enumerate(hand) if count > 0] return len(set(suits)) == 1 def is_big_pairs(hand): """ 检查手牌是否是大对子(由刻子和一对组成)。 """ from collections import Counter counter = Counter(hand) result = all(count == 3 or count == 2 for count in counter.values()) print(f"Big pairs check: {result}, Counter: {counter}") return result