mjAi/src/engine/calculate_fan.py

72 lines
3.0 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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