parent
fd6006b186
commit
4142bd9423
|
|
@ -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}")
|
||||
|
|
|
|||
Binary file not shown.
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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]
|
||||
|
|
@ -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("游戏结束!")
|
||||
|
|
|
|||
|
|
@ -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):
|
||||
"""
|
||||
|
|
|
|||
Loading…
Reference in New Issue