diff --git a/configs/log_config.py b/configs/log_config.py index 9d91f2e..96dabfa 100644 --- a/configs/log_config.py +++ b/configs/log_config.py @@ -9,9 +9,9 @@ def setup_logging(): # 清除所有现有日志处理器,防止重复配置 logger.remove() - # 配置日志文件 + # 配置斗地主日志文件 logger.add( - os.path.join(log_dir, "chengdu_mj_engine.log"), + os.path.join(log_dir, "doudizhu_engine.log"), # 斗地主的日志文件 rotation="10 MB", level="DEBUG", format="{time:YYYY-MM-DD HH:mm:ss.SSS} {level} {message}", @@ -19,7 +19,17 @@ def setup_logging(): diagnose=True # 启用变量诊断信息 ) - # 配置控制台日志(可选) + # 配置麻将日志文件(如果需要) + logger.add( + os.path.join(log_dir, "chengdu_mj_engine.log"), + rotation="10 MB", + level="DEBUG", + format="{time:YYYY-MM-DD HH:mm:ss.SSS} {level} {message}", + backtrace=True, + diagnose=True, + ) + + # 配置控制台日志 logger.add( lambda msg: print(msg), level="DEBUG", diff --git a/models/ppo_doudizhu_model.zip b/models/ppo_doudizhu_model.zip new file mode 100644 index 0000000..3f6ded5 Binary files /dev/null and b/models/ppo_doudizhu_model.zip differ diff --git a/scripts/train_dizhu_model.py b/scripts/train_dizhu_model.py index 572c553..5cefb69 100644 --- a/scripts/train_dizhu_model.py +++ b/scripts/train_dizhu_model.py @@ -2,7 +2,7 @@ from stable_baselines3 import PPO from src.environment.dizhu_env import DouDiZhuEnv # 导入斗地主环境 import torch from configs.log_config import setup_logging -from loguru import logger # 添加 logger +from loguru import logger # 使用日志工具 def train_dizhu_model(): # 创建 DouDiZhuEnv 环境实例 diff --git a/src/engine/dizhu/dizhu_engine.py b/src/engine/dizhu/dizhu_engine.py index 67291aa..f0ed983 100644 --- a/src/engine/dizhu/dizhu_engine.py +++ b/src/engine/dizhu/dizhu_engine.py @@ -1,6 +1,8 @@ import numpy as np +from loguru import logger from src.engine.dizhu.player_state import PlayerState from src.engine.dizhu.deck import Deck + class DiZhuEngine: def __init__(self): self.deck = Deck() # 牌堆 @@ -28,11 +30,19 @@ class DiZhuEngine: self.current_player_index = 0 self.game_over = False + # 日志输出 + logger.info("游戏初始化完成") + logger.info(f"地主牌: {self.landlord_cards}") + for i, player in enumerate(self.players): + logger.info(f"玩家 {i + 1} ({player.role}) 手牌: {player.hand_cards}") + def get_current_player(self): """ 获取当前玩家对象 """ - return self.players[self.current_player_index] + current_player = self.players[self.current_player_index] + logger.info(f"当前玩家: 玩家 {self.current_player_index + 1} ({current_player.role})") + return current_player def step(self, action): """ @@ -41,30 +51,36 @@ class DiZhuEngine: """ current_player = self.get_current_player() + logger.info(f"玩家 {self.current_player_index + 1} 的动作: {action}") + if action == "pass": # 过牌作为单独的历史记录 current_player.history.append([]) + logger.info(f"玩家 {self.current_player_index + 1} 选择过牌") else: # 确保动作始终为列表 if not isinstance(action, list): action = [action] # 检查动作合法性 if not all(card in current_player.hand_cards for card in action): + logger.error(f"玩家 {self.current_player_index + 1} 的动作非法: {action}") raise ValueError(f"玩家手牌不足以完成此次出牌: {action}") # 移除出牌 for card in action: current_player.hand_cards.remove(card) # 记录动作 current_player.history.append(action) + logger.info(f"玩家 {self.current_player_index + 1} 出牌: {action}") # 检查游戏是否结束 if not current_player.hand_cards: self.game_over = True + logger.info(f"游戏结束!玩家 {self.current_player_index + 1} ({current_player.role}) 获胜") return f"{current_player.role} 胜利!" # 切换到下一个玩家 self.current_player_index = (self.current_player_index + 1) % 3 - + logger.info(f"切换到玩家 {self.current_player_index + 1}") def get_game_state(self): """ @@ -83,4 +99,11 @@ class DiZhuEngine: "current_player_index": self.current_player_index, "game_over": self.game_over, } + logger.info("当前游戏状态: ") + logger.info(f"地主牌: {self.landlord_cards}") + for i, player in enumerate(self.players): + logger.info(f"玩家 {i + 1} ({player.role}) 手牌: {player.hand_cards}") + logger.info(f"玩家 {i + 1} 出牌历史: {player.history}") + logger.info(f"当前玩家索引: {self.current_player_index}") + logger.info(f"游戏是否结束: {self.game_over}") return state