二七王:改写 design §5.3(拖拉机相邻关系),消除自相矛盾表述
规则复核时提出「主牌链上位置相邻的对子即成拖拉机、不限花色」,据此发现 §5.3 首句「**同一花色内**点数相邻的两个对子构成拖拉机」与本节紧接着给出的跨花色 主牌链(正7-副7-正2-副2-主A…)自相矛盾。代码实现的一直是那条链(跨花色), 首句表述是错的。 §5.3 拆成两段重写: - 副牌拖拉机:**必须同一花色**,链 A-K-Q-J-10-9-8-6-5(7、2 是固定主牌不入链, 故 6 与 8 相连;3、4 不在牌堆,5 是最小档);跨花色不构成连对。 - 主牌拖拉机:只有一条完整序列,**位置相邻即成拖拉机、不限花色**——正7对+副7对、 副7对+正2对、副2对+主A对、大王对+小王对都是合法两连对。 - 补充「同一档位的两个对子不相邻」:副7 在序列里只占一个位置,♥7对+♣7对 是两个 平级对子而非拖拉机,副2 同理。 §1 术语表给「正2/正7」加上口语别名「主2/主7」,避免复核时来回换词。 代码无需改动(实测 14 段链全通、跨花色通、同档位不通,与改写后的表述一致)。 补 17 条用例把改写后的每条钉在**拖拉机层**——此前只测到 is_continuous(两张牌 相不相邻),没测过「这几个对子能不能真的组成拖拉机」。变异检验:主牌链改成必须 同花色 / 同档位副7对算相邻 / 副牌 8-6 去掉同花色约束,分别转红 6、2、4 条。 另:复核给出的副牌链写作「…-6-5-3」,需要牌堆保留 3;但 92 = 28×3 + 8 只有在 3、4 都剔除时才成立(保留 3 则 92÷3 除不尽、三家发不平)。经确认为笔误,维持 design §2 现状,并就地补两条断言钉住「参与发牌的牌里 3 和 4 各 0 张、共 92 张」。 全套单测 523 → 540 项全绿。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -192,6 +192,43 @@ t.eq('连对 边界 上述四张组不出拖拉机',
|
||||
t.eq('连对 正 正7对+副7对 构成两连对',
|
||||
A.get_tuolaji_list(MF, A.get_pairlist(MF, A.order_cards(MF, [id(1, 1, 7), id(2, 1, 7), id(1, 2, 7), id(2, 2, 7)])), 302).length, 1);
|
||||
|
||||
// ============ §5.3 拖拉机:副牌须同花色 / 主牌按链相邻·不限花色 ============
|
||||
// 这一层此前只测到 is_continuous(两张牌相不相邻),没测到「这几个对子能不能真的组成拖拉机」。
|
||||
// design §5.3 改写后明确:副牌**必须同一花色**;主牌只要在主牌序列里**位置相邻**即可、**不限花色**;
|
||||
// 同一档位的两个对子(如 ♥7对 + ♣7对)平级、不相邻。
|
||||
const tljOf = cards => {
|
||||
const s = A.order_cards(MF, cards.slice());
|
||||
const ps = A.get_pairlist(MF, s);
|
||||
return ps.length >= 2 && A.get_tuolaji_list(MF, ps, 300 + ps.length).length > 0;
|
||||
};
|
||||
// —— 主牌链:跨花色也成连对 ——
|
||||
t.eq('§5.3 主链 正7对+副7对(跨花色) 成连对', tljOf([id(1, 1, 7), id(2, 1, 7), id(1, 2, 7), id(2, 2, 7)]), true);
|
||||
t.eq('§5.3 主链 副7对+正2对(跨花色) 成连对', tljOf([id(1, 2, 7), id(2, 2, 7), id(1, 1, 2), id(2, 1, 2)]), true);
|
||||
t.eq('§5.3 主链 正2对+副2对(跨花色) 成连对', tljOf([id(1, 1, 2), id(2, 1, 2), id(1, 3, 2), id(2, 3, 2)]), true);
|
||||
t.eq('§5.3 主链 副2对+主A对(跨花色) 成连对', tljOf([id(1, 2, 2), id(2, 2, 2), id(1, 1, 1), id(2, 1, 1)]), true);
|
||||
t.eq('§5.3 主链 大王对+小王对 成连对', tljOf([big(1), big(2), small(1), small(2)]), true);
|
||||
t.eq('§5.3 主链 小王对+正7对 成连对', tljOf([small(1), small(2), id(1, 1, 7), id(2, 1, 7)]), true);
|
||||
t.eq('§5.3 主链 三连(副7对+正2对+副2对) 成立', tljOf([id(1, 2, 7), id(2, 2, 7), id(1, 1, 2), id(2, 1, 2), id(1, 3, 2), id(2, 3, 2)]), true);
|
||||
t.eq('§5.3 主链 主8对+主6对 成连对(7被抽走)', tljOf([id(1, 1, 8), id(2, 1, 8), id(1, 1, 6), id(2, 1, 6)]), true);
|
||||
// —— 同一档位的两个对子平级、不相邻 ——
|
||||
t.eq('§5.3 同档 ♥7对+♣7对 不成连对', tljOf([id(1, 3, 7), id(2, 3, 7), id(1, 2, 7), id(2, 2, 7)]), false);
|
||||
t.eq('§5.3 同档 ♥2对+♣2对 不成连对', tljOf([id(1, 3, 2), id(2, 3, 2), id(1, 2, 2), id(2, 2, 2)]), false);
|
||||
// —— 副牌:必须同花色 ——
|
||||
t.eq('§5.3 副牌 ♥K对+♥Q对 同花色 成连对', tljOf([id(1, 3, 13), id(2, 3, 13), id(1, 3, 12), id(2, 3, 12)]), true);
|
||||
t.eq('§5.3 副牌 ♥K对+♣Q对 跨花色 不成连对', tljOf([id(1, 3, 13), id(2, 3, 13), id(1, 2, 12), id(2, 2, 12)]), false);
|
||||
t.eq('§5.3 副牌 ♥8对+♥6对 成连对(7是主牌被抽走)', tljOf([id(1, 3, 8), id(2, 3, 8), id(1, 3, 6), id(2, 3, 6)]), true);
|
||||
t.eq('§5.3 副牌 ♥8对+♣6对 跨花色 不成连对', tljOf([id(1, 3, 8), id(2, 3, 8), id(1, 2, 6), id(2, 2, 6)]), false);
|
||||
t.eq('§5.3 副牌 ♥6对+♥5对 成连对(5为最小档)', tljOf([id(1, 3, 6), id(2, 3, 6), id(1, 3, 5), id(2, 3, 5)]), true);
|
||||
t.eq('§5.3 副牌 ♥9对+♥K对 不相邻 不成连对', tljOf([id(1, 3, 9), id(2, 3, 9), id(1, 3, 13), id(2, 3, 13)]), false);
|
||||
// —— §2 牌堆里没有 3 和 4,所以副牌序列的最小一档就是 5 ——
|
||||
// (规则复核时有人把副牌链写成 "…-6-5-3",那需要牌堆保留 3;但 92 = 28×3 + 8 只有在
|
||||
// 3、4 都剔除时才成立。这里就地钉住"牌堆里 3 和 4 各 0 张",避免链的末端再被写错。)
|
||||
const _P = require('../class.paiju.js');
|
||||
const _deck = _P.new({ paiju_list: [] }, 0).cards.filter(c => c.dealowner !== -1);
|
||||
t.eq('§2 参与发牌的牌里 3 和 4 各 0 张',
|
||||
[3, 4].map(n => _deck.filter(c => c.number === n).length), [0, 0]);
|
||||
t.eq('§2 参与发牌共 92 张 = 28×3 + 暗牌8', [_deck.length, 28 * 3 + 8], [92, 92]);
|
||||
|
||||
// ============ §6.3 扣底触发的反面:赢末轮的牌不全是主牌就不扣底 ============
|
||||
t.eq('扣底 反 副牌两连对赢末轮 → 0', mult([id(1, 2, 13), id(2, 2, 13), id(1, 2, 12), id(2, 2, 12)]), 0);
|
||||
t.eq('扣底 反 混合出牌(主K+副K)赢末轮 → 0', mult([id(1, 1, 13), id(1, 2, 13)]), 0);
|
||||
|
||||
Reference in New Issue
Block a user