From 749caaf980ad765764cddedf5deb15b2e7b378a6 Mon Sep 17 00:00:00 2001 From: wsy182 <2392948297@qq.com> Date: Sat, 30 Nov 2024 14:59:45 +0800 Subject: [PATCH] Create calculate_fan.py --- src/engine/calculate_fan.py | 67 +++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 src/engine/calculate_fan.py diff --git a/src/engine/calculate_fan.py b/src/engine/calculate_fan.py new file mode 100644 index 0000000..65ed9fc --- /dev/null +++ b/src/engine/calculate_fan.py @@ -0,0 +1,67 @@ +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, # 平胡 + "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) + return all(count == 3 or count == 2 for count in counter.values())