美文网首页
微信跳一跳外挂(纯学习研究)

微信跳一跳外挂(纯学习研究)

作者: TomasW | 来源:发表于2018-01-25 14:43 被阅读0次

    一、梳理

    跳一跳的游戏可以细分为两步骤:距离判断 + 按压模拟,这两步都有下面这些解决方案:

    1、距离判断:

    ● 简单方案:像素点判断

    ● 进阶方案:OpenCV 图像分析

    2、按压模拟:

    ● 简单方案:adb/wda 指令

    下面逐一介绍这里的实现方法,非常有意思。

    二、距离判断

    1. 像素点判断

    该方法采用自目前最火的跳一跳小游戏「辅助程序」:wechat_jump_game

    如上图所示,我们先定义了「棋子」和「棋盘」,需要找到的两个目标点用橙色点标注,首先针对棋子的目标点的判断,可以这么做:

    相关代码:

    而针对棋盘中心点的确认的思路则是这样的:

    当然还有一些其他方法来尽量缩小棋盘中心点的检测区域,这里简单介绍下:

    当然,如果恰好跳到中心点,下一个棋盘中间会有白色点,则可以直接匹配中心点的色值,得到棋盘中心点,这种情况基本百发百中:

    相关代码:

    但棋盘种类比较多,形状也各异,而且棋盘表面并非纯色,还有其他颜色,所以即使像素判断的代码里增加了很多特殊 case,依旧不能做到非常完美:

    总结一下,目前这个方案基本没有太大问题,但如果跳一跳游戏把背景改成了非线性渐变,或随机飘落一些物体,或棋盘表面更加复杂,那这里的算法就基本不可用了。

    2. OpenCV 图像分析

    基于像素点的判断低效而且不够健壮,而利用 OpenCV 计算机视觉库则可以从图像分析层面进一步简化判断逻辑提升效率,首先采用该方法的跳一跳小游戏「辅助程序」来自 wechat_jump_jump。它是这么得到棋子的位置的:

    相关代码:

    接下来找棋盘的中心点,假如下一个棋盘存在白色的示意点,同样采用上面的模板匹配方法进行匹配,若匹配不上(匹配值小于某阈值,也许下个棋盘本身就是白色,所以灰度图分辨不出),则采用第二种方案:

    这里是否准确的精髓就在于高斯滤波去除图像噪音的临界点以及 Canny 函数中阈值的设定,需要不断调整参数到最优状态。

    相关代码:

    三、按压模拟

    1. adb/wda 指令

    这两个分别是针对 Android 和 iOS 的命令行工具,可以将手机和电脑连接起来,并通过命令行发送指令,指令中就包含了屏幕的截图和按压模拟。不过 iOS 配置起来稍微麻烦一点,具体操作指引可以参考 这里。其核心的命令有:

    当然,如果嫌配置麻烦,还可以通过 Android 的 AirDrop App 或 iOS 的 QuickTime 把手机屏幕投到电脑中,然后通过 Python 的 Pillow 库来截取投屏的内容,再做进一步的图像识别工作。

    还有一点值得一提,按压时间这部分还是有优化的空间,前面提到了跳跃距离和按压时间基本是线性关系,但越到后面可以越发现,距离并非和按压时间绝对成线性比例,因为游戏本身不是一个纯 2D 的平面场景(2.5D),所以我们测量到的直线距离在 2.5D 场景中是有变化的,虽然影响不大,但在游戏后期棋盘越来越小,距离越来越大时,容易凸现出问题来,所以关于距离的计算有几种不同的解决:

    拟合函数的细节可以参考:

    1)https://github.com/metowolf/JumpJumpHelper

    2)https://github.com/wangshub/wechat_jump_game/issues/744

    3)https://github.com/wangshub/wechat_jump_game/pull/841

    四、最后

    反对一切使用外挂行为!

    反对一切使用外挂行为!

    反对一切使用外挂行为!

    通过对外挂程序源码的研读,学习到了非常多创新的思维,这也算是外挂留给代码世界的果实。

    相关文章

      网友评论

          本文标题:微信跳一跳外挂(纯学习研究)

          本文链接:https://www.haomeiwen.com/subject/uxyvaxtx.html