From 5c81dd971709ec7b45d8f89d6c7903e10f78229f Mon Sep 17 00:00:00 2001 From: Jiang020609 Date: Fri, 29 May 2026 02:05:17 +0800 Subject: [PATCH] Fix Mahjong hu check for exposed sets without pair --- rlcard/games/mahjong/judger.py | 4 +--- tests/games/test_mahjong_game.py | 39 ++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 3 deletions(-) diff --git a/rlcard/games/mahjong/judger.py b/rlcard/games/mahjong/judger.py index 057645441..3a74c12f3 100644 --- a/rlcard/games/mahjong/judger.py +++ b/rlcard/games/mahjong/judger.py @@ -124,10 +124,8 @@ def judge_hu(self, player): hand = [card.get_str() for card in player.hand] count_dict = {card: hand.count(card) for card in hand} set_count = len(player.pile) - if set_count >= 4: - return True, set_count used = [] - maximum = 0 + maximum = set_count for each in count_dict: if each in used: continue diff --git a/tests/games/test_mahjong_game.py b/tests/games/test_mahjong_game.py index 77420def9..f3ec9f74f 100644 --- a/tests/games/test_mahjong_game.py +++ b/tests/games/test_mahjong_game.py @@ -2,8 +2,15 @@ import numpy as np from rlcard.games.mahjong.game import MahjongGame as Game +from rlcard.games.mahjong.card import MahjongCard as Card +from rlcard.games.mahjong.judger import MahjongJudger as Judger from rlcard.games.mahjong.player import MahjongPlayer as Player + +def _card(card_type, trait): + return Card(card_type, trait) + + class TestMahjongMethods(unittest.TestCase): def test_get_num_players(self): @@ -72,5 +79,37 @@ def test_player_get_player_id(self): player = Player(0, np.random.RandomState()) self.assertEqual(0, player.get_player_id()) + def test_judge_hu_requires_pair_with_four_exposed_sets(self): + judger = Judger(np.random.RandomState()) + player = Player(0, np.random.RandomState()) + player.pile = [ + [_card('characters', '1')] * 3, + [_card('characters', '2')] * 3, + [_card('characters', '3')] * 3, + [_card('dots', '5')] * 3, + ] + player.hand = [_card('dots', '6'), _card('bamboo', '4')] + + win, value = judger.judge_hu(player) + + self.assertFalse(win) + self.assertEqual(value, 4) + + def test_judge_hu_allows_four_exposed_sets_with_pair(self): + judger = Judger(np.random.RandomState()) + player = Player(0, np.random.RandomState()) + player.pile = [ + [_card('characters', '1')] * 3, + [_card('characters', '2')] * 3, + [_card('characters', '3')] * 3, + [_card('dots', '5')] * 3, + ] + player.hand = [_card('bamboo', '4'), _card('bamboo', '4')] + + win, value = judger.judge_hu(player) + + self.assertTrue(win) + self.assertEqual(value, 4) + if __name__ == '__main__': unittest.main()