
简介mahjong-helper是一款面向雀魂、天凤玩家的日本麻将实时辅助工具核心解决对局中的牌效判断、防守安全度与记牌需求。它能自动分析手牌综合进张与打点给出推荐舍牌并在有人立直或多副露时标注各牌危险度同时记录他家手切摸切支持三人与四人麻将。资源包共138个文件以Go源码为主体包含相关图片资源、前端脚本、协议定义及本地证书等压缩包仅1.47MB结构简洁便于部署或二次开发。目前已有14162人浏览学习说明该助手在实战玩家与开发者中具备较高认可度。从中可获取完整的日本麻将AI辅助实现思路包括牌效计算、防守判断与通讯代理等关键模块既适合日常对局使用也适合对麻将算法感兴趣的开发者阅读参考。1. mahjong-helper 是什么先搞清楚它解决哪一类麻难题打日麻打到某个段位后很多人会卡在同一个问题上明明听牌很快为什么铳率降不下来明明该弃和却总在关键巡摸到危险张时忍不住切了出去。mahjong-helper 就是一个把牌效、防守、记牌三件事集成到同一套流程里的日本麻将助手支持雀魂、天凤两个主流对战平台解决的是“这巡到底切哪张”的决策问题。它不自动代打也不改游戏数据而是把你手牌、牌河、宝牌这些信息算清楚再摆给你看。适合想突破攻防判断瓶颈的玩家也适合拿它做牌谱复盘和策略研究的开发者。2. 牌效模块从手牌到向听数、进张数先学会看它的输出2.1 为什么牌效是日麻的第一优先级日麻的效率本质上是在比谁更快把向听数归零。向听数就是“还差几张有效牌能听牌”0向听是听牌1向听是再摸一张有效牌就听2向听就是再摸两张。牌效好的切牌不是看它现在的形状好不好看而是看它把向听数降下去的速度。同样一把牌切A可能保留12种进张切B只剩6种这个差距在早巡不致命到了中巡就是先听和被人追听的区别。很多人误以为牌效只负责“快”跟防守无关。其实速攻本身就是防守的一种你先听牌别家就要承担追你铳的风险你慢悠悠整型别家早听你就得被迫弃和。mahjong-helper 的牌效模块核心就是帮你算清楚两种东西一是当前向听数二是每种切法之后的进张数与改良张数。进张是“摸到就能推进向听”的牌改良是“摸到后不推进向听但形状变好”的牌两者一起看才不会只图快而把自己整成愚形。2.2 本地跑通牌效分析最小命令与手牌输入格式我一般不会在实战时开着工具打而是先把一副手牌扔给它做离线分析确认“当时那巡切哪张才是正解”。大多数这类工具都支持把一手牌写成文本然后走命令行常见格式是用 m/p/s/z 后缀区分万、饼、索、字牌数字后面直接带字母。比如 123m 就是一二三万6s 是六索7z 是西风5z 是红中。{ hand: 123m 456m 789m 123p 44s 6s, dora: 6s, mode: efficiency, consider_red_five: true }字段含义比较直观hand 是手牌的13张牌文本dora 填的是宝牌指示牌不是宝牌本身mode 切成 efficiency 表示只算牌效consider_red_five 打开后会把赤5当普通5处理。这里有个容易搞混的点dora 填的是“指示牌”真实宝牌是指示牌的下一张如果你填错了后面的防守模块对宝牌危险度的估计会整体跑偏。# 把上面的 JSON 存成 hand.json再走命令行入口 # 具体入口名以你下载的发行版为准先跑 --help 看参数 mahjong-helper hand --file hand.json --format plain输出一般长这样具体数值会随牌型变化这里只是示意手牌 : 123m 456m 789m 123p 44s 6s 向听 : 0听牌 推荐切 : 6s 切后进张: 4s 7s 共2种8张 改良 : 5s 共1种3张这里的逻辑是工具先计算当前手牌的向听数然后枚举每一张可切牌把切掉后的剩余12张放回去重新算向听再统计哪些牌能让向听数继续下降。推荐切就是让进张种类最多、同时改良损失最小的那张。参数 format 建议用 plain机器可读性强后面做批量复盘时方便把输出重定向到文件。2.3 读懂输出向听数、进张数、改良张数怎么配合着看只看“推荐切”是新手最容易犯的错工具给出推荐切是综合排序的结果但你自己要会看那串进张数字。向听数相同的时候进张种数优先进张种数相同再比改良。改良张数多意味着即使没摸到进张也能靠改良牌把愚形整成好形这种厚度的牌型在中巡价值极高。有一种常见误用是直接把工具输出的“进张种类”当成“这张牌切了安不安全”。牌效计算默认对手牌没有场况信息它不知道哪家已经碰了九万也不知道牌河里已经见了三张四索。所以我在实战里只把它当攻牌时的参考一旦判断需要防守就切到防守视角别死抱着牌效输出不放。牌效模块的价值更多是帮你校准直觉尤其是那些“看起来差不多”的切牌实际进张数可能差出两成以上。3. 防守模块从牌河到危险度判定工具是怎么读出“这张不能切”的3.1 防守的本质读牌与弃和日麻里的防守不是“怂”而是用已知信息推断别家听牌范围再挑最安全的牌打。安全牌的第一来源是现物也就是别家已经切过的牌打出去绝对安全其次是筋牌基于“两面搭子听牌只会听在筋上”这个规律可以排除一部分危险度。问题在于人脑记住一副牌河容易记住三副牌河还同时算自家手牌到中巡就开始乱套。mahjong-helper 的防守模块本质是把读牌经验固化成规则再按概率排出每张手牌的危险度。这里要强调一个边界工具不会透视别家手牌它做的全是基于牌河的统计推断。真正的读牌高手能结合对手的切牌时机、碰牌动作、宝牌位置来判断工具目前只能把“牌河副露宝牌”这些可量化信息算进去。换句话说它是把你的读牌下限抬高而不是替你完成读牌上限。3.2 危险度是怎么算出来的从现物、筋牌到壁牌与早外我按常见做法把危险度来源拆成几层。第一层是现物绝对安全但现物会打光所以要看第二层筋牌。日麻的筋是147、258、369这三组如果对手切过4那么他听1和7的可能性就会降低因为手上有14、47搭子的可能被排除了。第三层是壁牌某种数牌场上已经见到4张那所有依赖这张牌的搭子全部作废相关牌危险度也会下降。第四层是早外对手在序盘就切掉远端的1或9说明他大概率没有相关搭子这比中巡才切更有说服力。工具把这些规则逐个套到每张手牌上最后输出一个安全度排序。我一般习惯看相对顺序而不是绝对分数因为绝对分数受牌河长度影响很大早巡大家都没几张安全牌可打分数普遍低这时候硬挑分数最高的往往还是危险牌。安全度等级大致可以这样理解等级判定依据实战含义S现物对手切过绝对安全A筋牌壁牌加持基本安全可用来过渡B普通筋牌相对安全中巡可用C无筋中张危险基本只能弃和时当最后手段D宝牌附近的无筋牌极度危险能不切就不切这套分级是我自己用的约定不同工具的等级命名可能不一样但底层逻辑一致。注意A级里的“筋牌壁牌加持”很关键比如牌河里有三张5万那4万和6万的搭子成立概率大降1万和7万的安全性就明显高于普通筋牌。3.3 把防守建议落到切牌排序攻防一体的切牌策略实战中很少是非黑即白的“攻”或“守”更多是“这巡还能冲一下下巡就得走”。mahjong-helper 在这一点上做得比较实用它把每一张手牌同时标注牌效价值和危险度你可以按“危险度从低到高”排列候选切牌再在里面挑牌效损失最小的那张。比如场上有两家副露明显在进攻这时候我会把“不点炮”的优先级提到“快听牌”之前从安全度B级以上的牌里挑一张损失最小的切。这里有一个我踩过很多次的心得防守模块的输出要结合对手的副露动作去修正。如果某家碰了字牌之后连续切出数牌中张说明他手上已经完成面子进入听牌甚至一楝听状态这时候无筋中张的危险度要自动上调一档。工具不会帮你判断“谁在进攻”它只会告诉你“这张牌危险”判断进攻力度还是得靠自己工具负责把信息密度降下来让你有余力做判断。4. 记牌与平台接入雀魂、天凤的识别原理和配置方法4.1 记牌到底在记什么牌山剩余与宝牌分布记牌模块不是简单数“场上已经打了什么”而是反推出“牌山里还剩什么”。日麻的牌山一共136张去掉自己手牌和三家河牌与副露剩下的就是未知牌。工具会实时维护一张剩余牌表精确到每一种牌还剩几张。这个信息在实战里最大的价值是判断进张是否还活着比如你想等4索两面听牌但牌河里已经见了3张4索剩余就只有1张那这个听牌的实际价值就要打折。宝牌管理是记牌里另一个重点。宝牌指示牌会随杠变化暗杠、加杠都会翻新的指示牌。工具需要跟踪这些变化实时更新宝牌剩余张数。赤宝牌一般每局每种花色各一张被谁切了、被谁碰了都会直接影响防守判断因为赤5的危险度远高于普通5。记牌模块要同时处理这些信息输出给牌效和防守模块用所以说记牌是整个助手的底盘底盘错上面全错。4.2 对接雀魂、天凤抓图识别与窗口配置mahjong-helper 在雀魂、天凤上的工作方式一般不是读游戏内存而是抓取游戏窗口画面再用图像识别把牌面转成文本。常见做法是定时截取牌河区域和自家手牌区域用模板匹配或者OCR识别每张牌再把这些识别结果汇总到记牌表。这种方式的优点是安全、不需要注入缺点是依赖画面稳定一旦分辨率、主题、缩放比例变了识别率就会直线下降。窗口级配置是第一个要过的大坑。高分屏下Windows系统默认会做DPI缩放游戏窗口显示是正常的但截图接口拿到的坐标和实际画面坐标对不上导致识别区域框偏。我一般在配置文件里直接写窗口标题关键词和识别区域坐标同时关掉系统的“自动缩放”选项或者把程序兼容性里的“高DPI缩放替代”改成“应用程序”。这一步不做后面识别就是全盘翻车。{ window: { title: 雀魂, match_mode: contains, dpi_aware: true }, capture: { region_hand: [120, 640, 960, 160], region_river_top: [120, 320, 960, 120], region_dora: [180, 180, 240, 80] }, recognizer: { method: template, threshold: 0.82, red_five_detect: true } }参数说明title 是窗口标题的模糊匹配关键词match_mode 用 contains 避免版本更新后标题后缀变化导致找不到窗口region_hand 是自家手牌区域格式是左上角x、左上角y、宽度、高度。region_river_top 是上家牌河区域region_dora 是宝牌指示牌区域。threshold 是关键参数调太高会漏识别调太低会误识别我一般从0.82起步识别不稳就降到0.78但低于0.75时误判率会明显上升不建议再降。4.3 手动录入模式识别失败时的后悔药图像识别再稳也扛不住游戏更新换皮、窗口被遮挡、掉帧等情况。真遇到识别漂移最实用的后悔药是手动录入把工具切到半自动模式用快捷键把当前手牌或牌河信息填进去。虽然操作成本高但至少保证记牌数据不中断。我的习惯是识别一旦连续三巡出错立刻切手动而不是反复调整阈值因为调整阈值是个玄学过程不如直接手动兜底。手动录入的配置项通常比自动模式少只需要确保快捷键和游戏内的不冲突。我常用的是把录入快捷键设成 F7、F8 这类游戏里基本用不到的功能键避免在紧张对局里误触。还有一点容易被忽略手动录入模式下工具不会自动跟踪副露和杠你需要额外告诉它“哪家碰了什么”建议每局开始时把配置确认一遍不然牌山剩余数会从某一巡开始慢性漂移。5. mahjong-helper 避坑与排查我踩过的 5 个坑5.1 识别率突然下降换了主题、皮肤、字体会全盘崩现象昨天还好好的今天打开游戏后工具识别出的牌名开始乱跳一张9万被认成8万宝牌区域频繁报错。原因多数在线对战平台会出季节主题或可选皮肤牌面花纹、字体粗细、背景色一变基于模板匹配的识别器直接失效。OCR类的识别器对字体更敏感加载字体文件路径一旦变更也会出错。这不是程序坏了是输入变了。解决先把识别方法切到“模板重采样”重新截取当前牌面生成新模板如果工具支持字体配置检查字体路径是否仍然有效。长期用同一个主题打牌最省心我一般不在版本更新后第一时间打段位赛先开练习场确认识别稳定再说。5.2 窗口抓不到图DPI缩放与多显示器分辨率不一致现象工具日志里一直提示“窗口句柄为空”或“截图全黑”但游戏明明在前台。把窗口拖到副屏就好了主屏怎么都抓不到。原因主屏缩放比例不是100%截图接口按物理像素取窗口坐标拿到的区域和实际渲染区域错位。多显示器下副屏如果走不同缩放窗口坐标换算还会再偏一次。解决进程序属性的“兼容性”里打开“高DPI设置替代”选“应用程序”模式同时把主屏缩放统一改成100%。如果必须用缩放屏至少在配置里打开 dpi_aware 让程序自己换算。这个坑是配置问题里最常见的强烈建议第一次配置时就锁定环境。5.3 宝牌和赤宝牌统计对不上指示牌填错了位置现象记牌面板显示的宝牌剩余和实际对局明显不一致比如明明有人杠了宝牌指示工具却没更新剩余数。原因手动配置场景里有人把 dora 字段填成了“宝牌本身”而不是“指示牌”杠增加指示牌时又没重新录入导致工具内部多算或少算了一层。自动识别场景里则是指示牌区域的坐标框歪了把旁边一张牌当成了指示牌。解决先停掉自动识别手动核对手牌和宝牌区域坐标再明确 dora 的语义填的是指示牌。最有效的验证办法是开局前先看工具显示的宝牌剩余数跟实际牌局里数一遍如果对不上优先怀疑坐标和字段语义而不是纠结算法规不复杂。5.4 切牌建议和实战思路冲突工具没有场况概念现象工具推荐切一张进张最多的牌但这张牌是别家的现物切出去立刻点炮。于是有人得出“这工具不能信”的结论直接弃用。原因牌效模块计算的是“不考虑别家手牌”的最优解它不知道你这巡在弃和。防守模块的安全度排序只反映统计危险度也没法替代你对对手进攻力度的判断。工具不是打牌的脑子它只是帮你看清牌效和危险的底牌。解决把工具当“信息整理器”不当“决策器”。实战中先明确自己这巡是攻是守攻就看牌效输出守就看安全度排序。如果攻守判断自己都拿不准用工具的安全度B级以上的牌里挑牌效最好的那张这是最保守的折中方案。靠工具替代读牌翻车只是时间问题。5.5 版本更新后配置失效缺省值覆盖了你的自定义配置现象升级工具后打开发现窗口找不到、识别区域偏移、手动快捷键没反应一看配置文件被重置成了默认值。原因新版本改了配置格式或者字段名程序启动时没兼容旧配置直接用默认配置启动。如果旧配置里有新版本不认识的字段整个文件可能被忽略。解决升级前把当前配置备份一份升级后先 diff 新旧格式差异再逐项迁移。我的习惯是只把配置文件放在程序目录外的地方顺便记录下自己改过哪些字段而不是每次升级都从头调一遍识别坐标。识别坐标这种参数重新调一遍至少要打三场测试局备份能省掉大半功夫。6. 进阶用法用 mahjong-helper 做牌谱复盘与个人攻防校准到了这个阶段工具对你来说已经不只是实战辅助而是训练材料。我建议你把重点从“实时看提示”转移到“复盘校准”上。做法是复开牌谱把每巡的手牌和牌河按时间顺序回放看工具在每一个决策点的推荐切牌再和自己当时的实际切牌对比。这里有个很有效的小技巧把每巡的输出结果整理成一张表记录“实际切牌 vs 推荐切牌 vs 当时安全度”连续复盘十场你会发现自己的失误集中在某几类牌型上。import json def compare(actual, recommended): diff [] for turn, a, r in zip(actual, recommended): if a ! r: diff.append((turn, a, r)) return diff # actual 是你对局里的实际切牌recommended 是工具复盘输出 for turn, a, r in compare(actual_list, recommend_list): print(f巡目{turn}: 实际切{a}推荐切{r})这段脚本只做一件事把你和工具的决策差异拉出来。真正有价值的不是差异数量而是差异的规律。比如你可能会发现自己总是在“有对子可碰、也有两面搭子”的牌型里偏爱碰牌导致进张变少或者总是在弃和局里忍不住切无筋中张。这两个问题分别对应牌效和防守的短板比单纯看胜率直观得多。除了复盘我还会用牌效模块做“决策校准”练习看到一副手牌先自己说答案再丢进工具看输出。坚持一段时间后你对进张数的敏感度会明显提升很多牌型一眼就能估算出大概的进张范围。记牌模块也能用同样方式练看牌河前先默数剩余张数再用工具验证这比干背牌谱轻松。我原本也有过“工具开多了会不会依赖成瘾”的担心实际用下来真正的依赖风险来自实战中一直开着提示而不是复盘时使用。现在我养成的习惯是对局全程不看工具只在局后复盘时打开用工具的输出反过来检验当时的读牌逻辑。这样工具从“拐杖”变成了“教练”牌力反而提升更稳定。另外多数对战平台对实时辅助态度不一对局中开口子前先确认平台规则别给自己找麻烦。做复盘校准既安全又能把工具价值发挥到最大希望帮到你。本文还有配套的精品资源点击获取