parent
fbfb4b89e1
commit
729f1bf7a1
|
|
@ -42,6 +42,21 @@ class ChengduMahjongState:
|
|||
raise ValueError("缺门设置无效")
|
||||
self.missing_suits[player] = missing_suit
|
||||
|
||||
def print_game_state(self, player_index: int):
|
||||
"""
|
||||
打印指定玩家的手牌、暗牌、明牌和缺门信息。
|
||||
|
||||
:param player_index: 要打印的玩家索引(0-3)。
|
||||
"""
|
||||
hand = self.hands[player_index]
|
||||
melds = self.melds[player_index]
|
||||
missing_suit = self.missing_suits[player_index]
|
||||
|
||||
# 打印日志,所有信息在一行
|
||||
logger.info(
|
||||
f"玩家索引: {player_index}, 手牌: {hand}, 明牌: {melds}, 总牌数: {len(hand.tiles) + sum(meld.count for meld in melds)}, 缺门: {missing_suit}"
|
||||
)
|
||||
|
||||
def can_win(self, hand: Hand, melds: list[Meld], missing_suit: str):
|
||||
"""
|
||||
判断玩家是否能胡牌。
|
||||
|
|
|
|||
|
|
@ -176,4 +176,193 @@ def test_can_win_with_pure_one_suit_and_gang():
|
|||
print(f"\n当前手牌: {state.hands[0]}, 明牌: {state.melds[0]}")
|
||||
|
||||
# 调用 can_win 方法并断言胡牌
|
||||
assert state.can_win(state.hands[0], state.melds[0], missing_suit), "测试失败:带杠的清一色应该可以胡牌"
|
||||
assert state.can_win(state.hands[0], state.melds[0], missing_suit), "测试失败:带杠的清一色应该可以胡牌"
|
||||
|
||||
|
||||
def test_can_win_with_yaojiu_sequences():
|
||||
"""测试带幺九的顺子胡牌"""
|
||||
hand = Hand()
|
||||
|
||||
# 添加顺子和对子
|
||||
hand.add_tile(MahjongTile("条", 1))
|
||||
hand.add_tile(MahjongTile("条", 2))
|
||||
hand.add_tile(MahjongTile("条", 3))
|
||||
hand.add_tile(MahjongTile("条", 7))
|
||||
hand.add_tile(MahjongTile("条", 8))
|
||||
hand.add_tile(MahjongTile("条", 9))
|
||||
hand.add_tile(MahjongTile("筒", 1))
|
||||
hand.add_tile(MahjongTile("筒", 1))
|
||||
hand.add_tile(MahjongTile("筒", 1))
|
||||
hand.add_tile(MahjongTile("筒", 9))
|
||||
hand.add_tile(MahjongTile("筒", 9))
|
||||
hand.add_tile(MahjongTile("筒", 9))
|
||||
# 添加对子
|
||||
hand.add_tile(MahjongTile("条", 1))
|
||||
hand.add_tile(MahjongTile("条", 1))
|
||||
|
||||
# 初始化游戏状态
|
||||
state = ChengduMahjongState()
|
||||
state.hands[0] = hand
|
||||
|
||||
# 无明牌
|
||||
melds_list = []
|
||||
state.melds[0] = melds_list
|
||||
|
||||
# 设置缺门为 "万"
|
||||
missing_suit = "万"
|
||||
print(f"\n当前手牌: {state.hands[0]}, 明牌: {state.melds[0]}")
|
||||
|
||||
# 调用 can_win 方法并断言胡牌
|
||||
assert state.can_win(state.hands[0], state.melds[0], missing_suit), "测试失败:带幺九顺子应该可以胡牌"
|
||||
|
||||
def test_can_win_with_seven_pairs():
|
||||
"""测试清一色七对胡牌"""
|
||||
hand = Hand()
|
||||
|
||||
# 添加 7 对牌
|
||||
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))
|
||||
|
||||
# 初始化游戏状态
|
||||
state = ChengduMahjongState()
|
||||
state.hands[0] = hand
|
||||
|
||||
# 无明牌
|
||||
melds_list = []
|
||||
state.melds[0] = melds_list
|
||||
|
||||
# 设置缺门为 "条"
|
||||
missing_suit = "条"
|
||||
print(f"\n当前手牌: {state.hands[0]}, 明牌: {state.melds[0]}")
|
||||
|
||||
# 调用 can_win 方法并断言胡牌
|
||||
assert state.can_win(state.hands[0], state.melds[0], missing_suit), "测试失败:七对应该可以胡牌"
|
||||
|
||||
def test_can_win_with_dragon_seven_pairs():
|
||||
"""测试带暗杠的龙七对胡牌"""
|
||||
hand = Hand()
|
||||
|
||||
# 添加手牌
|
||||
hand.add_tile(MahjongTile("筒", 1))
|
||||
hand.add_tile(MahjongTile("筒", 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))
|
||||
|
||||
# 初始化游戏状态
|
||||
state = ChengduMahjongState()
|
||||
state.hands[0] = hand
|
||||
|
||||
# 无明牌
|
||||
melds_list = []
|
||||
state.melds[0] = melds_list
|
||||
|
||||
# 设置缺门为 "万"
|
||||
missing_suit = "万"
|
||||
print(f"\n当前手牌: {state.hands[0]}, 明牌: {state.melds[0]}")
|
||||
|
||||
# 调用 can_win 方法并断言胡牌
|
||||
assert state.can_win(state.hands[0], state.melds[0], missing_suit), "测试失败:带暗杠的龙七对应该可以胡牌"
|
||||
|
||||
def test_can_win_with_mixed_seven_pairs():
|
||||
"""测试混合七对胡牌"""
|
||||
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))
|
||||
hand.add_tile(MahjongTile("条", 7))
|
||||
|
||||
# 初始化游戏状态
|
||||
state = ChengduMahjongState()
|
||||
state.hands[0] = hand
|
||||
|
||||
# 无明牌
|
||||
melds_list = []
|
||||
state.melds[0] = melds_list
|
||||
|
||||
# 设置缺门为 "万"
|
||||
missing_suit = "万"
|
||||
|
||||
# 调用 can_win 方法并断言胡牌
|
||||
assert state.can_win(state.hands[0], state.melds[0], missing_suit), "测试失败:混合七对应该可以胡牌"
|
||||
|
||||
|
||||
def test_can_win_after_ming_gang():
|
||||
"""测试明杠后杠上开花胡牌"""
|
||||
hand = Hand()
|
||||
|
||||
# 添加暗牌
|
||||
hand.add_tile(MahjongTile("条", 3))
|
||||
hand.add_tile(MahjongTile("条", 3))
|
||||
hand.add_tile(MahjongTile("条", 3))
|
||||
hand.add_tile(MahjongTile("条", 4))
|
||||
hand.add_tile(MahjongTile("条", 5))
|
||||
hand.add_tile(MahjongTile("条", 6))
|
||||
hand.add_tile(MahjongTile("条", 7))
|
||||
hand.add_tile(MahjongTile("条", 8))
|
||||
hand.add_tile(MahjongTile("条", 9))
|
||||
hand.add_tile(MahjongTile("条", 7))
|
||||
hand.add_tile(MahjongTile("条", 8))
|
||||
hand.add_tile(MahjongTile("条", 9))
|
||||
hand.add_tile(MahjongTile("万", 2))
|
||||
|
||||
# 初始化游戏状态
|
||||
state = ChengduMahjongState()
|
||||
state.hands[0] = hand
|
||||
|
||||
# 设置明牌(明杠)
|
||||
melds_list = []
|
||||
state.melds[0] = melds_list
|
||||
|
||||
# 别人打出3条,明杠了3条
|
||||
state.hands[0].add_tile(MahjongTile("条", 3))
|
||||
# 设置明杠
|
||||
state.melds[0].append(Meld(MahjongTile("条", 3), "杠"))
|
||||
|
||||
# 从手牌中移除明杠的牌
|
||||
for _ in range(4):
|
||||
state.hands[0].remove_tile(MahjongTile("条", 3))
|
||||
|
||||
# 模拟杠上开花,自摸一张3万
|
||||
hand.add_tile(MahjongTile("万", 2))
|
||||
# 设置缺门
|
||||
state.missing_suits = "筒"
|
||||
|
||||
# 打印手牌,暗牌,明牌,缺门
|
||||
state.print_game_state(0)
|
||||
# 调用 can_win 方法并断言胡牌
|
||||
assert state.can_win(state.hands[0], state.melds[0], state.missing_suits), "测试失败:明杠后杠上开花应该可以胡牌"
|
||||
print("测试通过:明杠后杠上开花胡牌成功!")
|
||||
Loading…
Reference in New Issue