diff --git a/configs/log_config.py b/configs/log_config.py index 1dc0ca8..ccc28f7 100644 --- a/configs/log_config.py +++ b/configs/log_config.py @@ -1,8 +1,14 @@ -import os +# configs/log_config.py from loguru import logger +import os -# 确保 ../logs 目录存在,如果不存在则创建 -os.makedirs("../logs", exist_ok=True) +def setup_logging(): + # 确保日志目录存在 + log_dir = "../logs" + os.makedirs(log_dir, exist_ok=True) -# 配置日志,记录到 ../logs 目录下 -logger.add("../logs/chengdu_mj_engine.log", rotation="10 MB", level="DEBUG", format="{time} {level} {message}") + # 清除所有现有日志处理器,防止重复配置 + logger.remove() + + # 配置日志,记录到 ../logs 目录下 + logger.add(os.path.join(log_dir, "chengdu_mj_engine.log"), rotation="10 MB", level="DEBUG", format="{time} {level} {message}") diff --git a/models/ppo_mahjong_model.zip b/models/ppo_mahjong_model.zip index 64b4409..0571823 100644 Binary files a/models/ppo_mahjong_model.zip and b/models/ppo_mahjong_model.zip differ diff --git a/scripts/train_chengdu_mahjong_model.py b/scripts/train_chengdu_mahjong_model.py index a5031c5..7ff58dd 100644 --- a/scripts/train_chengdu_mahjong_model.py +++ b/scripts/train_chengdu_mahjong_model.py @@ -2,6 +2,7 @@ import gym from stable_baselines3 import PPO from src.environment.chengdu_majiang_env import MahjongEnv import torch +from configs.log_config import setup_logging def train_model(): # 创建 MahjongEnv 环境实例 @@ -29,4 +30,6 @@ def train_model(): env.render() # 打印环境状态 if __name__ == "__main__": + # 调用配置函数来设置日志 + setup_logging() train_model() diff --git a/src/engine/actions.py b/src/engine/actions.py index f1ccbbe..6158ec1 100644 --- a/src/engine/actions.py +++ b/src/engine/actions.py @@ -95,3 +95,30 @@ def check_blood_battle(self): if len(self.state.winners) >= 3 or self.state.remaining_tiles == 0: logger.info(f"游戏结束,赢家列表: {self.state.winners}") self.game_over = True + + +def set_missing_suit(player, missing_suit, game_state): + """ + 玩家设置缺门的动作。 + + 参数: + - player: 玩家索引(0-3)。 + - missing_suit: 玩家选择的缺门("条"、"筒" 或 "万")。 + - game_state: 当前的游戏状态(`ChengduMahjongState` 实例)。 + + 异常: + - ValueError: 如果缺门设置无效。 + """ + valid_suits = ["条", "筒", "万"] + if missing_suit not in valid_suits: + logger.error(f"玩家 {player} 尝试设置无效的缺门: {missing_suit}") + raise ValueError("缺门设置无效") + + if game_state.missing_suits[player] is not None: + logger.error(f"玩家 {player} 已经设置了缺门,不能重复设置") + raise ValueError("缺门已经设置,不能重复设置") + + game_state.missing_suits[player] = missing_suit + logger.info(f"玩家 {player} 设置缺门为: {missing_suit}") + + return game_state.missing_suits[player] \ No newline at end of file diff --git a/src/engine/chengdu_mahjong_engine.py b/src/engine/chengdu_mahjong_engine.py index 17bf6c2..400d02a 100644 --- a/src/engine/chengdu_mahjong_engine.py +++ b/src/engine/chengdu_mahjong_engine.py @@ -1,8 +1,35 @@ from .game_state import ChengduMahjongState - +from .utils import get_suit, get_tile_name +from loguru import logger class ChengduMahjongEngine: def __init__(self): - self.state = ChengduMahjongState() + self.state = ChengduMahjongState() # 创建游戏状态 self.game_over = False + self.deal_tiles() # 发牌 + def deal_tiles(self): + """ 发牌,每个玩家发13张牌,并设置缺门 """ + logger.info("发牌中...") + # 随机发牌给每个玩家 + for player in range(4): + for _ in range(13): # 每个玩家13张牌 + tile = self.state.deck.pop() + self.state.hands[player][tile] += 1 # 增加玩家手牌的计数 + + # 设置缺门:每个玩家定缺 + for player in range(4): + self.state.set_missing_suit(player, missing_suit) + + def start_game(self): + """ 开始游戏 """ + # 游戏开始时初始化状态等 + self.game_over = False + logger.info("游戏开始!") + + def check_game_over(self): + """ 检查游戏是否结束 """ + # 你可以根据游戏规则检查是否有玩家胡牌或其他结束条件 + if len(self.state.deck) == 0: + self.game_over = True + logger.info("游戏结束!") diff --git a/src/engine/game_state.py b/src/engine/game_state.py index 6aa58b0..42fb29d 100644 --- a/src/engine/game_state.py +++ b/src/engine/game_state.py @@ -36,11 +36,8 @@ class ChengduMahjongState: """ valid_suits = ["条", "筒", "万"] if missing_suit not in valid_suits: - logger.error(f"玩家 {player} 尝试设置无效的缺门: {missing_suit}") raise ValueError("缺门设置无效") self.missing_suits[player] = missing_suit - logger.info(f"玩家 {player} 设置缺门为: {missing_suit}") - return self.missing_suits[player] def can_win(self, hand): """