wangsiyuan 2024-12-01 03:47:31 +08:00
parent b54b46ca11
commit 15eaaa42b6
2 changed files with 128 additions and 2 deletions

View File

@ -69,4 +69,58 @@ def calculate_terminal_fan(hand, melds):
return 0
def is_seven_pairs(hand):
"""
判断是否符合七对番型
七对要求手牌由 7 个对子组成
参数:
- hand: Hand 对象表示玩家当前的手牌
返回:
- int: 如果符合七对返回 2番数否则返回 0
"""
# 获取手牌的计数
tile_counts = hand.tile_count
# 统计对子数量
pairs_count = sum(1 for count in tile_counts.values() if count == 2)
# 检查是否有 7 个对子
if pairs_count == 7:
return 2 # 七对计为 2 番
return 0
def is_full_request(hand, melds, winning_tile):
"""
判断是否符合全求人番型
全求人要求
- 玩家所有牌都通过碰吃完成
- 玩家手上只剩下 1 张牌
- 胡牌必须通过其他玩家打出的牌
参数:
- hand: Hand 对象表示玩家当前的手牌
- melds: list[Meld] 对象表示碰杠等明牌
- winning_tile: MahjongTile 对象表示胡的那张牌
返回:
- int: 如果符合全求人返回 6番数否则返回 0
"""
# 检查手牌中是否只剩下 1 张牌
if len(hand.tiles) != 1:
return 0
# 检查手中剩余的这张牌是否是胡牌
if hand.tiles[0] != winning_tile:
return 0
# 检查是否有明牌(碰、杠、吃),且满足全求人条件
if not melds or not all(meld.is_triplet() or meld.is_kong() or meld.is_sequence() for meld in melds):
return 0
# 符合全求人
return 6

View File

@ -1,6 +1,6 @@
from src.engine.hand import Hand
from src.engine.mahjong_tile import MahjongTile
from src.engine.fan_type import is_basic_win,is_cleared,calculate_terminal_fan
from src.engine.fan_type import is_basic_win,is_cleared,calculate_terminal_fan,is_seven_pairs,is_full_request
from src.engine.meld import Meld
def test_is_basic_win():
@ -100,4 +100,76 @@ def test_calculate_terminal_fan():
hand.add_tile(MahjongTile("", 5))
hand.add_tile(MahjongTile("", 5))
melds = []
assert calculate_terminal_fan(hand, melds) == 3, "测试失败:基本带幺九应为 3 番"
assert calculate_terminal_fan(hand, melds) == 3, "测试失败:基本带幺九应为 3 番"
def test_is_seven_pairs():
"""测试七对番型"""
hand = Hand()
# 示例1符合七对
hand.add_tile(MahjongTile("", 1))
hand.add_tile(MahjongTile("", 1))
hand.add_tile(MahjongTile("", 2))
hand.add_tile(MahjongTile("", 2))
hand.add_tile(MahjongTile("", 3))
hand.add_tile(MahjongTile("", 3))
hand.add_tile(MahjongTile("", 4))
hand.add_tile(MahjongTile("", 4))
hand.add_tile(MahjongTile("", 5))
hand.add_tile(MahjongTile("", 5))
hand.add_tile(MahjongTile("", 6))
hand.add_tile(MahjongTile("", 6))
hand.add_tile(MahjongTile("", 7))
hand.add_tile(MahjongTile("", 7))
assert is_seven_pairs(hand) == 2, "测试失败:符合七对,应为 2 番"
# 示例2不符合七对少一个对子
hand = Hand()
hand.add_tile(MahjongTile("", 1))
hand.add_tile(MahjongTile("", 1))
hand.add_tile(MahjongTile("", 2))
hand.add_tile(MahjongTile("", 2))
hand.add_tile(MahjongTile("", 3))
hand.add_tile(MahjongTile("", 3))
hand.add_tile(MahjongTile("", 4))
hand.add_tile(MahjongTile("", 4))
hand.add_tile(MahjongTile("", 5))
hand.add_tile(MahjongTile("", 5))
hand.add_tile(MahjongTile("", 6))
hand.add_tile(MahjongTile("", 6))
hand.add_tile(MahjongTile("", 7))
assert is_seven_pairs(hand) == 0, "测试失败:不符合七对,应为 0 番"
print("所有七对测试通过!")
def test_is_full_request():
"""测试全求人番型"""
hand = Hand()
# 示例1符合全求人
hand.add_tile(MahjongTile("", 5)) # 玩家手中只剩下 1 张牌
melds = [
Meld(MahjongTile("", 1), ""),
Meld(MahjongTile("", 2), ""),
Meld(MahjongTile("", 3), ""),
Meld(MahjongTile("", 4), ""),
]
winning_tile = MahjongTile("", 5) # 胡牌通过别人打出的牌
assert is_full_request(hand, melds, winning_tile) == 6, "测试失败:符合全求人,应为 6 番"
# 示例2不符合全求人玩家手上有多张牌
hand = Hand()
hand.add_tile(MahjongTile("", 5))
hand.add_tile(MahjongTile("", 6))
assert is_full_request(hand, melds, winning_tile) == 0, "测试失败:不符合全求人,应为 0 番"
# 示例3不符合全求人没有碰或杠的明牌
hand = Hand()
hand.add_tile(MahjongTile("", 5))
melds = []
assert is_full_request(hand, melds, winning_tile) == 0, "测试失败:不符合全求人,应为 0 番"
print("所有全求人测试通过!")