Files
mjAi/src/engine/calculate_fan.py
2024-11-30 14:59:45 +08:00

68 lines
2.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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())