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 = { "is_pure_cleared": lambda: 3 if is_cleared and len(melds) == 3 and not conditions.get("is_double_pure_cleared", False) else 0, "is_double_pure_cleared": lambda: 4 if is_cleared and len(melds) >= 2 and conditions.get( "is_double_pure_cleared", False) else 0, "is_cleared": lambda: 2 if is_cleared and not (conditions.get("is_pure_cleared", False) or conditions.get("is_double_pure_cleared", False) or conditions.get("is_clear_seven_pairs", False)) else 0, "is_seven_pairs": lambda: 2 if conditions.get("is_seven_pairs", False) and not conditions.get( "is_dragon_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_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, "basic_win": lambda: 1 if not (conditions.get("is_seven_pairs", False) or conditions.get("is_big_pairs", False) or conditions.get("is_dragon_seven_pairs", False) or conditions.get("is_pure_cleared", False) or conditions.get("is_double_pure_cleared", False) or conditions.get("is_small_pairs", False) or conditions.get("is_clear_seven_pairs", False) or conditions.get("is_full_request", False) or conditions.get("is_rob_gang", False) or conditions.get("is_under_the_sea", False) or conditions.get("is_tian_hu", False) or conditions.get("is_di_hu", False)) else 0, } print("\nCalculating fan...") # 逐一应用规则 for rule, func in rules.items(): result = func() fan += result print(f"Rule: {rule}, Fan: {result}") # 调试输出 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) counts = [count for count in hand if count > 0] result = counts.count(2) == 1 and counts.count(3) >= 3 print(f"Big pairs check: {result}, Counter: {Counter(counts)}") return result