微信跳一跳辅助原理浅析
前言
本文从原理和算法的角度(参考https://github.com/wangshub/wechat_jump_game的实现)探讨怎样实现跳一跳的辅助,做到知其然还要只其所以然。尽量使一个没任何外挂经验的任何语言的普通人也能做出辅助来。当然如果你只打算刷分的话,那本文可能没什么帮助了。(另外,本教程只针对android)
原理介绍
原理其实很简单,棋子跳跃的时间和距离有关。那就利用adb(Android Debug Bridge)将当前手机的截图下载到电脑上,对截图进行分析,算出棋子和要跳的方块之间的距离,再乘以适当的参数即可得到时间。再利用adb模拟手机触摸事件,触摸对应的时间即可。
有2点需要明白的关键:
- 什么是adb?
- 怎样根据图片算出距离
这2点也是实现辅助的关键,下面一一介绍
ADB介绍
adb这东西应该算android的概念,全称Android Debug Bridge
,翻译过来android调试桥?反正是与android设备(如手机)交互的工具。可使用它调试手机应用(需要手机授权)。如安装一个APP,模拟点击事件等,下面列出几个与本文有关的命令。(详情参考Android adb)
1 |
|
模拟操作的只用到了 adb shell input swipe <x1> <y1> <x2> <y2> [duration(ms)]
,表示从(x1,x2)的位置滑动到(x2,y2)的位置,滑动时间为duration毫秒。
怎样算出距离
图片拿到了,怎样算出距离是个难题。在介绍算法之前,有必要先了解下计算机是怎样储存和表示图片信息的。
计算机将图片的颜色表示为RGBA值。我们知道颜色的三原色红绿蓝,RGB即分别表示红绿蓝。剩下的A表示透明度。每个GRBA值表示一个像素,每个图片就是由这些千千万万个像素点构成的。
同时,为表示每个像素点,引入了坐标概念。以左上顶点为原点(0,0),向右为x轴,向下为y轴,像素点坐标均为正值(与数学上不太一致)
如上图所示,我们要想找到棋子,需要充分利用棋子颜色的这个特征,一行一行遍历像素点,直到找到棋子底座颜色(深紫色的)的若干像素点(实际是一个颜色范围区间),平均后得到底座中心位置。
至于方块的位置就不好找了,可以利用色差来做。如上图,背景色是浅黄色,要跳的方块是深灰色,可从上到下扫描像素点,记录背景色,一旦发现有与背景色相差太大的像素点,即表示发现了目标方块,照着此颜色多找几个点,平均下得到方块的中心点。(也可直接用其他方法或用其他方式选取中点,看你自己研究了)
不过这样会有点问题,万一棋子高度大于目标方块就会有误,这在奶茶杯的方块会遇到。这时将棋子的颜色排除掉即可。总之原则就是根据色差找到目标中点。
具体实现
上面的介绍大致就知道了实现原理,由此可知重点是根据图片找到适合的中点。原则上讲只要有处理图片及像素的库的语言都可实现。python、go、java等均可。python处理图片更简单,下面用python简要实现。
寻找棋子中点
1 |
|
寻找方块中点
以下为寻找方块中点,原理是根据色差。具体:记录上一个像素点,当前像素点与上一个的比较,
若相差过大,表明找到了目标方块的第一个像素点(需排除是棋子的可能),记录在select_color里。
以后遍历时当前像素点就与select_color比较,相差不大则表明是目标方块的点,记录。
收集足够多的点或遍历完成后求中点即可。
1 | pre_px = None |
后记
我将其简要实现放到了github上,有详细的注释及说明,地址在微信跳一跳辅助,感兴趣的同学可以去看看。一起谈探讨更好的实现。