1. 文档定位
本文是以后设计、编写、迁移和审核 SAYC、CCBA、精确制等完整叫牌体系的业务与技术蓝本。
一份完整体系由三大规则区和一组显式启用的约定叫组成:
无干扰叫牌
+ 竞争叫牌(我方先开叫)
+ 防守叫牌(对方先开叫)
+ 可复用约定叫
+ 体系参数与公开含义
→ 可执行的完整叫牌体系
三大规则区既是书籍和人工编写时的知识边界,也是运行时根据完整叫牌序列选择规则的业务边界。目录只负责组织资源,不能代替运行时对序列的判断。
2. 三大规则区
2.1 无干扰叫牌 uncontested
我方是首先作出定约叫品的一方,并且对方到当前为止始终只有 PASS。
包括:
第一至第四家的开叫;
无干扰下的首次应叫;
开叫人的再叫;
应叫人的第二次叫牌;
无干扰下的后续发展。
例如:
1C - PASS - 1H - PASS - 2H2.2 竞争叫牌 competitive
我方首先开叫,随后对方作出了至少一次实质性行动。实质性行动包括定约叫、加倍和再加倍,不包括 PASS。
包括:
对方争叫后的应叫;
对方加倍后的处理;
负加倍、支持性叫牌和自由叫牌;
开叫方在竞争环境中的再叫;
双方继续争夺定约时的后续叫牌。
例如:
我方 1C - 对方 1S - 我方 ?
我方 1H - 对方 X - 我方 ?
2.3 防守叫牌 defensive
对方首先作出定约叫品,我方随后进入拍卖。这里的“防守”指针对对方体系的叫牌方法,不是打牌阶段的防守算法。
包括:
直接位置自然争叫;
技术性加倍和其他防守性加倍;
双套争叫和针对人工开叫的防守方法;
应争叫人(Advancer)的叫牌;
争叫人的再叫;
平衡位置叫牌;
防守方进入拍卖后的全部后续发展。
例如:
对方 1C - 我方 1S
对方 1H - 我方 X
对方 1NT - PASS - PASS - 我方 2S
平衡位置是防守叫牌中的一个位置,不再作为与三大规则区并列的第四本体系。
3. 规则区由完整序列动态决定
3.1 权威输入
每次轮到某一方行动时,规则区必须根据以下公开事实从完整叫牌序列重新推导:
谁作出了全副牌第一个定约叫品;
该开叫人属于当前行动方还是对方;
开叫后,对方是否已经作出定约叫、加倍或再加倍;
当前座位是开叫人、应叫人、争叫人、应争叫人还是平衡位置;
当前行动者已经行动过几次。
不得根据以下信息决定规则区:
当前叫品看起来像什么;
规则文件放在哪个目录;
上一轮缓存的阶段名称;
某个体系 ID;
某条规则的
ruleId。
3.2 从无干扰到竞争的不可逆转换
我方先开叫时,最初可以处于无干扰叫牌。只要对方第一次作出实质性行动,我方从该时刻起永久进入竞争叫牌;即使后面连续出现 PASS,也不能回到无干扰叫牌。
1C - PASS - 1H - PASS
→ 我方仍在无干扰叫牌
1C - 1S - PASS - PASS - 2C
→ 我方从 1S 起始终在竞争叫牌
3.3 同一序列对双方属于不同规则区
规则区是相对于当前行动方判断的,不是整副牌只有一个全局标签。
北 1C - 东 1S - 南 ?南北先开叫,因此南北使用 CCBA 的竞争叫牌规则;
东西针对对方开叫进入拍卖,因此东西使用其体系的防守叫牌规则。
后续无论叫牌延续多少轮,双方各自的根规则区不变。
3.4 参考伪代码
classifyArea(auction, actingSeat):
openingBid = auction.firstContractBid()
if openingBid 不存在:
return UNCONTESTED
if actingSeat 与 openingBid.seat 同一方:
if 对方在 openingBid 之后没有任何非 PASS 行动:
return UNCONTESTED
return COMPETITIVE
return DEFENSIVE
得到规则区后,再根据序列推导具体角色、位置和轮次。平衡位置只作为DEFENSIVE 下的 position = BALANCING。
4. 体系规则与约定叫的边界
4.1 每套体系必须独立拥有的内容
以下内容属于体系本身,不能长期放在 conventions 中跨体系共享:
自然开叫、应叫、再叫和后续发展;
自然无将应叫结构的基础部分;
自然争叫、平衡叫及其后续;
SAYC、CCBA、精确制各自的自由叫牌;
体系特有的
PASS、兜底和优先级;三大规则区中的基础规则。
即使 CCBA 与 SAYC 某些规则暂时完全相同,也应各复制一份并使用各自的规则 ID,以便以后独立修订和发布。复制只是一种迁移起点,不代表运行时共享所有权。
4.2 可以跨体系复用的约定叫
约定模块表示一个有明确入口和公开含义的可选方法,例如:
Stayman、Jacoby Transfer、Texas Transfer;
Gerber、Jacoby 2NT、第四花色逼叫;
负加倍、应答性加倍;
针对强人工 1C 的防守约定。
约定能否启用取决于精确叫牌序列、公开 meaningId、参数和前置状态,不能仅根据叫品文本或体系名称触发。
5. 双方采用不同体系
牌桌为南北和东西分别固定体系版本:
NS: CCBA / 2
EW: PRECISION / 1
运行时职责为:
南北行动
→ 使用 CCBA 选择南北叫品
→ 使用 Precision 的公开含义解释东西已经作出的叫品
东西行动
→ 使用 Precision 选择东西叫品
→ 使用 CCBA 的公开含义解释南北已经作出的叫品
两套体系即可自然组成四种对抗组合,不为每一种配对另写完整体系。增加第三套体系时,只需编写第三套体系自己的三大规则区和公开含义,不产生九套复制品。
6. 同一叫品的多义性
同一序列和叫品可以对应多条内部规则。系统必须保留公开候选分支集合,不能只压成一个笼统范围:
1C 分支 A:12+ HCP,自然梅花
1C 分支 B:10+ HCP,特殊双长套条件
对外解释和 采样使用两个候选分支的并集语义,但每个样本必须完整满足其中至少一个分支。不能只取各字段最小值和最大值形成包络,否则会错误接纳“不满足任何真实分支”的手牌。
机器人实际命中的 只用于内部审计,不能在叫牌过程中向其他座位泄露。
7. 规则选择与兜底
每次叫牌的执行顺序为:
完整序列识别规则区、角色、位置和轮次
→ 按精确 auction.pattern 查找体系规则与已启用约定规则
→ 检查叫品合法性
→ 检查当前手牌条件
→ 检查公开拍卖状态
→ 普通规则按既有 category / priority / 选择
→ 普通规则均不匹配时检查唯一节点 fallback
→ 仍无结果才进入 ENGINE_FAILURE_FALLBACK_PASS
fallback = true 是节点兜底身份,不用普通优先级模拟。一个精确节点最多只能有一个兜底规则。
真人作出体系无法解释的叫品时,序列本身仍然有效,三大规则区仍应继续正确识别;只是该方从无法解释的位置起不再增加新的精确公开手牌约束。
夜雨聆风