diff --git a/src/engine/chengdu_mahjong_state.py b/src/engine/chengdu_mahjong_state.py index 4f8f7f3..2539620 100644 --- a/src/engine/chengdu_mahjong_state.py +++ b/src/engine/chengdu_mahjong_state.py @@ -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): """ 判断玩家是否能胡牌。 diff --git a/tests/test_chengdu_majiang_engine.py b/tests/test_chengdu_mahjong_engine.py similarity index 100% rename from tests/test_chengdu_majiang_engine.py rename to tests/test_chengdu_mahjong_engine.py diff --git a/tests/test_game_status.py b/tests/test_chengdu_mahjong_states.py similarity index 50% rename from tests/test_game_status.py rename to tests/test_chengdu_mahjong_states.py index 73faf2a..6f171e8 100644 --- a/tests/test_game_status.py +++ b/tests/test_chengdu_mahjong_states.py @@ -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), "测试失败:带杠的清一色应该可以胡牌" \ No newline at end of file + 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("测试通过:明杠后杠上开花胡牌成功!")