Compare commits

...

2 Commits

Author SHA1 Message Date
06accd20dd Update test_game_status.py 2024-12-01 00:41:37 +08:00
b17e775163 Update chengdu_mahjong_state.py 2024-12-01 00:41:35 +08:00
2 changed files with 13 additions and 8 deletions

View File

@@ -1,8 +1,10 @@
from collections import Counter
from .hand import Hand
from .mahjong_tile import MahjongTile
from .meld import Meld # 导入 Meld 类
from loguru import logger
class ChengduMahjongState:
def __init__(self):
# 每个玩家的手牌
@@ -10,7 +12,7 @@ class ChengduMahjongState:
# 每个玩家的打出的牌
self.discards = [[] for _ in range(4)] # 每个玩家的弃牌列表
# 每个玩家的明牌(碰、杠)
self.melds = [[] for _ in range(4)]
self.melds = [[] for _ in range(4)] # 每个玩家的明牌列表,存储 Meld 对象
# 剩余的牌堆
self.deck = [MahjongTile(suit, value) for suit in ["", "", ""] for value in range(1, 10)] * 4 # 108张牌
# 当前玩家索引
@@ -40,11 +42,11 @@ class ChengduMahjongState:
raise ValueError("缺门设置无效")
self.missing_suits[player] = missing_suit
def can_win(self, hand: Hand, melds: list, missing_suit: str):
def can_win(self, hand: Hand, melds: list[Meld], missing_suit: str):
"""
判断玩家是否能胡牌。
:param hand: 玩家手牌Hand 对象)。
:param melds: 玩家已明牌的列表(碰、杠)。
:param melds: 玩家已明牌的列表(Meld 对象列表)。
:param missing_suit: 玩家设置的缺门花色。
:return: True 表示能胡牌False 表示不能胡牌。
"""
@@ -93,8 +95,10 @@ class ChengduMahjongState:
# **第二步:合并暗牌和明牌**
all_tiles = hand.tiles[:]
for meld in melds:
if meld[0] == "" or meld[0] == "": # 将明牌的 AAA 加入检查
all_tiles.extend([meld[1], meld[1], meld[1]])
if meld.type == "": # 添加碰牌3 张)
all_tiles.extend([meld.tile] * 3)
elif meld.type == "": # 添加杠牌4 张)
all_tiles.extend([meld.tile] * 4)
# **第三步:寻找对子并分组**
# 找到所有对子(至少两张相同的牌)

View File

@@ -1,6 +1,7 @@
from src.engine.chengdu_mahjong_state import ChengduMahjongState
from src.engine.hand import Hand
from src.engine.mahjong_tile import MahjongTile
from src.engine.meld import Meld
def test_set_missing_suit():
@@ -166,13 +167,13 @@ def test_can_win_with_pure_one_suit_and_gang():
# 设置明牌(杠)
melds_list = [
("", MahjongTile("", 9))
Meld(MahjongTile("", 9), "") # 表示明杠了4张9筒
]
state.melds[0] = melds_list
state.melds[0] = melds_list # 确保 state.melds[0] 是一个列表
# 设置缺门为 "万"
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) == True, "测试失败:带杠的清一色应该可以胡牌"
assert state.can_win(state.hands[0], state.melds[0], missing_suit), "测试失败:带杠的清一色应该可以胡牌"