89 lines
4.1 KiB
Python
89 lines
4.1 KiB
Python
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
|