- 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>
29 lines
1.3 KiB
JavaScript
29 lines
1.3 KiB
JavaScript
// §4.2 叫分坐庄 do_callgrade(纯函数,operate on 最小 o_paiju)。期望取自 design §4.2
|
||
require('./_shim');
|
||
const P = require('../class.paiju.js');
|
||
const t = require('./_assert')();
|
||
|
||
const mkCall = fs => ({ callproc: [{ seat: fs, call: null }], banker: -1, call: -1, step: 1 });
|
||
// 依次叫分序列(calls 里每个值 = 当前轮到者的叫分,0=不叫)
|
||
function seq(firstseat, calls) {
|
||
const p = mkCall(firstseat);
|
||
for (const c of calls) P.do_callgrade(p, c);
|
||
return p;
|
||
}
|
||
const bcs = p => [p.banker, p.call, p.step];
|
||
|
||
// 叫5立即上庄
|
||
t.eq('叫5立即上庄', bcs(seq(0, [5])), [0, 5, 2]);
|
||
// 暂定庄叫65,另两家都不叫 → 暂定庄(0)上庄
|
||
t.eq('0叫65 两家不叫→0上庄', bcs(seq(0, [65, 0, 0])), [0, 65, 2]);
|
||
// 0叫65、1叫更低60、2不叫、0不叫 → 60 最低者(1)上庄
|
||
t.eq('0叫65 1叫60 余不叫→1上庄', bcs(seq(0, [65, 60, 0, 0])), [1, 60, 2]);
|
||
// 首家叫5路径:0叫5 → 0直接上庄(其余无需叫)
|
||
t.eq('首家叫5直接坐庄', bcs(seq(0, [5])), [0, 5, 2]);
|
||
// 递减到5:0叫65,1叫60,2叫5 → 2上庄(叫5立即)
|
||
t.eq('2叫5立即上庄', bcs(seq(0, [65, 60, 5])), [2, 5, 2]);
|
||
// 不同首家:1起叫,1叫50,2不叫,0不叫 → 1上庄
|
||
t.eq('首家1叫50 余不叫→1上庄', bcs(seq(1, [50, 0, 0])), [1, 50, 2]);
|
||
|
||
process.exit(t.done('callgrade') ? 0 : 1);
|