1. 文档状态
- 状态:V1 开叫阶段已接入牌桌,后续应叫/再叫仍在开发
- 所属模块:
aibridge.game - 首个叫牌体系:
SAYC_V1 - 核心实现:Java 原生、规则驱动、确定性执行
- 明确限制:V1 不调用 DDS,不实现机器人打牌,不改变前端 API 或 WebSocket 协议
本文描述在线桥牌对局中的第一版机器人叫牌能力。它替换当前机器人在叫牌阶段固定 PASS 的临时行为,但不改变 BridgeDomain 对叫品合法性、拍卖完成和事件持久化的最终裁决权。
2. 目标与非目标
2.1 目标
- 让机器人基于自己的 13 张手牌和公开拍卖信息,按固定版本的 SAYC 或其他叫牌体系规则选择合法叫品。
- 使用外部声明式、可组合、可测试的版本化体系配置,编译为类型安全的内部规则,避免把某一套约定硬编码进引擎。
- 对每次选择给出稳定的规则 ID、叫品含义、优先级和诊断轨迹。
- 相同输入、相同引擎版本和相同体系版本必须产生相同结果,支持事件重放和故障恢复。
- 同一引擎支持 SAYC、2/1 等不同体系;体系差异通过配置表达,Java 代码只提供稳定的规则算子、编译和选择算法。
2.2 非目标
- 不使用 DDS、双明手分析、蒙特卡洛发牌或基于未知手牌的模拟来选择叫品。
- 不推断或读取其他座位的真实未公开手牌。
- 不实现出牌机器人;现有
robotCard逻辑不在本次范围内。 - 不在 V1 提供用户在线编辑或发布约定卡,也不执行配置中的任意脚本;V1 仍读取随应用发布的外部体系配置文件。
3. 规则结构
规则由五部分组成:
- 适用上下文:公开拍卖、座位、身价和搭档/对手先前叫品。
- 候选叫品:规则希望产生的
PASS、实质叫品、DOUBLE或REDOUBLE。 - 手牌约束:HCP、牌型、花色长度、止张和大牌质量等可组合谓词。
- 叫品语义:该叫品向搭档公开表达的范围、forcing、alert、自然/人工属性。
- 排序信息:规则组、优先级和稳定 tie-break key;不能依赖注册顺序的偶然变化。
配置中的 auction.pattern 是可编译的序列模式,决定规则进入 Sequence Trie 的哪个节点;其他 auction 字段是定位后仍需检查的语义谓词。二者不能混成自由文本表达式,否则体系启动时无法建立索引、检查冲突或发现不可达规则。
BidMeaning 与 HandConstraint 必须分开:前者描述叫品向其他座位承诺了什么,后者判断当前真实手牌能否选择该叫品。多数时候两者相近,但人工叫品和多个 hand variant 共用同一叫品时并不相同。
同一叫品可以有多个互斥 variant,以表达弱或强 Michaels 等非连续范围。多个约束默认 AND,同一规则的多个 variant 表示 OR。禁止在字符串描述中隐藏实际决策条件。