Files
mjAi/src/engine/calculate_fan.py
2024-11-30 19:15:24 +08:00

99 lines
4.4 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 = {
"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, melds):
"""
检查手牌和明牌是否是清一色。
参数:
- hand: 当前胡牌的手牌长度为108的列表表示每张牌的数量
- melds: 碰杠等明牌列表。
返回:
- bool: 是否为清一色。
"""
# 获取所有牌的花色
all_tiles = hand + [tile for meld in melds for tile in meld]
suits = [tile // 36 for tile in all_tiles if tile > 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