一个基于强化学习的4x4暗棋训练项目,包含Elo自我对弈训练、持续学习、人机对战和可视化分析等完整功能。
gym/
├── main.py # Elo自我对弈训练主入口
├── continuous_training.py # 持续训练脚本
├── human_vs_ai.py # 人机对战GUI界面
├── export_plots.py # 训练数据可视化导出
├── README.md # 项目说明文档
├── game/ # 游戏核心模块
│ ├── __init__.py
│ ├── environment.py # 暗棋游戏环境(Gymnasium兼容)
│ └── policy.py # 自定义CNN策略网络
├── training/ # 训练相关模块
│ ├── __init__.py
│ ├── evaluator.py # 模型评估器
│ ├── simple_agent.py # 简单规则代理
│ └── trainer.py # Elo自我对弈训练器
├── utils/ # 工具模块
│ ├── __init__.py
│ ├── constants.py # 全局配置和常量
│ ├── model_compatibility.py # 模型兼容性处理
│ └── scheduler.py # 学习率调度器
├── models/ # 模型存储目录
│ ├── train_simple.zip # 基础训练模型
│ ├── train_simple_v2.zip # 改进版基础模型
│ ├── continuous_train/ # 持续训练模型
│ │ ├── current_model.zip # 当前训练模型
│ │ ├── backup_model.zip # 备份模型
│ │ └── best_model_session_*.zip # 各阶段最佳模型
│ └── self_play_final/ # Elo自我对弈最终模型
│ ├── main_opponent.zip # 主要对手模型
│ └── challenger.zip # 挑战者模型
├── tensorboard_logs/ # TensorBoard日志
│ └── self_play_final/ # 训练监控日志
└── training_plots/ # 训练图表
├── rollout_ep_*.png # 回合统计图表
├── train_*.png # 训练损失图表
└── time_fps.png # 性能监控图表
4x4暗棋是一种在4×4棋盘上进行的中国象棋变体游戏。游戏开始时,所有棋子背面朝上随机分布在棋盘上,双方轮流进行翻棋和移动棋子。
游戏包含7种不同的棋子,每种棋子都有特定的价值和数量:
| 棋子类型 | 价值 | 数量(每方) | 英文名 |
|---|---|---|---|
| 兵 | 4分 | 2个 | SOLDIER |
| 炮 | 10分 | 1个 | CANNON |
| 马 | 10分 | 1个 | HORSE |
| 车 | 10分 | 1个 | CHARIOT |
| 象 | 10分 | 1个 | ELEPHANT |
| 士 | 20分 | 1个 | ADVISOR |
| 将 | 30分 | 1个 | GENERAL |
胜利条件:率先获得60分的玩家获胜。
- 玩家可以翻开任意一个未翻开的棋子
- 翻棋后该棋子变为明棋,归属确定
- 翻棋消耗回合
- 只有已翻开的己方棋子可以移动
- 普通棋子只能向上下左右四个方向移动一格
- 未翻开的棋子无法移动
棋子遵循严格的等级制度,高等级棋子可以吃掉低等级和同等级的棋子:
等级顺序(从低到高):
兵 < 炮 < 马 < 车 < 象 < 士 < 将
基本吃子规则:
- 高等级棋子可以吃掉所有低等级和同等级的敌方棋子
- 低等级棋子无法吃掉高等级棋子
- 例如:车可以吃兵、炮、马、车,但不能吃象、士、将
- 兵克将:兵可以吃掉敌方的将(唯一例外)
- 将怕兵:将不能吃掉敌方的兵
- 暗棋不可吃:除炮以外,所有棋子都不能吃掉未翻开的棋子
炮是游戏中最特殊的棋子,具有独特的攻击方式:
- 不能普通移动:炮不能移动到相邻的空格
- 隔子攻击:炮只能通过"隔一个棋子攻击"的方式改变位置
- 攻击条件:炮与目标之间必须恰好有一个棋子作为"炮架"
- 攻击方向:只能在水平或垂直方向进行隔子攻击
炮可以攻击:
- 所有敌方棋子(包括已翻开和未翻开的)
- 未翻开的己方棋子
- 不能攻击:已翻开的己方棋子
- 炮架可以是任意棋子(己方、敌方、明棋、暗棋均可)
- 炮架不会被消耗或影响
- 攻击路径上只能有一个炮架
- 积分胜利:率先获得60分的玩家获胜
- 无棋可走:对手无任何合法动作时,当前玩家获胜
- 回合限制:连续24个回合没有吃子发生
- 步数限制:游戏总步数达到100步