起因

事情的起点很简单。一个常在一起打牌的朋友半开玩笑地问我:”你能不能做一个斗地主辅助工具?就是那种用AI告诉你出什么牌胜率最高的东西。”他是认真的——作为一个重度斗地主玩家,他确实希望有个帮手能在关键时刻给点靠谱的建议。

我当时的第一反应是,技术上可能还真能做。看了一下学术界在斗地主AI方面的进展,发现Douzero这个项目已经把不完美信息博弈下的斗地主AI做到了相当不错的水平。斗地主的AI难点在于信息不完整——你永远不知道别人手里握着什么牌,这和围棋、象棋那种完全信息博弈是两回事。DouZero用深度强化学习解决了这个问题,效果还挺像那么回事。

正好我也一直想做一个完整的、能真正上线的商业化产品,而不是以前那种小打小闹的Demo。于是一拍即合,这个项目就立起来了。帮斗助手 由此诞生。

技术方案

屏幕识别:模板匹配 vs 通用方案

这类辅助工具最核心的问题其实不是AI本身,而是怎么知道当前游戏画面里发生了什么。你得知道自己的手牌是什么、底牌是什么、当前该谁出牌、出了什么牌——而这些信息的来源只有一张截图。

摆在我面前的第一道选择题是:做一个通用的识别算法,试图适配所有斗地主游戏,还是为每一款游戏单独配置?

通用方案的诱惑力不小。如果你能用一套OCR或者目标检测模型就能识别画面里的所有牌面,那就几乎不需要为不同游戏分别适配了。但仔细一想,这里面坑太多了:

首先,不同斗地主游戏的牌面设计千差万别。有的用数字显示,有的用花色加数字,有的牌面上画着卡通人物,字号、字体、颜色、排布方式都不一样。OCR在这种复杂背景下准确率堪忧,尤其是一张截图里挤了十几张手牌的时候。

其次,用YOLO这类目标检测模型,需要大量标注数据。每款游戏、每种分辨率都得标注一批,标注成本不低,而且模型大了在手机上跑不动,小了准确率不够。

最后,也是最要命的——即使识别出了牌面,你还得知道这张牌在画面中的位置关系,因为斗地主里牌的顺序是固定的(从左到右按牌面从小到大排列)。识别模型只管”这是什么”,不管”它在哪里”,要结合位置信息做后处理又得加一套逻辑。

权衡下来,我选了更务实的路子:针对每款游戏单独适配,使用模板匹配方法

具体做法是,为每款游戏(目前支持欢乐斗地主、微乐斗地主、JJ斗地主的App版和小程序版,共6种)准备一套基准分辨率下的牌面截图作为模板。识别的时候,把当前屏幕画面和这些模板用OpenCV的归一化相关系数匹配(TM_CCOEFF_NORMED)逐一比对,找到匹配度高于阈值的位置。

这个方案虽然前期适配工作量大,但有两个关键优势:一是准确率高,因为模板就是直接从游戏画面里截的,跟实际场景一模一样;二是计算量可控,不需要GPU,纯CPU就能在400ms的调度周期内完成一轮识别。

分辨率适配与识别准确率

模板匹配有个天然的短板:模板是在某个基准分辨率下截的,但用户设备的分辨率千差万别。同样一张”方块3”,在1080p的屏幕上和在2K屏上的实际像素尺寸差了一截。

解决方案分了三层:

第一层:区域缩放。 每个游戏的配置里记录了一个基准宽高和各个识别区域(手牌区、出牌区、底牌区、地主标识区等)的坐标。启动时根据实际屏幕分辨率算出缩放比,把所有这些区域坐标按比例映射到实际屏幕上。

第二层:模板缩放。 光缩放识别区域不够,模板图片本身也得缩放。问题在于,缩放比不是简单的分辨率比例——不同游戏在不同设备上,牌面元素的相对大小并不完全跟屏幕分辨率成正比。于是我加了一个自动校准机制:使用图像金字塔做多尺度模板匹配,在0.5倍到2.0倍的范围内搜索最佳缩放比。具体是先找到画面中的一个”标志物”(比如游戏界面里某个固定元素),通过粗搜加精搜两轮匹配找到它的实际尺寸,从而反推出模板应该缩放多少。

第三层:远程配置兜底。 如果自动校准失败了(比如画面还在动画中,找不到标志物),就走备用路线:先查本地有没有这个机型的历史训练数据,没有再请求服务端下发的远程配置比例。这两种都走不通才靠手牌识别来做最后校准——识别出17张手牌后,挑4张不同的牌算平均缩放比。两次连续一致性校验通过后才算完成校准。

准确率方面,除了缩放,还做了几件事:

  • 灰度匹配加高斯模糊。 把彩色图转灰度并做5×5高斯模糊后再匹配,削弱了亮度变化和轻微像素差异的影响。
  • 图像金字塔降采样。 匹配前先把待搜索图用pyrDown反复缩小,直到模板尺寸缩到20×20像素左右,在小图上跑匹配,结果再等比放大回去。速度提升很明显,而且因为小图抹平了细节噪声,匹配反倒更稳定了。
  • 大小王用HSV色彩过滤。 大小王的牌面图案比较像,纯粹靠灰度匹配容易搞混。额外加了一步:在匹配到的区域做HSV色彩空间的红黑占比分析,红色的判定为大,黑色的判定为小。
  • 离群点过滤。 匹配结果里不可避免地会有误识别。手牌场景里,同一个牌出现在相邻位置但得分不同时,保留得分高的那个。出牌区域里,用密度聚类学习每张牌的历史平均出现位置,明显偏离该位置的匹配结果直接丢弃。
  • 出牌二次确认。 自由出牌阶段(该轮没人出过牌)和单张王的识别,要求连续两次识别结果一致才采用,防止误触发。

AI模型选型与演进

AI推理没有做在端上,而是放在服务端跑。端侧负责把识别出的牌面信息上报,服务端返回建议的出牌组合和预估胜率。

最开始用的是DouZero WP模型。DouZero是快手和清华联合开源的斗地主AI,用蒙特卡洛方法做训练,在不完美信息场景下表现不错。WP是Winning Percentage的缩写,这个模型以最大化胜率为优化目标,出牌策略偏稳健,倾向于选择"不犯错"的打法。基本的叫地主评估、出牌建议都能给出来,但实际用下来,在炸弹翻倍这种关键决策上偏保守,有时候明明能炸翻倍的牌,AI建议反而不炸——因为从胜率角度看,不出炸弹稳赢的概率可能更高,但炸了能翻倍得分却不在它的考量范围里。

后来切换到了DouZero ADP模型。ADP是Average Difference Points的缩写,优化目标从小局的胜率换成了每局的平均得分差。这个变动直接影响了炸弹翻倍相关的策略——炸一把赢了能拿双倍分,ADP会更积极地寻找炸弹时机。用户实际反馈也印证了这一点,用了ADP之后,炸弹翻倍的决策明显更果断了。用户实际反馈也印证了这一点——用了ADP之后,平均胜率大概提升了几个百分点。

再后来研究了一下DouZero ResNet版本。ResNet版把骨干网络换成了残差结构,在多个公开基准数据集上的评估指标确实比ADP强。但实际体验有点微妙——大部分时候出牌质量不错,偶尔会打出一手让人摸不着头脑的牌,比如该拆对子的时候不拆,或者手里明明有更大的炸弹却打了小的。这种”看起来强,用起来怪”的情况,大概率是因为基准数据集的对局分布和真实用户场景不完全一致。目前这个版本还在灰度验证中,没有全量上线。

也关注过AlphaDou这个方案。AlphaDou在DouZero的基础上做了不少改进,技术报告上的数据很亮眼。但可惜模型参数没有开源,只能参照论文自己训练。模型训练这块目前还是我的短板——大规模的强化学习训练需要GPU集群和比较长的训练周期,资源投入和回报不太匹配,就先搁置了,等项目跑通了再回头补这一课。

工程落地中的几个坎

游戏动画干扰。 斗地主里出炸弹、飞机、顺子都有专属动画,动画期间牌面是移动的、变形的、半透明的,截下来的图根本没法做模板匹配。搞了一个动画等待机制:识别到炸弹、飞机、连对这种带动画的牌型后,延长下一次识别的间隔时间(默认等2秒),等动画播完了再继续。不过这个等待时间是硬编码的,如果设备性能差动画播得慢,还是可能踩到动画的尾巴。

出牌时序判断。 三个玩家轮流打牌,怎么知道当前到底轮到谁了?不是靠识别倒计时或者提示箭头(这些东西在不同游戏里的样式各不一样),而是维护一个内置的回合状态机——游戏开始时记录谁是地主,然后按”地主→地主下家→地主上家”的固定顺序轮转。每识别到一个人出了牌(或者点了”不出”),就推进到下一个玩家。这比画面识别可靠得多,也不需要额外的模板。

微乐和JJ的出牌识别问题。 欢乐斗地主的”不出”按钮是文字形式,模板匹配好识别。但微乐和JJ的”不出”表现方式不同,有时候识别不出来就陷入死循环了。针对这两个游戏专门加了兜底逻辑:如果当前玩家超过1秒还没识别到出牌,就检查下一个玩家是不是已经开始出牌了(或者已经pass了),如果是的话,说明当前玩家已经pass过只是没识别到,直接按”不出”处理。

未来打算

接下来主要想在三个方向上继续打磨:

提高识别准确率。 目前模板匹配的思路整体跑通了,但边缘场景还是时不时翻车——比如深色模式下牌面颜色反转、某些特殊皮肤牌的字体跟标准版不一样、弱网环境下画面有压缩噪点。后续考虑引入一些轻量的深度学习模型来辅助识别,不作为主力,只在模板匹配置信度不够的时候兜底。

支持更多游戏。 现在只接了欢乐、微乐、JJ三家,还有像途游、波克这些也比较多人玩的平台没覆盖。每加一款游戏至少需要做基准截图、画识别区域、调阈值、测机型的整套流程,靠人工一个一个搞效率太低了。正在想能不能做一个半自动化的适配工具,降低新游戏的接入成本。

提升AI水平。 除了前面提到的ResNet和AlphaDou方向,也在关注斗地主AI领域的最新进展。另外,用户在服务端打的每一局数据其实是很宝贵的反馈信号——如果能把用户真实对局数据用起来做在线学习或者定期微调,让模型越来越适配真实场景,效果应该能再上一个台阶。不过这涉及到数据飞轮的搭建,还需要花些时间设计。

总的来说,帮斗助手是我第一个从零做到完整上线的商业化项目,前前后后踩了不少坑,也学到了很多东西。从最初的模板匹配调试到今天稳定服务用户,这条路比预想的曲折一些,但也更有意思。

帮斗助手官网:帮斗助手-你的斗地主好帮手,下载地址:帮斗助手下载2026安卓最新版 欢迎下载体验。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐