Update calculate_fan.py

dev
wangsiyuan 2024-12-01 02:12:22 +08:00
parent 1562f784bf
commit 227800f0e8
1 changed files with 65 additions and 71 deletions

View File

@ -1,98 +1,92 @@
def calculate_fan(hand, melds, is_self_draw, is_cleared, conditions): def calculate_fan(hand, melds, is_self_draw, is_cleared, conditions):
""" """
根据规则动态计算番数 动态计算番数优先处理高番数
参数: 参数:
- hand: 当前胡牌的手牌长度为108的列表表示每张牌的数量 - hand: 当前胡牌的手牌Hand 对象
- melds: 碰杠等明牌列表 - melds: 玩家已明牌的列表Meld 对象列表
- is_self_draw: 是否自摸 - is_self_draw: 是否自摸
- is_cleared: 是否清一色 - is_cleared: 是否清一色
- conditions: 其他胡牌条件的字典例如 {'is_seven_pairs': True, 'add_self_draw': True} - conditions: 字典包含特殊胡牌条件 {"is_seven_pairs": True, "is_tian_hu": True}
返回: 返回:
- fan: 番数 - fan: 最大番数
""" """
fan = 0 # 初始番数 fan = 0 # 默认番数
# 定义番种规则 # 定义番数规则(按优先级从高到低排序)
rules = { rules = {
"is_pure_cleared": lambda: 3 if is_cleared and len(melds) == 3 and not conditions.get("is_double_pure_cleared", "tian_hu": lambda: 12 if conditions.get("is_tian_hu", False) else 0, # 天胡
False) else 0, "di_hu": lambda: 12 if conditions.get("is_di_hu", False) else 0, # 地胡
"is_double_pure_cleared": lambda: 4 if is_cleared and len(melds) >= 2 and conditions.get( "dragon_seven_pairs": lambda: 12 if is_dragon_seven_pairs(hand) else 0, # 龙七对
"is_double_pure_cleared", False) else 0, "clear_seven_pairs": lambda: 12 if is_cleared and is_seven_pairs(hand) else 0, # 清七对
"is_cleared": lambda: 2 if is_cleared and not (conditions.get("is_pure_cleared", False) or "full_request": lambda: 6 if is_full_request(hand, melds) else 0, # 全求人
conditions.get("is_double_pure_cleared", False) or "pure_cleared": lambda: 4 if is_cleared and len(melds) >= 2 else 0, # 极品清一色
conditions.get("is_clear_seven_pairs", False)) else 0, "seven_pairs": lambda: 2 if is_seven_pairs(hand) else 0, # 七对
"is_seven_pairs": lambda: 2 if conditions.get("is_seven_pairs", False) and not conditions.get( "big_pairs": lambda: 2 if is_big_pairs(hand) else 0, # 大对子
"is_dragon_seven_pairs", False) else 0, "small_pairs": lambda: 2 if is_small_pairs(hand) else 0, # 小七对
"is_dragon_seven_pairs": lambda: 12 if conditions.get("is_dragon_seven_pairs", False) else 0, "golden_hook": lambda: 1 if is_golden_hook(hand) else 0, # 金钩吊
"is_clear_seven_pairs": lambda: 12 if conditions.get("is_clear_seven_pairs", False) else 0, "gang_flower": lambda: 1 if conditions.get("is_gang_flower", False) else 0, # 杠上开花
"is_big_pairs": lambda: 2 if conditions.get("is_big_pairs", False) else 0, "rob_gang": lambda: 1 if conditions.get("is_rob_gang", False) else 0, # 抢杠胡
"is_small_pairs": lambda: 2 if conditions.get("is_small_pairs", False) else 0, "under_the_sea": lambda: 1 if conditions.get("is_under_the_sea", False) else 0, # 海底捞月
"is_full_request": lambda: 6 if conditions.get("is_full_request", False) else 0, "plain_win": lambda: 1 if not any(conditions.values()) 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(): for rule, func in rules.items():
result = func() result = func()
fan += result if result > fan:
print(f"Rule: {rule}, Fan: {result}") # 调试输出 fan = result # 选择当前最大番数
return fan return fan
# 辅助函数实现
def is_seven_pairs(hand): def is_seven_pairs(hand):
""" """检查是否是七对(七个对子)。"""
检查手牌是否是七对 from collections import Counter
""" counter = Counter(hand.tiles)
return sum(1 for count in hand if count == 2) == 7 return sum(1 for count in counter.values() if count == 2) == 7
def is_dragon_seven_pairs(hand):
"""检查是否是龙七对(七对中有一对是三张)。"""
from collections import Counter
counter = Counter(hand.tiles)
pairs = sum(1 for count in counter.values() if count == 2)
triplets = sum(1 for count in counter.values() if count == 3)
return pairs == 6 and triplets == 1
def is_big_pairs(hand):
"""检查是否是大对子(四坎牌和一对将,坎牌为刻子)。"""
from collections import Counter
counter = Counter(hand.tiles)
triplets = sum(1 for count in counter.values() if count == 3)
pairs = sum(1 for count in counter.values() if count == 2)
return triplets == 4 and pairs == 1
def is_golden_hook(hand):
"""检查是否是金钩吊(只剩一张牌)。"""
return len(hand.tiles) == 1
def is_full_request(hand, melds):
"""检查是否是全求人(所有牌通过碰、杠完成)。"""
return all(tile_count == 0 for tile_count in hand.tiles) and len(melds) > 0
def is_cleared(hand, melds): def is_cleared(hand, melds):
"""检查是否是清一色(所有牌同一种花色)。"""
all_tiles = hand.tiles + [meld.tile for meld in melds]
suits = {tile.suit for tile in all_tiles}
return len(suits) == 1
def is_small_pairs(hand):
""" """
检查手牌和明牌是否是清一色 检查是否是小七对六对加一对
参数:
- 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 from collections import Counter
counter = Counter(hand) counter = Counter(hand.tiles)
pairs = sum(1 for count in counter.values() if count == 2)
counts = [count for count in hand if count > 0] return pairs == 6
result = counts.count(2) == 1 and counts.count(3) >= 3
print(f"Big pairs check: {result}, Counter: {Counter(counts)}")
return result