Update calculate_fan.py
parent
1562f784bf
commit
227800f0e8
|
|
@ -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
|
|
||||||
Loading…
Reference in New Issue