Files
hjha-server/docs/bot-architecture.md
xiaoou a75733e4ae feat: ISMCTS bot + full documentation
新增:
- 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
2026-07-07 13:27:00 +08:00

3.5 KiB
Raw Blame History

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