Commit Graph
21 Commits
Author SHA1 Message Date
joywayerandClaude Opus 4.8 9456ab9319 二七王:实现 §11 闲家三提示(踩/没分/有分) + 明确副7/副2 成对语义
全面符合性再审查(4 维度独立对抗核对)结论:与计分/发牌/出牌/跟牌/甩牌
相关规则均一致,无缺陷;仅 §11 闲家三提示服务端缺失、副7/副2 异花色
成对语义存疑两项待办。本次按用户裁定落地:

1. §11 三提示(新增 mod.tishi):闲家在出牌阶段(step5)发 踩/没分/有分,
   服务端不校验真实性、只 SendPack 转发给对家(另一闲家 3-banker-seat);
   庄家无对家不参与;非法 tip/非出牌阶段/庄家发均拒。
   协议补 packet_protocol §13.7/13.8;test_rpc +11 例(正反+边界)。
2. 副7/副2 成对语义:裁定"只同花色同点数两副成对"(代码本已如此,无需改),
   在 design §3 补说明闭合该反复出现的存疑(异花色副7 不成对)。

compliance 文档同步:§11 状态转✅、首轮结论摘要加"非当前状态"说明、
计数 259→270。全套 270 项断言全绿(rpc 34→45)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-05 16:39:04 +08:00
joywayerandClaude Opus 4.8 5c9a78029a 二七王测试计划:同步跟牌覆盖度修复后的计数与状态
test_follow 由 35→50 例、全套 244→259 项;§5.1/5.2 覆盖状态由"❌重大
缺口"更新为✅(含混合出牌、毙牌完全缺门、降级递归 else 欠约束修复回归)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-05 07:19:23 +08:00
joywayerandClaude Opus 4.8 21e76b976a 二七王修复:拖拉机跟牌降级递归 else 分支欠约束(放行非法跟牌)
get_followcard 降规格递归中,当某级"等长短拖拉机候选总对数 > 剩余需求"
时(class.arith.js else 分支),因 cantype 单一结构模型无法表达"任选其一
成拖拉机、其余自由",直接返回宽松的"任意 N 对",导致跟牌方明明有 2 连对
却被允许只出三个孤立对子(如首家 3 连对、跟牌方 AA KK JJ TT 88 66 时打
AA JJ 88),违反 design §5.2"能凑多长拖拉机就必须先凑多长"。

方案 2(根治,不引入过约束):在 can_followcard 结构校验后新增"最大拖拉机
覆盖度"闸门 follow_tractor_cover_ok——
- tractor_run_lengths:把同花色对子按相邻拆成连对 run 长度表;
- max_tractor_profile:贪心最长优先取 K 对,得字典序最大规格档案 best;
- profile_less:跟牌自身档案 got 不得字典序劣于 best,否则拒。
仅在"跟牌整手=首家花色对子且该花色牌≥首家张数"时生效,垫/混合/对子不够
等一律放行。can_followcard 是唯一出牌闸门(paiju.js:605),覆盖人工+托管。
get_followcard else 分支加注释指明由该闸门兜底。

回归测试:test_follow.js +5 条(303/304 三组 2 连对场景,含 else 欠约束
回归:出孤立对→拒、出尽量长拖→合法)。全套 259 项断言通过。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-05 07:18:42 +08:00
joywayerandClaude Opus 4.8 cab66bea01 二七王测试:固化 垫牌/混合出牌 回归用例(代码本已正确)
对应 design.md 新成文的 垫牌(对子/拖拉机首家)与混合出牌概念。经探针
核对,can_followcard 早已让混合牌/垫牌 cardvalue=0、不争夺出牌权,
正式代码无需改。此前仅单张垫牌有覆盖、混合出牌零覆盖,现补 10 条:
- 垫:对子/拖拉机缺门出副牌散张,合法且 beat=false
- 混:有该副花色但不够、只能补主牌 → 合法、beat=false(等效垫牌),
  丢下必出的副牌只出主牌→拒;含"有对也压不过"边界
期望值取自 design 规则(不争权/须先出该花色),全套 254 项通过。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-05 07:02:43 +08:00
joywayerandClaude Opus 4.8 1edbe9cc24 二七王规则:新增"混合出牌"概念(副牌不够+补主牌,等效垫牌)
场景:首家出副牌、跟牌方有该花色副牌但张数不够、又无其他副牌可垫,
只能用主牌补差额,打出"副牌+主牌"混合。核对 can_followcard:混合牌
组不成纯主牌牌型,cardvalue=0,压不过首家。此前文档未成文——补入
术语表并在 §5.2 数量不足段落指向,明确它既非垫牌也非毙牌、但与垫牌
等效、不争夺出牌权。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-05 06:58:25 +08:00
joywayerandClaude Opus 4.8 55db22f4b1 二七王规则:明确 §5.2 同花色牌数量不足时缺口补牌规则
原第 150 行仅笼统一句"缺口部分可任意补其他牌",未针对"首家出拖拉机"
点破缺口不必成对/成拖拉机,且易与层级 4(同花色够、对子不够→补同花色
单张)混淆。按 get_followcard 数量不足分支(cantype 落单张型、只校验张数)
改写为:该花色牌全部必出,缺口用任意其他花色牌补、不强制成对/成拖拉机,
并与"完全缺门"情形分段。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-05 06:48:38 +08:00
joywayerandClaude Opus 4.8 83545e8b80 二七王规则:修正 §5.2 毙牌成立条件为"完全缺门"
原第 156 行写"没有该副牌花色的同长度拖拉机"即可毙,暗示手里有该
花色的牌但不成拖拉机时也能用主牌毙——与代码不符。核对
class.arith.js can_followcard:毙牌成功(cardvalue>0)仅出现在完全
缺门分支,只要手中还有首家花色的牌,get_followcard 即判为必出,
只能垫不能毙。将三条特殊情况统一收紧为"完全缺门",并补前提说明。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-05 06:36:57 +08:00
joywayerandClaude Opus 4.8 93449c8a92 二七王规则:按代码实际行为补全 §5.2 拖拉机跟牌的强制降级层级
design.md §5.2 原本只描述"两连对"最简情形,缺少 3 连对及以上的
强制层级。按 class.arith.js get_followcard 的实际实现补写为完整
优先级表:同长拖 > 更短拖拆凑 > 对子够 > 对子不够全出+补 > 单张补;
并修正对子行"同花不足两张必出现有同花"的措辞。§5.4.4 甩牌跟牌
加一句交叉引用,点明与正常跟牌共用同一层级原则。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-05 06:16:50 +08:00
joywayerandClaude Opus 4.8 0d9ea36c10 二七王测试:穷举跟牌方手牌分支,补主牌首出与拖拉机各分支
回应"是否模拟了跟牌方所有手牌与边界"的核对,补齐:
- 主牌首出的跟牌(单/对)——原仅测副牌首出
- 对子首出·同花色仅1张(必出它+补1张)
- 拖拉机首出的跟牌方分支:对子不够(出仅有的对+补)、同花无对(补同花)、
  多候选拖拉机(cantype=3xx,回归 can_followcard 曾崩溃的 D1 分支)、
  3连对首出、富余对子中必出3连拖/拆散拒
- 手牌数==首出张数(全部必出)

全部单测 244 项断言全绿(test_follow 35)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-05 01:51:58 +08:00
joywayerandClaude Opus 4.8 c29aec140c 二七王测试:补全甩牌/跟甩牌全部情形
回应"甩牌与跟甩牌测试是否完整"的核对,补齐缺口:
- 甩牌首出(§5.4):甩错由主对分量/拖拉机分量/双对之一被压引发(原仅测单张分量);
  纯双单张、纯双对(不连)、单张+拖拉机、单+对+拖三分量混合的合法;副牌禁甩·对手非缺门
- 甩错惩罚实际执行(§5.4.5):do_playcard 收回甩牌、只强制打出最小一张、其余留手;合法甩牌整套打出
- 跟甩牌(§5.4.4):拖拉机分量退化到单张(对子也不够)、多组拖拉机分量、混合demand逐分量对位
- 集成:首出合法甩牌→跟牌方拆散主对(违反§5.4.4)→ do_playcard 拒;正确对位→接受

全部单测 226 项断言全绿(arith 101 / paiju 31 等)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-05 01:34:02 +08:00
joywayerandClaude Opus 4.8 339e6e99e1 二七王测试:完成 P2 用例,达成测试计划 DoD
- test_deal.js(新):§2 发牌构成——92张/去3-4共16/三家各28+底8/分值(§6.1)
- test_arith.js:§3 编码排序(order_cards 降序=设计顺序、is_continuous 相邻链逐段+反例)、
  §7 每档小光/过庄分界+升3级补齐
- test_paiju.js:§8.2 亮牌更多边界(6个7仅qi、固定主9→null、固定主10仅zhu)
- test_config.js:§10 直接调 export.get_asetcount/get_needroomcard(_joinroom)
- test_rpc.js/_rpc.js:§12 端到端(真实驱动 叫分→上庄→选主→埋牌→出牌ready)、
  §9 maipai 亮牌门控 + get_deskinfo PushCards 门控
- 02-测试计划.md/README:P2 与 DoD 标记达成

全部单测 204 项断言全绿(node server/games/erqiwang/test/run.js)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-05 01:24:34 +08:00
joywayerandClaude Opus 4.8 6939e70ed7 二七王测试:完成 P1 用例(L3 RPC 层 + 坐庄轮换)
- mod.js:加 module.exports 守卫,使其可被 Node require(友乐无 module 跳过)
- test/_rpc.js(新):L3 脚手架——挂类全局、mock cls_mod/min_loadJsFile 装配 mod.js、
  捕获 SendPack/sendpack_toother 下发包
- test/test_rpc.js(新):§9 明牌 mingpai(合法/不查牌·未报无主·非出牌阶段拒 + others结构)、
  §9 出牌 chupai 的 info/baozhu 查牌门控(可查有/不查无)、§4 投降 touxiang 条件(70·step2·庄家)、
  §4.2 mod.jiaofen 入参校验(>70/非5倍/首家必叫/后叫更低)、
  §4 70分上庄暗牌亮牌(真实 jiaofen 驱动到上庄,验证 bottomcards/ancard3s 门控)
- test/test_desk.js(新):§4.6 坐庄轮换 do_prepare(庄赢连庄/闲赢·投降下家)
- 02-测试计划.md/README:P1 标记完成,剩余归入 P2

全部单测 156 项断言全绿(node server/games/erqiwang/test/run.js)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-05 01:14:33 +08:00
joywayerandClaude Opus 4.8 0049754988 二七王测试:完成 P0 用例(正常跟牌/结算集成/叫分坐庄/扣底触发)
- test_follow.js(新):§5.1/5.2 正常跟牌/毙牌/垫牌 17 例——单张/对子/拖拉机的
  必出、缺门毙牌数量对应(副单→主单/副对→主对/副N连→主N连)、垫牌、有对/拖却出散张被拒
- test_callgrade.js(新):§4.2 叫分坐庄 do_callgrade 6 例(叫5立即/两家不叫/后叫更低)
- test_paiju.js:§7/§8 结算集成扩充(大光/过庄/升级/爬坡/傍王+算奖参与/对照)、
  §6.3 扣底触发 get_bottom_account(主对×2/两连对×4/副牌不扣/庄赢不扣)
- 02-测试计划.md/README:P0 全部标记完成

全部单测 123 项断言全绿(node server/games/erqiwang/test/run.js)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-05 01:03:01 +08:00
joywayerandClaude Opus 4.8 5a5165a319 二七王:制定服务端合规测试计划
- docs/compliance/02-测试计划.md:按 design 章节的"规则→用例"覆盖矩阵
  (标注被测函数/测试层L1-L3/正反边界/覆盖状态),缺口清单按优先级排序,
  以及 L2 局内集成 / L3 RPC 层所需脚手架
- test/README.md:链接测试计划

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-05 00:02:52 +08:00
joywayerandClaude Opus 4.8 6d663c8a66 二七王:新增 Node 单元测试,CLAUDE.md 记录测试命令
- test/_shim.js:平台全局垫片(min_ary_include/deduct、min_random/now/ontimeout、
  youle_erqiwang.import mock),忠实复刻 minhttp.js;仅测试用,不进正式代码
- test/_assert.js + run.js:极简断言与总运行器
- test/test_arith.js(扣底/算子常规+爬坡/算奖/甩牌/跟牌分量) test_config.js(位串/局数扣卡)
  test/test_paiju.js(亮牌/结算 get_paiju_account 集成),共 89 项断言全过
- test/README.md:运行方式与双运行时原理
- CLAUDE.md:常用命令补测试入口,说明服务端双运行时规范

(CLAUDE.md 内另含此前一处措辞微调,随本次文档更新一并纳入)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-04 23:51:12 +08:00
joywayerandClaude Opus 4.8 60271175d6 二七王:逻辑文件补双运行时守卫,解锁 Node 单测
按 dev-guide 01 §1「一套代码,两个运行时」补齐 erqiwang 缺失的守卫(此前只支持友乐全局加载模型):
- 顶部:跨模块依赖走 `if (typeof require!=='undefined') var X=require('./class.X.js')`
  (config/pai/arith 无跨模块依赖;paiju 依赖 arith/config/pai;desk 依赖 paiju;export 依赖 arith/config/desk)
- 底部:`if (typeof module!=='undefined') module.exports = cls_X`
- export/import 的平台接线 `youle_erqiwang.X=...` 加 `typeof youle_erqiwang` 守卫,Node 无此全局时跳过

纯增量:友乐无 require(浏览器模型),守卫全部跳过、全局名仍无条件暴露,线上行为不变;
仅在 Node 下额外启用 require/module.exports,从而可用 node 直接单测。min_*/youle_erqiwang 等平台全局仍按全局名引用(Node 侧由测试 shim 提供)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-04 23:51:12 +08:00
joywayerandClaude Opus 4.8 e31bdd854d 二七王文档:记录二次全量复核结论 + §5.4.4 修复同步
- compliance/01:新增二次对抗性复核结论(服务端全部符合 design.md);
  §5.4 标记全部完成、§5.4.4 已修;修正过时的 §10.1 数组下标描述
- packet_protocol.md:playproc 补 shuai_demand 字段说明

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-04 23:20:09 +08:00
joywayerandClaude Opus 4.8 257615aed9 二七王:实现 §5.4.4 强制跟牌分量拆解
原缺陷:混合甩牌在 can_playcard 牌型计算中被塌缩为扁平"多单张/多对",
跟牌只强制"同花色凑张数",未强制"拖拉机→对子→单张"的分量优先级。

修复:
- 合法甩牌时 can_playcard 记录分量需求 shuai_demand{tractors,pairs,singles},
  do_playcard 存入 playproc、new_playround 复位
- 新增 arith.flush_follow_ok:在"同花色凑张数、主牌最大化"之上追加逐分量强制匹配
  ——能凑同长主拖必凑、能凑主对必凑(不足则退化为对子/单张),不得拆散去垫
- 新增 arith.remove_pairs 辅助
- 跟牌时 do_playcard 在 can_followcard 通过后再过 flush_follow_ok

不影响捡分/输赢(合法甩牌仍恒不可反超),仅补齐闲家被迫垫牌的结构约束。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-04 23:20:09 +08:00
joywayerandClaude Opus 4.8 dcf8e09f7d 二七王文档:同步 design 流程/协议,新增合规核对
design.md
- 修正选主/埋牌顺序笔误(确认「先选主后埋牌」)
- 投降改为选主阶段与选主互斥的选择(不选主/不埋牌直接结算),算奖用庄家36张、无连对链
- 70分暗牌改为「庄家摸牌之前、向所有玩家亮3秒」
- 选主阶段前端显示每花色对数、70分并列投降按钮
- 新增 §12「完整牌局游玩流程」(含大局与阶段速览)

packet_protocol.md(随代码如实同步)
- 结算 aset/seatlist 新结构(multiple=基础子数、upgrade 判定倍率、bangwang/climb、
  chongguan/wang/naward/grade_aw);shangzhuang bottomcards 按70分门控 + ancard3s
- maipai/PushCards 亮牌 liangpai;chupai info/baozhu 按查牌门控;新增 mingpai 收发包
- step 枚举去掉废弃的投降4;删除 Surrender 重连视图

docs/compliance/(新增)
- 00 初步不一致清单、01 design 合规逐节核对(含整改进度与 roomtype 位串约定)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-04 22:34:06 +08:00
joywayerandClaude Opus 4.8 6120580505 二七王服务端:按 design.md 整改结算/算奖/甩牌,roomtype 改位串
结算与算奖(§6.3/§7/§8)
- 扣底倍数改线性:单张×1、主对×2、N连对×2N
- 算子实现常规算子 + 爬坡两套(大光×3、Q=40 / 爬坡分段),X=基础子数×判定倍率
- 常规算奖只计庄家;连对链修复(传实际主花色);移除 ≥10 老主误加奖与设计外的
  「冲关必叫/四王必踢」作废;算奖快照取庄家埋牌后28张(新增 get_seat_cards_award)
- 算奖并入结算改为 X×(2Ni−Nj−Nk);傍王按房间开关、庄闲每王1奖

出牌与甩牌(§5.4)
- 副牌绝对禁甩;甩牌最大性按对手全部手牌逐分量判定(新增 trump_rank/
  decompose_trump/opp_can_beat_flush);甩错惩罚(收回、只打最小一张、下发 shuaicuo)
- 修复 can_followcard 引用未定义 tuolaji_list 的崩溃、can_playcard 14张上限失效

开局/投降/暗牌(§4)
- 投降改为选主阶段(step2)与选主互斥、不埋牌、算奖用庄家36张;埋牌后直进出牌(删废弃step4)
- 70分暗牌摸牌前向所有玩家亮3秒(+ancard3s),非70分不再泄露暗牌给闲家;叫分上限≤70

查牌/亮牌(§8.2/§9)
- 新增亮牌 get_liangpai(庄家埋牌后28张按阈值统计);报无主统计与亮牌按查牌位门控
- 新增 mingpai 明牌 RPC(可查牌+已报无主时查看他家全部主牌)

房间与配置(§10)
- 局数6/12、房主扣卡2/4;新增 class.config.js 以位串解析 roomtype(唯一入口 SSOT)
- 清理 do_choiceflower 死代码

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-04 22:32:53 +08:00
joywayer 96372d713c 规则文档理清楚,开始代码层面对比和校对 2026-07-04 09:52:49 +08:00