新增: - PdkFriendServer/Logic/IsmctsBot.cs: ISMCTS蒙特卡洛搜索机器人 - 800次模拟/决策,对手手牌从未知牌池随机采样 - 包庄决策:大牌(≥J/Q/K/A/2)数量 ≥6 则包庄 - winRate日志输出,决策透明 - docs/bot-architecture.md: 系统架构文档 - docs/bot-algorithms.md: A/B/C三条算法路径完整分析 - docs/ismcts-design.md: ISMCTS实现设计详案 切换: - PdkGameMain.InitBots: PdkBot → IsmctsBot(默认ISMCTS) 验证: - dotnet build 0 errors - 多人对局完整运行:包庄→出牌→结算→test over
3.5 KiB
3.5 KiB
PdkBot 架构设计
概述
PdkBot 是 hjha-server 跑得快游戏的自动出牌机器人系统。采用外挂式设计——不修改核心游戏逻辑,通过 IPdkBot 接口注入,模拟真人玩家参与牌局。
设计原则
1. 外挂式架构(非侵入)
PdkGameMain.WaitWanJiaShuRu()
├─ BotMode == false → Console.ReadLine()(人工输入)
└─ BotMode == true → bot.DecidePlay()
机器人只在 WaitWanJiaShuRu() 的 case 4(打牌)和 case 3(包庄)节点介入,完全不修改游戏状态机、规则引擎或结算逻辑。
2. 信息隔离(模拟真人视角)
机器人只能看到:
| 信息 | 来源字段 | 说明 |
|---|---|---|
| 自己手牌 | CardPack.Cards[myPos-1] (GameState==1) |
16 张起 |
| 桌面最后出牌 | Info.MaxPlayCard |
谁出的什么牌型,GameNum==0 表示新一轮 |
| 各家剩余张数 | Info.ShenYuCard[] |
跑得快中这是公开信息 |
| 各家已出炸弹数 | Info.ZhaDans[] |
公开统计 |
| 游戏规则 | Rule |
关牌/经典/15 张、必压、AAA 炸弹等 |
| 游戏阶段 | Info.GameZT |
3=包庄 4=打牌 |
不能看到:其他玩家的具体手牌内容 (CardPack.Cards[other].CardInfos)。
3. 策略可插拔
IPdkBot (接口)
├─ PdkBot ← 5 维启发式评分(当前默认)
├─ IsmctsBot ← 蒙特卡洛树搜索(推荐)
└─ CustomBot ← 自定义策略只需实现接口
切换策略只需改 PdkGameMain.InitBots() 中的一行代码。
核心组件
PdkBotView:可见信息快照
public class PdkBotView
{
TCardInfoPdkF[] MyHand; // 我的手牌
PlayOutCardPdkF MaxPlayCard; // 桌面最后一手
int WhoPlay; // 当前轮到谁
int MyPos; // 我的位置
byte[] ShenYuCard; // 各家剩余牌数
int[] ZhaDans; // 各家炸弹数
PdkRule Rule; // 游戏规则
int GameZT; // 游戏阶段
}
由 PdkGameMain.BuildBotView(pos) 从完整游戏状态中裁剪生成,确保不泄漏。
IPdkBot:策略接口
public interface IPdkBot
{
bool DecideBaoZhuang(PdkBotView view);
PlayOutCardPdkF DecidePlay(PdkBotView view);
}
GameBaoZhuang 状态机
包庄是逐人推进的:
BaoZhuang[] 值含义:
0 → 尚未选择
1 → 包庄
2 → 不包庄
流程:
GameFaPai → WhoPlay = FistPlay(黑桃3持有者)
GameBaoZhuang()
├─ FistPlay 已选 1 → 直接打牌
└─ 从 i=0 逐人轮询
├─ BaoZhuang[i]==0 → WhoPlay=i+1 → SendPack → bot/人回答
├─ BaoZhuang[i]==1 → 记录, bcount++
└─ BaoZhuang[i]==2 → 跳过
↓
bcount==1 → 唯一包庄
bcount>1 → 庄家包则庄家, 否则下家
bcount==0 → 无人包庄
↓
GameZT=4 → 打牌
文件清单
| 文件 | 职责 |
|---|---|
PdkFriendServer/Logic/PdkBot.cs |
IPdkBot 接口、PdkBotView、PdkBot 启发式实现、IsmctsBot |
PdkFriendServer/Logic/PdkGameMain.cs |
BotMode 开关、BuildBotView、InitBots、WaitWanJiaShuRu 集成点 |
hjha-console/Program.cs |
main.BotMode = true 启动入口 |
docs/bot-architecture.md |
本文档 |
docs/bot-algorithms.md |
算法路径分析 |
docs/ismcts-design.md |
ISMCTS 实现设计 |
运行
cd ~/projects/hjha-server
dotnet run --project hjha-console
# 输出:bot-包庄 → bot出牌日志 → 结算输赢 → test over