规则条目 · 可对照分支说明

指南类:把算法拆成番型——九江麻将算法列表整理思路

很多人做麻将规则整理,习惯从「听牌」开始推,结果越推越乱。 换个角度会轻松得多:先把番型表拆开,让它变成一组可以独立判断的小条件,再把胡牌判定接上去。九江麻将算法列表这类整理工作,本质上做的就是这件事——番型是算法的出口,出口没定义清楚,里面的判定树怎么长都别扭。 为什么先拆番型,而不是先写判定 胡牌判定回答的是「这手牌成不成」,番型回答的是「成了值多少」。

所属分支 玩法拆解
条目编号 3
收录时间 2026-11-15 20:08:29
校验状态 已复核 · 待牌桌验证

很多人做麻将规则整理,习惯从「听牌」开始推,结果越推越乱。

换个角度会轻松得多:先把番型表拆开,让它变成一组可以独立判断的小条件,再把胡牌判定接上去。九江麻将算法列表这类整理工作,本质上做的就是这件事——番型是算法的出口,出口没定义清楚,里面的判定树怎么长都别扭。

为什么先拆番型,而不是先写判定

胡牌判定回答的是「这手牌成不成」,番型回答的是「成了值多少」。两者看着有先后,实际在代码里是耦合的。有些番型要求门清,有些要求杠上开花,这些条件并不等到算分才检查,在判定阶段就得留下痕迹。

所以比较省事的路径是:先列出所有番型,标注每个番型的触发条件属于哪一类,再回头设计判定流程需要采集哪些中间状态。顺序反了,后面改起来很痛苦。

把番型表分成三层来看

基础番:看一眼就能数清

平胡、碰碰胡、清一色这类,靠牌面结构就能定。它们的判定条件几乎不依赖过程信息,只要拿到最终手牌和副露就能算,实现上适合做成纯函数。

组合番:得看上下文

杠上开花、抢杠胡、海底捞月,这些番型的触发点发生在对局流程里,不在牌型里。如果你把它们和基础番混在一张表里、用同一套逻辑跑,很容易出现「牌型对了但时机不对」的误判。

特殊番与封顶

有些玩法设了封顶,到某个番数就不再累加;也有番型之间互斥,比如清一色和混一色不能同时算。这已经不是判定问题,而是结算规则,得单独放一层。

判定和计分怎么衔接

常规做法是先判胡、再算番。但这里有个例外:如果番型自带合法性约束(必须门清、必须自摸),那它其实参与了胡牌是否成立的前置校验。这类番型建议在数据结构里加个字段标记,区分「约束型」和「奖励型」,省得后面写结算时反复回头改。

  • 约束型:不满足则该胡牌不成立
  • 奖励型:只影响分数,不影响成立
  • 互斥型:需要标注互斥组,按最大值或优先级取

落成一张能跑的表

每个番型至少要有这些字段:名称、触发条件、番数、类型、互斥组、是否受封顶影响。听着像废话,可真到写代码时,缺哪个字段都会在某一局里翻车。

  1. 先用几十个典型牌例做回归用例,保证每个番型至少被覆盖一次
  2. 再补边界用例:差一张、多一杠、刚好卡在封顶线上
  3. 拿真实对局回放跑一遍,看有没有出现预期外的组合

需要说明的是,九江本地不同桌的规则细节并不完全统一,口口翻怎么算、杠分怎么叠加,各家说法都有出入。

上面这套拆法更像是骨架,具体番数还得按你实际采用的口径填。别指望一份列表通吃所有房间。

把算法拆成番型,好处不在于让规则变简单,而在于让复杂度可见——你能清楚看到哪部分是判断、哪部分是计算、哪部分只是约定。剩下的就是耐心填空。

判定顺序

胡牌判定的三条分支主线

同一手牌在不同拆分顺序下可能得到不同结果,条目按固定顺序登记分支,便于逐层核对。

牌张拆分顺序

先按花色归组,再自左向右尝试顺子优先与刻子优先两种拆法,两条路径分别输出结果后取并集。

顺子优先刻子优先

将牌与面子校验

将牌定位采用枚举法,逐对取出后校验剩余牌张能否全部组成面子,失败则回退下一对将牌。

将牌枚举面子回溯

特殊牌型兜底

七对、全不靠一类结构不走面子校验通道,单独登记触发条件与牌张计数规则,避免与常规判定互相覆盖。

七对特殊结构独立通道
计分口径

番型取值与叠加规则对照

取值区间取自常见牌桌口径,同一番型在不同牌桌存在差异,条目中保留可调整字段。

番型触发条件常见取值叠加说明
平胡四个面子加一对将牌,无特殊结构1 番可与自摸、门清分别累加
碰碰胡全部由刻子与杠组成2 番与七对互斥,按高者计
七对七组对子,无面子结构2~3 番四张同牌计双对的口径需单独标注
清一色全部牌张为同一花色3 番与混一色不可同时成立
杠上开花补杠后摸牌即胡+1 番与自摸是否重复计算按牌桌约定
抢杠胡他家补杠的牌被胡+1 番杠分归属随胡牌结果一并转移
推算路径

听牌张数与出牌优先级的记录方式

01

进张枚举

对手牌逐张尝试替换,输出所有可胡牌张,形成听牌集合,并标注每张牌对应的胡牌结构。

02

剩余枚数统计

按已亮出、已打出与自家手牌分别扣减,得到每种进张的实际剩余数量,避免按理论张数估算。

03

危险度标注

结合场上弃牌顺序与副露情况,为每张进张记录风险等级,供攻守取舍时横向对比。

04

出牌优先级排序

将听牌张数、风险等级与番型收益合并为排序依据,输出当轮的出牌建议序列。

差异记录

牌桌上最容易对不齐的三处口径

同一手牌在不同牌桌结算结果可能不同,条目把争议点拆成独立字段逐个确认。

封顶取值 常见分歧

方案甲按番数封顶,超出部分归零,其余番型照常结算
方案乙按总得分封顶,超出部分按比例折算到各家
记录字段封顶类型、封顶值、折算方式

杠分结算 常见分歧

方案甲明杠由放杠者单独支付,暗杠由三家均摊
方案乙明暗杠统一由三家支付,杠分在胡牌时一并清算
记录字段支付方、杠型、清算时机

抢杠胡判定 常见分歧

方案甲仅补杠可抢,暗杠不可抢
方案乙补杠与暗杠均可抢,暗杠需亮牌确认
记录字段可抢范围、亮牌要求、责任归属
字段说明

条目里反复出现的术语对照

将牌胡牌结构中作为对子的那一组牌,取出方式不同会改变后续面子校验结果。
面子顺子与刻子的统称,杠在胡牌结构中等价于刻子参与计算。
进张能够使手牌进入胡牌状态的牌张,听牌集合由全部进张构成。
副露通过吃、碰、杠亮出的牌组,会影响剩余枚数统计与危险度判断。
封顶单局得分的上限约定,超出部分的处理方式需在条目中单独标注。
责任归属放炮、包三家等情形下的支付方划分,与番型取值分开记录。
疑问解答

关于算法条目与结算口径的常见问题

七对与碰碰胡在同一手牌上能否同时成立?
两套结构互斥。七对不经过面子校验通道,碰碰胡要求全部由刻子与杠组成,条目按较高番型单计,另一项不计番。
杠上开花与自摸是否重复累加?
多数牌桌按杠上开花替代自摸计一次,避免同一动作重复计番;也有牌桌两项累加。条目把该字段标为可切换项,结算前需确认。
听牌张数为什么要扣掉自家手牌?
剩余枚数按四张满额计算,自家手中的同种牌同样占用额度,未扣减会高估进张概率,导致出牌建议偏离实际。
封顶之后多余的番数如何处理?
常见做法有归零与折算两种。归零只保留封顶值,折算则把超出部分按约定比例分摊,条目分别登记对应字段。
暗杠被抢与补杠被抢的判定是否一致?
不一致。部分牌桌只允许抢补杠,暗杠因不公开牌面不可抢;也有牌桌要求亮牌后确认。条目按牌桌口径分别记录。
频道入口

按算法环节查找条目

补充一条本地口径

牌桌上遇到列表未覆盖的分支,或与现有记录不一致的处理方式,可以在这里提交。条目会在复核后并入对应算法环节。

  • 写明触发该分支的具体牌型或局面
  • 标注取值区间与叠加次序
  • 注明所在牌桌的常见处理方式