wangsiyuan 2024-12-01 03:06:12 +08:00
parent 91ac18c8e6
commit 5e4f49edbb
3 changed files with 11 additions and 26 deletions

View File

@ -32,7 +32,7 @@ def is_cleared(hand, melds):
gang_count = sum(1 for meld in melds if meld.is_kong()) gang_count = sum(1 for meld in melds if meld.is_kong())
# 根据杠的数量和是否符合基本胡规则确定番数 # 根据杠的数量和是否符合基本胡规则确定番数
sorted_tiles = sorted(all_tiles, key=lambda t: (t.suit, t.value)) sorted_tiles = sorted(hand.tiles, key=lambda t: (t.suit, t.value))
if try_win(sorted_tiles): # 检查是否符合基本胡(四坎牌加一对将) if try_win(sorted_tiles): # 检查是否符合基本胡(四坎牌加一对将)
if gang_count == 0: if gang_count == 0:
return 2 # 素清 return 2 # 素清

View File

@ -1,25 +1,3 @@
def get_suit(tile_index):
"""
根据牌的索引返回花色
"""
if 0 <= tile_index <= 35:
return ""
elif 36 <= tile_index <= 71:
return ""
elif 72 <= tile_index <= 107:
return ""
else:
raise ValueError(f"无效的牌索引: {tile_index}")
def get_tile_name(tile_index):
"""
根据牌的索引返回牌名例如12筒等
"""
suit = get_suit(tile_index)
return f"{tile_index % 36 + 1}{suit}"
def is_valid_group(tiles): def is_valid_group(tiles):
""" """
判断是否是合法的刻子AAA或顺子ABC 判断是否是合法的刻子AAA或顺子ABC
@ -61,8 +39,12 @@ def try_win(remaining_tiles, groups_formed=0, has_pair=False):
for k in range(j + 1, len(remaining_tiles)): for k in range(j + 1, len(remaining_tiles)):
group = [remaining_tiles[i], remaining_tiles[j], remaining_tiles[k]] group = [remaining_tiles[i], remaining_tiles[j], remaining_tiles[k]]
if is_valid_group(group): if is_valid_group(group):
temp_tiles = remaining_tiles[:i] + remaining_tiles[i + 1:j] + \ temp_tiles = (
remaining_tiles[j + 1:k] + remaining_tiles[k + 1:] remaining_tiles[:i]
+ remaining_tiles[i + 1:j]
+ remaining_tiles[j + 1:k]
+ remaining_tiles[k + 1:]
)
if try_win(temp_tiles, groups_formed + 1, has_pair): if try_win(temp_tiles, groups_formed + 1, has_pair):
return True return True

View File

@ -73,7 +73,10 @@ def test_is_cleared_with_one_gang():
hand.add_tile(MahjongTile("", 9)) hand.add_tile(MahjongTile("", 9))
hand.add_tile(MahjongTile("", 9)) hand.add_tile(MahjongTile("", 9))
melds = [Meld(MahjongTile("", 7), "")] # 带 1 杠 # 添加明牌1 杠)
melds = [Meld(MahjongTile("", 7), "")]
# 检查是否为极品(带 1 杠的清一色)
assert is_cleared(hand, melds) == 3, "测试失败:极品应为 3 番" assert is_cleared(hand, melds) == 3, "测试失败:极品应为 3 番"
print("测试通过:极品") print("测试通过:极品")