wangsiyuan 2024-12-01 01:51:51 +08:00
parent fbfb4b89e1
commit 729f1bf7a1
3 changed files with 205 additions and 1 deletions

View File

@ -42,6 +42,21 @@ class ChengduMahjongState:
raise ValueError("缺门设置无效") raise ValueError("缺门设置无效")
self.missing_suits[player] = missing_suit 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): def can_win(self, hand: Hand, melds: list[Meld], missing_suit: str):
""" """
判断玩家是否能胡牌 判断玩家是否能胡牌

View File

@ -177,3 +177,192 @@ def test_can_win_with_pure_one_suit_and_gang():
# 调用 can_win 方法并断言胡牌 # 调用 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("测试通过:明杠后杠上开花胡牌成功!")