升级(拖拉机/80分) · 规则与自检 引擎自检 167/167 全部通过

升级(拖拉机)- 出牌与服务器裁判规则

基本概念

牌的种类

  • 普通牌:2、3、4、5、6、7、8、9、10、J、Q、K、A,共四种花色(♠♥♣♦)。
  • 级牌(当前级):本局打几,几就是级牌(例如打 5 时所有的 5 都是级牌)。级牌在游戏中自动归入主牌。
  • 主牌:大王、小王、所有级牌、当前主花色的所有普通牌。
  • 无主局:用两张大王或两张小王宣主时,本局没有主花色。此时只有大王、小王和级牌算作主牌。

牌面大小关系(从小到大)

  • 普通牌大小:2 < 3 < 4 < 6 < 7 < 8 < 9 < J < Q < K < A(*注:当前级牌从普通牌序列中移除*)。
  • 主牌大小:主花色普通牌 < 非主花色级牌 < 主花色级牌 < 小王 < 大王。

出牌组合

  • 单张:任意一张单牌。
  • 对子:两张完全相同(同点数且同花色)的牌。
    • *注:大王和小王不能配对;不同花色的级牌也不能配对。*
  • 拖拉机:同花色的连续对子,至少 2对。
    • *连续示例(打 10 时)*:♠9♠9 ♠J♠J 是合法拖拉机(自动跳过级牌 10)。
    • *连续示例(打 5 时)*:♠4♠4 ♠6♠6 是合法拖拉机(自动跳过级牌 5)。
    • *主牌拖拉机(打 ♠2 时,♠2是主花色级牌,♥2、♣2和♦2是非主花色级牌)*:

♠2♠2 小王小王 是合法拖拉机 - ♠2(主花色级牌)和小王相邻。
♠2♠2 小王小王 小大大王 是合法拖拉机 - ♠2(主花色级牌)和小王相邻,小王和大王相邻。
♦2♦2 ♠2♠2 是合法拖拉机 - ♦2(非主花色级牌)和♠2(主花色级牌)相邻。
♠A♠A ♦2♦2 是合法拖拉机 - ♠A(最大的主花色普通牌)和♦2(非主花色级牌)相邻。
♦2♦2 小王小王 不是合法拖拉机 - ♦2(非主花色级牌)和小王不相邻,因为中间隔着♠2(主花色级牌)。
♠A♠A ♠2♠2 不是合法拖拉机 - ♠A(最大的主花色普通牌)和♠2(主花色级牌)不相邻,因为中间隔着非主花色级牌(♥2/♣2/♦2)。

  • *主牌拖拉机(打无主时,级牌的小王可以连为拖拉机)*:

♠2♠2 小王小王 是合法拖拉机 - ♠2(级牌)和小王相邻。

  • 甩牌:同花色 2 张以上,由单张、对子或拖拉机组合而成的混合出牌方式(例如:♠A + ♠Q + ♠JJ)。

亮主规则

  • 单张亮主:如果还没有其它玩家亮单张主,可使用单张亮主。如果其它玩家已经亮主,则单张无法再亮,因为这时候反主需要对子。
  • 对子反主:如果自己之前使用这个对子的单张亮主,则可以在还没被人反主之前使用对子锁定。如果别人使用了单张亮主,则可以使用对子反主。如果房间没启用“增强对王反主”,则对子反主或定主之后为最终状态,不可再改变。
  • 对王反主:对王正常情况下可当对子反主。如果房间启用了“增强对王反主”,则对王可以反级牌对子的主,一对大王可以反一对小王的主,对大王反对小王在第一局争庄时有用,之后便没有意义,因为对小王是无主,反了之后还是无主。

一、领牌与甩牌规则

玩家领牌时必须出同花色(所有主牌视为同一种花色),可以出单张、对子、拖拉机或甩牌。

甩牌合法性校验

只有当其他所有玩家手中,都没有能压过你甩牌中任意一个分量的同花色更大牌时,甩牌才合法。

  • 不合法示例(会被服务器罚牌):你甩 ♠K + ♠QQ,若对手手中有 ♠A。虽然对手的 ♠A 无法压过你的对子 ♠QQ,但 ♠A 可以压住你的单张分量 ♠K,因此该甩牌不合法。
  • 合法示例(甩牌成功):你甩 ♠A + ♠QQ,若对手手中有 ♠K。因为 ♠A 是该花色最大的单张(无人能压),且 ♠QQ 是该花色剩余最大的对子(单张 ♠K 天然无法压对子),因此该甩牌完全合法。

🚨 服务器甩牌失败自动罚牌逻辑

当玩家出的甩牌被服务器判定为非法(有对手能压过某个分量)时,服务器不会拒绝出牌,而是会自动将该次甩牌拆解,并强制转为惩罚性出牌。具体执行步骤如下:

  1. 分量检查:服务器严格按照 【单张 ➔ 对子 ➔ 拖拉机】 的顺序逐一检查玩家选择的牌。
  2. 强制出牌:找到第一个能被某对手压过的分量,将其对应的牌作为罚牌强制打出,其余未违规的牌自动退回玩家手牌。
  3. 兜底处理:若因复杂组合等特殊情况导致无法识别具体被压分量,系统将自动触发兜底规则,强制打出整手甩牌中最小的牌
    • 若最小的牌有 2 张 ➔ 强制出这一对。
    • 若最小的牌有 1 张 ➔ 强制出这一张。
    • *(基于两副牌物理限制,同一面值绝不可能同时出现单张和对子并存,此逻辑结果唯一)。*

二、跟牌规则

后手玩家跟牌的张数必须与领牌人相同,并尽量跟随同花色:

  • 跟单张:有同花色就必须出至少一张同花色,不够则剩余随意。
  • 跟对子:有两张以上同花色就必须凑出一个对子;只有一张同花色就出那一张,剩余随意;完全没有同花色则随意出两张。
  • 跟拖拉机:按以下优先级跟牌:
    1. 有同花色拖拉机 ➔ 必须出拖拉机。
    2. 没有拖拉机但有对子 ➔ 必须出尽量多的同花色对子。
    3. 没有对子 ➔ 出所有同花色单张,剩余随意。
  • 跟甩牌:按甩牌的组合结构(拖拉机、对子、单张)分别尽量满足。优先凑拖拉机,其次凑对子,最后出单张,不够则剩余随意。

三、比牌与“杀牌”规则

正常比牌

  • 主牌可以压任意非主牌(必须类型和张数完全相同,且出主牌者手中已无该副牌花色)。
  • 非主牌无法压主牌;不同花色的副牌之间无法互相压牌。
  • 同花色、同类型组合比点数大小,大者赢。

甩牌怎么赢(只有一人杀牌)

同花色跟牌无法压过合法的甩牌。当某玩家手中已无该副牌花色时,可以用主牌“杀(毙)”掉甩牌。

  • 纯单张甩牌(甩牌里没有对子、没有拖拉机):任意同张数的主牌都能杀,主牌直接赢,不再与副牌比大小。
  • 含对子/拖拉机的甩牌:用来杀牌的主牌必须与甩牌结构相同才能杀。结构相同时该主牌直接赢,不再与副牌比大小。

多人都"杀"时谁赢(有多人杀牌)

当多名玩家同时缺门,且都用主牌杀同一墩甩牌时,杀牌者之间严格比大小。

  • 纯单张甩牌:比各自最大的单张,大者赢;若相同比下一张,以此类推。(例如:领 ♦3 ♦4,A 杀 ♥3 ♥6,B 杀 ♥4 ♥4,最大单张 ♥6 > ♥4A 赢——对子 ♥4♥4 不升级。)
  • 含对子/拖拉机的甩牌:所有杀牌者结构都与甩牌相同,按以下顺序逐层比大小,第一个分出胜负的层级决定结果:
    1. 先比拖拉机:各自最大的拖拉机比大小,大的赢;若相同比下一个拖拉机,以此类推。
    2. 再比对子:各自最大的对子比大小,大的赢;若相同比下一个对子,以此类推。
    3. 最后比单张:各自最大的单张比大小,大的赢;若相同比下一张,以此类推。
  • 绝对相同:若点数结构完全相同,则先出牌(先杀)的人赢

四、跑分与抠底结算及升级规则

  • 结算标准(以 80分 为基准上台线):
    • 抓 0 分:庄家升 3 级。
    • 抓 40 分以下:庄家升 2 级。
    • 抓 40 分 到 75 分:庄家升 1 级。
    • 抓 80 - 115 分:闲家上台(换闲家当庄家)。
    • 抓 120 - 155 分:闲家上台且升 1 级。
    • 抓 160 - 195 分:闲家上台且升 2 级(之后每多 40 分多升 1 级)。
  • 抠底(底牌分数翻倍):最后一轮如果是闲家获胜,底牌中的分数计入闲家,并根据最后一轮获胜的牌型翻倍:
    • 单张抠底:底牌分 × 2
    • 对子抠底:底牌分 × 4
    • 拖拉机(连对)抠底:底牌分 × 8

五、一些打双升的技巧

双升基本记牌 - FastSnow(快雪)提供

  • 如果要想你和对家都能快乐,你最好锻炼一下记牌:
    • 常主: 4 张猫, 8 张常主
    • 打NT(无将)的时候,最重要,你如果能记得,出了几张主,还剩几张,你就会打的轻松些。 如果能记得大小猫最好。
    • 如果不是NT, 8 张常主记不清,也要把大小猫记一下。
    • 副牌 的 AAKK, 三门副牌的AAKK, 出了没有,还有哪几张没出。 都不要求你们记:Q,J,10
  • 台面上的分数:每门KK,1010, 55. :如果一门副牌的分数没有了,就可以选择不去杀,经常会看见两个人为了一门没有分数的副牌拼杀。
    • 这个不容易,但是至少可以大概记一下。
    • 你自己有长套的那一门副牌的张数。一门副牌24张,要数一下你长套那门的张数,出过几张,外面还有几张,什么时候可以甩牌。 这个可能有难度,但是习惯了就好了。
  • 平时喜欢跟机器人玩儿的时候,可以练一下。

信号牌的约定 - FastSnow(快雪)提供

  • 如果一方出A , 对家一方如果有同门花色的A, 对家可以出 9, J, Q 表示自己有A,有的时候大家也用 8 做信号。
    • 例子1: 庄出副牌 梅花 A, 如果帮庄有另一张梅花A,帮庄可以给9,J, Q 表示自己有另一张 A
    • 例子2:台面上出过一张梅花A, 庄有AK, 庄会先出一张K,看看对家有没有另一张K
    • 例子3: 庄AAK, 庄会先出一张K,看对家有没有另一张K
  • 虽然看似作弊,但是如果大家都知道信号牌,牌就算是打明了。
  • 信号牌也有弊端, 比如你没有A,但是手里只有9, J,Q, 会误导对家; 或者你有A,但是没有信号牌。 享受“作弊”的福利同时,也要 take the risk
  • 这个约定是打双升的牌手固定常用的约定,在联众,QQ 还有西村的平台,这是最基本的打法。
  • 把约定贴出来,给大家参考,这样跟会打的人打的时候,也不会太吃亏。

六、附录 - 术语对照表

牌的种类

| 中文 | English |
|------|---------|
| 主牌 | Trump cards |
| 副牌 | Non-trump / Side-suit cards |
| 级牌 | Level card (current rank card) |
| 主花色级牌 | Trump-suit level card |
| 非主花色级牌 | Off-suit level card |
| 大王 | Big Joker |
| 小王 | Small Joker |
| 花色 | Suit |
| 手牌 | Hand (cards in hand) |
| 底牌 | Kitty / Buried cards |
| 分数牌 | Point cards (5, 10, K) |

花色

| 中文 | English |
|------|---------|
| 黑桃♠ | Spades ♠ |
| 红心♥ | Hearts ♥ |
| 梅花♣ | Clubs ♣ |
| 方块♦ | Diamonds ♦ |
| 无主 / 无将 | No-trump |

出牌组合

| 中文 | English |
|------|---------|
| 单张 | Single |
| 对子 | Pair |
| 拖拉机 / 连对 | Tractor (consecutive pairs of same suit) |
| 甩牌 | Throw (multi-component lead)/Flop |
| 牌型 | Card combination / Play type |

游戏动作

| 中文 | English |
|------|---------|
| 亮主 | Declare trump |
| 反主 | Counter-declare / Override trump |
| 定主 | Lock / Finalize trump declaration |
| 领牌 | Lead a trick |
| 跟牌 | Follow suit |
| 出牌 | Play cards |
| 压牌 | Beat / Cover |
| 杀牌 / 毙牌 | Over-trump / Kill a trick |
| 垫牌 | Sluff |
| 扣底 / 抠底 | Scoop the kitty |
| 埋牌 | Bury cards (into kitty) |
| 缺门 | Void (no cards in a suit) |

比赛结构

| 中文 | English |
|------|---------|
| 一墩 / 一轮 | One trick |
| 最后一轮 | Final trick |
| 上把 | Previous trick |

计分与升级

| 中文 | English |
|------|---------|
| 分数 / 分 | Points / Score |
| 底牌分数翻倍 | Kitty multiplier bonus |
| 单张抠底 | Single-card kitty scoop (×2) |
| 对子抠底 | Pair kitty scoop (×4) |
| 拖拉机抠底 | Tractor kitty scoop (×8) |
| 升级 | Level up / Advance a level |
| 升 X 级 | Rise X levels |
| 当前级 / 打几 | Current level (the rank being played) |
| 上台 | Win the round (attackers take the bank) |
| 守住 | Hold / Defend successfully |

亮主类型

| 中文 | English |
|------|---------|
| 单张亮主 | Single-card declaration |
| 对子反主 / 定主 | Pair override / lock |
| 对王反主 | Joker-pair override |
| 增强对王反主 | Enhanced joker override |

策略术语

| 中文 | English |
|------|---------|
| 记牌 | Card counting |
| 信号牌 | Signal card (conventional signal) |
| 长套 | Long suit |
| 拆牌 | Break up a combination |
| 制造虚门 | Create a void |
| 常主 | Regular trumps (non-joker trump suit cards) |
| 打 NT / 打无将 | Play no-trump |

下表按规则分类列出验证用例(输入 → 期望 → 实际)。可逐条对照「游戏规则」手动核对引擎行为;全部通过表示引擎符合规则。

牌型识别 25/25

用例输入期望实际结果
同点同花色两张 = 对子♠Q ♠Q(打2,主♥)对子对子通过
不同花色不能配对♠Q ♥Q非法非法通过
连对跳过级牌 = 拖拉机♠4♠4 ♠6♠6(打5)拖拉机拖拉机通过
小王对+大王对 = 主牌拖拉机小王 小王 大王 大王(无主)拖拉机拖拉机通过
♠2♠2+小王对 = 拖拉机(无主)♠2 ♠2 小王 小王(无主打2)拖拉机拖拉机通过
单+对混合 = 甩牌♠A ♠Q ♠J ♠J甩牌甩牌通过
无主级牌组合(同点不同花色)♠2♠2 ♥2♥2 ♦2 ♣2(无主打2)甩牌:2对+2单甩牌:2对+2单通过
打♠2: ♠2♠2+小王小王 = 拖拉机♠2♠2 小王小王(打♠2)拖拉机拖拉机通过
打♠2: ♠2♠2+小王小王+大王大王 = 拖拉机♠2♠2 小王小王 大王大王(打♠2)拖拉机拖拉机通过
打♠2: ♦2♦2+♠2♠2 = 拖拉机♦2♦2 ♠2♠2(打♠2)拖拉机拖拉机通过
打♠2: ♠A♠A+♦2♦2 = 拖拉机♠A♠A ♦2♦2(打♠2)拖拉机拖拉机通过
打♠2: ♦2♦2+小王小王 不是拖拉机♦2♦2 小王小王(打♠2)非拖拉机甩牌通过
打♠2: ♠A♠A+♠2♠2 不是拖拉机♠A♠A ♠2♠2(打♠2)非拖拉机甩牌通过
打♥3: ♥3♥3+小王小王 = 拖拉机♥3♥3 小王小王(打♥3)拖拉机拖拉机通过
打♥3: ♣3♣3+♥3♥3 = 拖拉机♣3♣3 ♥3♥3(打♥3)拖拉机拖拉机通过
打♥3: ♥A♥A+♣3♣3 = 拖拉机♥A♥A ♣3♣3(打♥3)拖拉机拖拉机通过
打♥3: ♣3♣3+小王小王 不是拖拉机♣3♣3 小王小王(打♥3)非拖拉机甩牌通过
打♥3: ♥A♥A+♥3♥3 不是拖拉机♥A♥A ♥3♥3(打♥3)非拖拉机甩牌通过
打♣A: ♣A♣A+小王小王 = 拖拉机♣A♣A 小王小王(打♣A)拖拉机拖拉机通过
打♣A: ♠A♠A+♣A♣A = 拖拉机♠A♠A ♣A♣A(打♣A)拖拉机拖拉机通过
打♣A: ♣K♣K+♠A♠A = 拖拉机♣K♣K ♠A♠A(打♣A)拖拉机拖拉机通过
打♣A: ♠A♠A+小王小王 不是拖拉机♠A♠A 小王小王(打♣A)非拖拉机甩牌通过
打♣A: ♣K♣K+♣A♣A 不是拖拉机♣K♣K ♣A♣A(打♣A)非拖拉机甩牌通过
打♠2: ♥2+♣2(不同花色级牌)= 甩牌2单♥2 ♣2(打♠2,主♠)甩牌:0对+2单甩牌:0对+2单通过
打♥J: ♣J+♦J+♥A♥A 不是拖拉机♣J ♦J ♥A ♥A(打♥J,主♥)非拖拉机甩牌通过

亮主规则 4/4

用例输入期望实际结果
单张大王不能亮无主手牌有一张大王和一对小王,尝试单独亮大王拒绝亮主:王必须成对才能亮无主已拒绝(null)通过
小王对可以独立亮无主同一手牌,亮出两张小王接受亮主:小王对亮无主已接受:无主(小王对)通过
单张小王不能亮无主尝试单独亮一张小王拒绝亮主:王必须成对才能亮无主已拒绝(null)通过
已有单张亮主后不能用另一张单牌反主已有玩家用单张级牌亮主,尝试用单张大王反主拒绝反主:必须使用更高等级的对子已拒绝(null)通过

甩牌合法性与是否可出 5/5

用例输入期望实际结果
甩牌被对手单张压住甩 ♠K ♠Q ♠Q;对手有 ♠A合法甩牌;不可出合法甩牌;不可出通过
甩牌各分量最大甩 ♠A ♠Q ♠Q;对手只有 ♠K合法甩牌;可出合法甩牌;可出通过
主牌甩牌(♥2+♣2)对手持♦2甩 ♥2 ♣2(主♠);对手有 ♦2合法甩牌;可出合法甩牌;可出通过
主牌甩牌(♥2+♣2)对手持♠2甩 ♥2 ♣2(主♠);对手有 ♠2(主花色级牌)合法甩牌;不可出合法甩牌;不可出通过
主牌甩牌(♥2+♣2)对手持小王甩 ♥2 ♣2(主♠);对手有小王合法甩牌;不可出合法甩牌;不可出通过

跟牌规则 16/16

用例输入期望实际结果
跟单张:有同花色必须跟领 ♣7;手牌 ♣K ♦4 ♣3出 1 张梅花出 ♣K通过
跟对子:有对子必须出对子领 ♣9♣9;手牌 ♣Q ♣Q ♣10 ♣5出一个对子出 ♣Q ♣Q通过
跟拖拉机:有对子必须出对子领 ♣8♣8♣9♣9;手牌 ♣K ♣K ♦7 ♣6 ♣5 ♣4 ♣3含 ♣K♣K 对子出 ♣K ♣K ♣3 ♣4通过
跟甩牌:用尽主牌、不漏副牌领 ♣8♣8♣9♣9♣A(主♣);手牌 ♣K ♣K ♣7 ♣6 ♣5 ♣4 ♦35 张全主牌且含 ♣K♣K出 ♣K ♣K ♣4 ♣5 ♣6通过
跟牌张数必须相同领 4 张,只跟 2 张非法非法通过
跟主拖拉机:异色级牌不计入可用对子(出♥Q♥10♥10♥9)领♥A♥A♥K♥K;手含♦8♠8;出♥Q♥10♥10♥9合法合法通过
跟主拖拉机:异色级牌不计入可用对子(出♥10♥10♥9♥5)领♥A♥A♥K♥K;手含♦8♠8;出♥10♥10♥9♥5合法合法通过
跟对子:同花色不够张,垫副牌合法领♣9♣9;手含♣5♦3♦4;出♣5♦3合法合法通过
跟对子:同花色不够张,跳过同花色非法领♣9♣9;手含♣5♦3♦4;出♦3♦4(跳过♣5)非法非法通过
自动跟牌提示:有唯一对子自动选择该对子领♣K♣K;手含♣10♣10♣5♣7[♣10,♣10]♣10 ♣10通过
自动跟牌提示:同花色不够张时自动选择全部同花色领♣8♣8♣9♣9;手含♣5♣10♦3♦4[♣5,♣10]♣10 ♣5通过
自动跟牌提示:无同花色时不自动选择领♣K♣K;手无梅花通过
自动跟牌提示:有多个对子可自由选择时不自动选择领♣K♣K;手含♣10♣10♣7♣7♣5(两个对子)通过
跟对子:出♣J♦J伪对子时有♥A♥A真对子必须拒绝领♥K♥K(主♥打J);手含♣J♦J♥A♥A;出♣J♦J非法非法通过
跟对子:出♥A♥A真对子合法领♥K♥K(主♥打J);手含♣J♦J♥A♥A;出♥A♥A合法合法通过
跟甩牌:拖拉机内的对子仍算可用对子领♠A♠K♠10♠A♠10(2对+1单);手含♠4♠4♠5♠5拖拉机+♠8♠8+♠9♠3;出♠4♠4♠5♠5♠3合法合法通过

比牌与杀牌 23/23

用例输入期望实际结果
主牌压副牌♥3♥3(主) vs ♠9♠9(副)主胜主胜通过
副牌不能压主牌♠9♠9(副) vs ♥3♥3(主)不能压不能压通过
同花色对子比点数♠A♠A vs ♠K♠KA 胜A 胜通过
甩牌逐分量比大小♠A+♠QQ vs ♠K+♠JJ高者胜高者胜通过
甩牌:对子优先于单张♠QQ+♠3 vs ♠JJ+♠A对子大者(♠QQ)胜♠QQ 方胜通过
甩牌:对子相同比单张♠KK+♠A vs ♠KK+♠Q单张大者(♠A)胜♠A 方胜通过
甩牌:拖拉机优先于单张♠9♠9♠10♠10+♠3 vs ♠7♠7♠8♠8+♠A拖拉机大者胜高拖拉机方胜通过
甩牌:拖拉机相同比对子9-10拖拉机+♠KK vs 9-10拖拉机+♠QQ对子大者(♠KK)胜♠KK 方胜通过
级牌主牌杀副牌甩牌♠2♠2 ♥2♥2 ♦2 ♣2 杀 ♦4♦4 ♦K♦K ♦9 ♦J(无主打2)主牌杀牌成功杀牌成功通过
主牌杀纯单张甩牌♥3♥6 / ♥4♥4 杀 ♦3♦4(纯单张甩牌)都能杀♥3♥6 杀/♥4♥4 杀通过
多人杀单张甩牌比最大单张♥3♥6 vs ♥4♥4(领 ♦3♦4)♥6 最大 → ♥3♥6 胜(对子不占优)♥3♥6 胜/♥4♥4 不胜通过
单张甩牌:最大单张相同先出方不被压♣4+♥3先 vs ♠4♦4后(领♦9♣8,打4主♥)最大同为副4,先出方胜先方杀牌成功/后方不能压通过
拖拉机覆盖两对子形状可杀♥拖拉机 / ♥两对子 杀 ♦3♦3♦9♦9两者均可杀(拖拉机形状覆盖对子)拖拉机杀/两对子杀通过
领牌有拖拉机时拖拉机跟牌胜两对子领♦3♦3♦4♦4♦K:♦5♦5♦6♦6♦J 胜 ♦3♦3♦9♦9♦K;♦7♦7♦9♦9♦A 无法杀拖拉机领牌拖拉机跟牌优于独立对子拖拉机胜/两对子不能杀通过
同花色高对子不能反杀拖拉机♦7♦7♦9♦9♦A 杀 ♦5♦5♦6♦6♦J(拖拉机)不能杀(对子不满足拖拉机要求)不能杀通过
领牌无拖拉机时拖拉机按点数比独立对子主♦打2;领♥7♥7♥9♥9♥K:B出♦6♦6♦7♦7♦9(♦7♦7最大对)胜 A出♦3♦3♦5♦5♦7(♦5♦5最大对)♦7♦7 > ♦5♦5,B胜(拖拉机对子按点数参与比较,不享结构优势)B(♦6♦6♦7♦7♦9)胜/A(♦3♦3♦5♦5♦7)不胜通过
领牌无拖拉机:高对子后杀胜低拖拉机先杀主♦打2;领♥7♥7♥9♥9♥K:B出♦6♦6♦7♦7♦9先杀,C出♦3♦3♦8♦8♦10后杀♦8♦8 > ♦7♦7,C(♦3♦3♦8♦8♦10)胜(领牌无拖拉机,按最高对子比大小)C(♦3♦3♦8♦8♦10)胜/B(♦6♦6♦7♦7♦9)不胜通过
较多对子(拖拉机)覆盖较少对子+单♦8♦8♦9♦9♦K 杀 ♦4♦4♦3♦5♦7两对子覆盖一对子+三单,可杀可杀通过
同结构拖拉机按点数比大小♦5♦5♦6♦6♦J vs ♦3♦3♦4♦4♦K高拖拉机(5-6)胜,低拖拉机(3-4)不胜高胜/低不胜通过
结构不符不能杀对子♥3♥6(两单张)杀 ♦Q♦Q(对子)不能杀不能杀通过
两种出牌顺序结果一致(♥3♥6 胜)领 ♦3♦4,A 出 ♥3♥6,B 出 ♥4♥4两序皆 A 胜序1:A:♥3♥6 / 序2:A:♥3♥6通过
实测案例:♣J♦J♥A♥A不是拖拉机(打♥J主♥)D出♣J♦J♥A♥A(打♥J主♥)非拖拉机甩牌通过
实测案例:♣J♦J♥A♥A压不过♥6♥6♥7♥7拖拉机C领♥6♥6♥7♥7拖拉机,D出♣J♦J♥A♥AD不赢D不赢通过

机器人跟牌合规 10/10

用例输入期望实际结果
不同花色级牌不是拖拉机主♣打A:♣K♣K + ♠A ♥A不是拖拉机不是拖拉机通过
主牌拖拉机主♣:♣9♣9 ♣10♣10识别为拖拉机识别为拖拉机通过
机器人跟拖拉机出牌合法领 ♣8♣8♣9♣9;机器人手牌 ♣K ♣K ♦7 ♣6 ♣5 ♣4 ♣3合法跟牌合法通过
机器人跟甩牌出牌合法领 ♣8♣8♣9♣9♣A(主♣);机器人手牌 ♣K ♣K ♣7 ♣6 ♣5 ♣4 ♦3合法跟牌合法通过
缺门垫主牌:垫最小、保留级牌主♣打2,对手领 ♦Q♦Q;机器人手牌 ♣3 ♣4 ♦2 ♣2垫 ♣3 ♣4(保留 ♦2 ♣2)出 ♣3 ♣4通过
缺门垫主牌:保留王无主打2,对手领 ♦Q♦Q;机器人手牌 小王 ♦2 ♣2垫 ♦2 ♣2(保留小王)出 ♦2 ♣2通过
喂伙伴单张:无分出最小伙伴 d 领 ♣7 领先;机器人手牌 ♣A ♣3出 ♣3(保留 ♣A)出 ♣3通过
喂伙伴对子:无分出最小对子伙伴 d 领 ♣7♣7 领先;机器人手牌 ♣3♣3 ♣A♣A出 ♣3♣3(保留 ♣A♣A)出 ♣3 ♣3通过
喂伙伴:有分必喂分伙伴 d 领 ♣7♣7 领先;机器人手牌 ♣A ♣Q ♣5出含 ♣5(喂分)出 ♣5 ♣Q通过
实测案例:对子墩缺门无主牌对子,垫非主非分牌主♦打6,D领♠K♠K;C缺♠持♠6♦6♦K♥A♥Q♥J♣A♣K♣J♣10(无主牌对子)垫非主非分牌(如♥J♣J),不出♦K或♠6出 ♣J ♣A通过

机器人v2跟牌合规 6/6

用例输入期望实际结果
跟单张:有同花色必须跟领 ♣7;手牌 ♣K ♦4 ♣3出 1 张梅花出 ♣3通过
跟对子:有对子必须出对子领 ♣9♣9;手牌 ♣Q ♣Q ♣10 ♣5出一个对子出 ♣Q ♣Q通过
跟拖拉机:有对子必须出对子领 ♣8♣8♣9♣9;手牌 ♣K ♣K ♦7 ♣6 ♣5 ♣4 ♣3含 ♣K♣K 对子出 ♣K ♣K ♣3 ♣4通过
跟甩牌:用尽主牌、不漏副牌领 ♣8♣8♣9♣9♣A(主♣);手牌 ♣K ♣K ♣7 ♣6 ♣5 ♣4 ♦35 张全主牌且含 ♣K♣K出 ♣K ♣K ♣4 ♣5 ♣6通过
机器人跟拖拉机出牌合法领 ♣8♣8♣9♣9;机器人手牌 ♣K ♣K ♦7 ♣6 ♣5 ♣4 ♣3合法跟牌合法通过
机器人跟甩牌出牌合法领 ♣8♣8♣9♣9♣A(主♣);机器人手牌 ♣K ♣K ♣7 ♣6 ♣5 ♣4 ♦3合法跟牌合法通过

机器人v2策略优化 26/26

用例输入期望实际结果
v2中间位主动封分:使用大于K的主牌对手首出无分副牌;中间位有副牌可垫,同时持主3、主J、主A出主A(大于主K的最小可用主牌)实际出牌:♥A通过
v2主K全出后主动封分:改用大于10的主牌同一局面,但两张主K此前均已明出出主J(大于主10的最小可用主牌)实际出牌:♥J通过
v2没有大于K的主牌时从最短副牌门垫牌中间位持主Q、单张黑桃4、两张方块,无主牌可以越过主K垫唯一的黑桃4,争取造成黑桃缺门实际出牌:♠4通过
v2没有主牌时从最短副牌门垫牌中间位没有主牌,仅有单张黑桃4和两张方块垫唯一的黑桃4,争取造成黑桃缺门实际出牌:♠4通过
v2同门未见分超过20且留有主牌时可用10分制造缺门中间位无大于K的主牌;黑桃仅剩一张K,手外仍有30分黑桃未见垫黑桃K立即绝黑桃,准备以后用保留的主Q将吃该门实际出牌:♠K通过
v2制造缺门超过10分时仍优先保分中间位无合格主牌;绝黑桃必须垫一对K,共损失20分保留黑桃K对,改垫无分的方块6和7实际出牌:♦6 ♦7通过
v2同门未见分超过20且留有主牌时可用5分制造缺门中间位无大于K的主牌;黑桃仅剩一张5,手外仍有30分黑桃未见垫黑桃5立即绝黑桃,准备以后用保留的主Q将吃该门实际出牌:♠5通过
v2没有主牌时不为未来将吃而花分绝门黑桃仅剩一张5且手外黑桃未见分超过20,但手中已经没有主牌保留黑桃5,改垫无分的方块6实际出牌:♦6通过
v2同门未见分只有20时仍优先保分同一手牌,但两张黑桃10和另一张黑桃5已经明出,手外恰好只剩20分黑桃未见保留黑桃5,改垫无分的方块6实际出牌:♦6通过
v2只有分牌可垫时先垫低分牌中间位无大于K的主牌;副牌为单张黑桃K、方块5和方块10保留10分的黑桃K,先垫5分的方块5实际出牌:♦5通过
v2末家在零分牌墩按10/K/5顺序用主牌收分末家缺门,持主10、主K、主5、主3和副牌6先用主10毙牌,不用主K或主5实际出牌:♥10通过
v2安全毙有分牌墩时即使打10也优先用主10末家可安全毙有分牌墩;当前打10,持主10、主K和主5仍先用主10,不因主10是级牌而改用主K或主5实际出牌:♥10通过
v2末家无盖杀风险时不浪费大主末家仅持主3、主J、主A,后面已无对手可以盖杀出最小的主3实际出牌:♥3通过
缺门垫主牌:垫最小、保留级牌主♣打2,对手领 ♦Q♦Q;机器人手牌 ♣3 ♣4 ♦2 ♣2垫 ♣3 ♣4(保留 ♦2 ♣2)出 ♣3 ♣4通过
缺门垫主牌:保留王无主打2,对手领 ♦Q♦Q;机器人手牌 小王 ♦2 ♣2垫 ♦2 ♣2(保留小王)出 ♦2 ♣2通过
喂伙伴单张:无分出最小伙伴 d 领 ♣7 领先;机器人手牌 ♣A ♣3出 ♣3(保留 ♣A)出 ♣3通过
喂伙伴对子:无分出最小对子伙伴 d 领 ♣7♣7 领先;机器人手牌 ♣3♣3 ♣A♣A出 ♣3♣3(保留 ♣A♣A)出 ♣3 ♣3通过
喂伙伴:有分必喂分伙伴 d 出♣K领先,机器人 b 最后一家;手牌 ♣A ♣Q ♣5出含 ♣5(喂分)出 ♣5通过
实测案例:对子墩缺门无主牌对子,垫非主非分牌主♦打6,D领♠K♠K;C缺♠持♠6♦6♦K♥A♥Q♥J♣A♣K♣J♣10(无主牌对子)垫非主非分牌(如♥J♣J),不出♦K或♠6出 ♣J ♥J通过
散主不能杀两对甩牌无主打4:A领♥10♥10+♥5♥5;B有小王和三张散4,但无主牌对子垫副牌,不浪费散主出 ♣2 ♣3 ♠6 ♠7通过
最后一家0分缺门时保留主牌主♠打2:C领♥7,B最后一家且缺红桃,手里有黑桃主牌;本墩0分垫副牌,不上主出 ♣4通过
同花色争胜必须压过当前赢家主♠打2:A领♥5对,B出♥K对领先;C有♥3对和♥A对出♥A对,而不是便宜但输掉的♥3对出 ♥A ♥A通过
实测回归:安全对子不因另一张更大单张未知而拆开甩牌无主打3:庄家a领牌,仅持 ♣A♣K♣K(另一张♣A未知,在对手手中)甩出 ♣A♣K♣K 三张 — ♣K♣K本身已无敌,不必等另一张♣A出现出 ♣A ♣K ♣K通过
甩牌中孤张仍需更大点数两张都全部确认,对子只需一张无主打3:庄家a持 ♣A♣K♣K♣Q♣J♣J(另一张♣A未知,在对手手中)出 ♣A♣K♣K♣J♣J 五张 — 跳过孤张♣Q:它作为单张会被未知的那张♣A直接压过,而K/J对子只需更大点数各有一张确认(已在手)即可出 ♣A ♣K ♣K ♣J ♣J通过
另一张更大单张(♣A)已出现后,孤张解禁加入甩牌同上,但另一张♣A此前已被打出出 ♣A♣K♣K♣Q♣J♣J 六张 — ♣Q现在也安全了出 ♣A ♣K ♣K ♣Q ♣J ♣J通过
领牌♠A♠A♠K♠Q♠Q → 甩出全部5张黑桃手含♠A♠A♠K♠Q♠Q+♥3♦4;底牌有梅花出5张♠(甩牌)出 ♠A ♠A ♠K ♠Q ♠Q通过

机器人v2记牌 3/3

用例输入期望实际结果
对手示缺红桃又缺主时安全喂分主♠打2:C领♥K(两张♥A未见),A缺红桃;历史中B先垫♣4(缺红桃)又垫♦4(缺主)喂♦10 — B既不能跟牌也不能杀出 ♦10通过
对手示缺红桃可能有主时不喂分主♠打2:C领♥A(最大),A缺红桃;历史中B垫♣4示缺红桃,主牌未示缺垫♣3不喂分 — B确定缺门,可能用主牌杀出 ♣3通过
后手对手示缺主时带分将吃主♠打2:D领♥10,A缺红桃(有♠3和♠10);后手对手B历史中垫♦4示缺主用♠10将吃入账10分,而不是最小主♠3出 ♠10通过

机器人v2埋牌 10/10

用例输入期望实际结果
v2弱无主不埋分3张主且副牌有足够非分牌埋8张且0分张数=8,底分=0通过
v2强主绝短门并保长副强红桃主,黑桃3张,方片长套带A黑桃全埋且方片不埋埋黑桃=3,埋方片=0通过
v2强主可将副牌分对下底强红桃主,短门含黑桃对10对10一起下底对10已下底通过
v2埋牌保护可一把甩完的AKK强红桃主,短黑桃为A+KKA和对K全部保留AKK均保留通过
v2识别可控短门大牌结构打2:A、AA、AKK、AAKKQ四种均识别为可安全甩完全部识别通过
v2领牌时甩出保留的绝门大牌获得出牌权,手中短黑桃仅A+KK甩黑桃AKK并绝门实际=♠K ♠A ♠K通过
v2非首轮领牌同样优先整门甩绝第6墩重新获得出牌权,短黑桃仅A+KK仍优先甩黑桃AKK实际=♠K ♠A ♠K通过
v2多对子花色保留单张保护梅花含两个以上非A对子若仍留对子则同时留单张留对子=否,留单张=是通过
v2埋牌确定且合法同一33张手牌调用两次结果相同且剩余25张相同=是,剩余=25通过
v2边家大王无主可埋未暴露级牌积分局,边家大王无主,三门副牌有控制至少埋1张未暴露级牌埋级牌=2通过

机器人v2反主门槛 19/19

用例输入期望实际结果
v1反主门槛-已知缺陷保留(仅v1,不修)2张级牌+1张真实草花,对手单张亮主黑桃v1按旧行为仍反主反主为♣2花色通过
v2反主门槛-拒绝弱反主(本次修复的bug)2张级牌+1张真实草花,对手单张亮主黑桃,非首局v2拒绝反主(null)null通过
v2反主-真实强反主仍生效2张级牌+8张真实草花,对手单张亮主黑桃v2以草花反主{"cards":[103,51],"trump_suit":3,"declare_type":2,"score":20,"raw_strength":10}通过
v2反主-对手照抢(差距4,非首局)草花强度8 vs 当前黑桃强度4,declareSeat=对手b,非首局v2反主{"cards":[103,51],"trump_suit":3,"declare_type":2,"score":18,"raw_strength":8}通过
v2反主-队友让步(差距4,非首局)草花强度8 vs 当前黑桃强度4,declareSeat=队友c,非首局v2不反主(null)null通过
v2反主-首局对手更激进(同差距4手牌,首局)同上手牌,declareSeat=对手b,首局(庄家未定)v2反主(无需差距){"cards":[103,51],"trump_suit":3,"declare_type":2,"score":18,"raw_strength":8}通过
v2反主-首局不放宽对队友的让步同上手牌,declareSeat=队友c,首局v2仍不反主(null)null通过
v2反主-同花色追加维持宽松(对手)当前黑桃单张,机器人凑成黑桃对(仅1张真实黑桃支撑),declareSeat=对手bv2直接追加{"cards":[101,49],"trump_suit":1,"declare_type":2,"score":13,"raw_strength":3}通过
v2反主-同花色追加维持宽松(队友)同上,declareSeat=队友cv2直接追加{"cards":[101,49],"trump_suit":1,"declare_type":2,"score":13,"raw_strength":3}通过
v2无主反主-对手照抢(首局,现主门薄弱)大王对,现黑桃门强度4(<半),declareSeat=对手b,首局v2以无主反主{"cards":[108,106],"trump_suit":5,"declare_type":4,"score":100}通过
v2无主反主-对手照抢(非首局,现主门薄弱<1/4)大王对,现黑桃门强度4(<1/4),declareSeat=对手b,非首局v2以无主反主{"cards":[108,106],"trump_suit":5,"declare_type":4,"score":100}通过
v2无主反主-队友让步(无主门槛不足6)大王对,级牌+大王共4张(不足6),declareSeat=队友cv2不反主(null)null通过
v2无主反主-首局对手不抢(现主门槛已过半)大王对,现黑桃门强度17(>=半),declareSeat=对手b,首局v2不反主(null)(自身黑桃已足够强)null通过
v2无主反主-非首局对手照抢(无主门槛足够高>5)大王对,级牌共6张+大王2张=8(>5),declareSeat=对手b,非首局v2以无主反主{"cards":[108,106],"trump_suit":5,"declare_type":4,"score":100}通过
v2无主反主-队友让步阈值放行(无主门槛>6)同上手牌,declareSeat=队友cv2以无主反主{"cards":[108,106],"trump_suit":5,"declare_type":4,"score":100}通过
v2无主反主-大王对并非总能反主(首局,1/4<=现主门<半)大王对,现黑桃门强度13(1/4~半之间),declareSeat=对手b,首局v2不反主(null)null通过
v2无主反主-大王对并非总能反主(非首局,两条件都不满足)大王对,现黑桃门强度13(不足<1/4)且无主门槛4(不足>5),declareSeat=对手bv2不反主(null)null通过
v2无主反主-大王对并非总能反主(队友,无主门槛不足6)同上手牌,declareSeat=队友cv2不反主(null)null通过
v2反主-首次亮主对子不受影响currentType=0,天然方块级牌对子,其余支撑薄弱v2直接亮主{"cards":[104,52],"trump_suit":4,"declare_type":2,"score":12,"raw_strength":2}通过

抠底倍率 10/10

用例输入期望实际结果
单张抠底 → ×2领 ♠A(单张)单张×2单张×2通过
对子抠底 → ×4领 ♠K♠K(对子)对子×4对子×4通过
拖拉机抠底 → ×8领 ♠Q♠Q♠K♠K(拖拉机)拖拉机×8拖拉机×8通过
甩牌(纯单张)→ ×2领 ♠A ♠Q(甩牌,纯单张)单张×2单张×2通过
甩牌(对子+单张)→ ×4领 ♠J♠J ♠A(甩牌,对子+单张)对子×4对子×4通过
甩牌(两独立对子+单张,无拖拉机)→ ×4领 ♠3♠3 ♠9♠9 ♠A(两独立对子,无拖拉机)对子×4对子×4通过
甩牌(拖拉机+单张)→ ×8领 ♠Q♠Q♠K♠K ♠A(甩牌,拖拉机+单张)拖拉机×8拖拉机×8通过
甩牌(拖拉机+独立对子+单张)→ ×8领 ♠8♠8♠9♠9 ♠J♠J ♠A(拖拉机+独立对子+单张)拖拉机×8拖拉机×8通过
底牌分值计算(5+10+K)底牌 ♠5+♠10+♠K25分25分通过
底牌分×倍率计算25分 × 单/对/拖拉机倍率50 / 100 / 20050 / 100 / 200通过

不可跳过级别 4/4

用例输入期望实际结果
庄家级=9,不可跳过10,J庄家打9,闲家得10分(庄家升2级)下局打10下局打10通过
庄家级=10,不可跳过10,J庄家打10,闲家得0分(庄家升3级)下局打J下局打J通过
闲家级=9,不可跳过10,J闲家打9,闲家得200分(闲家升3级)下局闲家打10下局闲家打10通过
闲家级=10,不可跳过10,J闲家打10,闲家得200分(闲家升3级)下局闲家仍打10下局闲家打10通过

机器人领牌 6/6

用例输入期望实际结果
自持♠A♠A → 无敌对子(主♥打2)♠A♠A均在手中truetrue通过
一张♠A已出,♠K♠K → 无敌对子(主♥打2)♠A已出一张truetrue通过
♠A均未知,♠K♠K → 非无敌对子(主♥打2)♠A两张均未知falsefalse通过
领牌:♠A♠A♠K♠Q♠Q → 甩出全部5张黑桃手含♠A♠A♠K♠Q♠Q+♥3♦4;底牌有梅花出5张♠(甩牌)出 ♠A ♠A ♠K ♠Q ♠Q通过
领牌:♠A♠A(仅2张♠)→ 出对子非甩牌手仅含♠A♠A+♥3♦4出♠A♠A对子出 ♠A ♠A通过
领牌:♠A已知一张,♠K♠K成无敌对子 → 优先出手含♠K♠K+♥3♦4;底牌有♠A(一张♠A已知)出♠K♠K对子出 ♠K ♠K通过

选择主花色与级牌,在「领牌」与「跟牌」两组牌面中分别点牌加入(同一张最多两副),再点「检查」查看引擎判定(领牌牌型、必须跟的牌、合法跟牌示例、能否压过领牌)。

领牌 0

跟牌 0

(尚未检查)