Create calculate_fan.py

pull/1/head
wsy182 2024-11-30 14:59:45 +08:00
parent 6d3b5ae175
commit 749caaf980
1 changed files with 67 additions and 0 deletions

View File

@ -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())