“微信推送了v6. 6.1 版本更新,更新后,用户点开微信,其首页便是“跳一跳”这一游戏。微信团队这样的“强制推广”意图相当明显。但不管用什么样的方法,微信的“跳一跳”现在已经火遍了大江南北。”
网上已经有很多关于这款游戏的秘籍攻略,但是我们当然不能走寻常路啦~玩过几局之后发现,这款游戏的特点注定了它极为容易被设计物理外挂:
- 操作简单,只需要点击屏幕(也只有这一种操作)
- 没有时间限制,每一跳都可以等完全准备好了再操作
- 画风淳朴,可爱是一方面,另一个就是这样的画风很方便进行图像处理~
机智的创客网友也有已经用舵机代替手指做出物理外挂的了↓
由于我手边没有电容笔,而且感觉用外置摄像头加Arduino来玩这游戏有点小题大做,因此这里通过纯软件方式开挂,原理为:
- PC端通过ADB命令控制手机截图并上传
- PC端程序读取截图进行图像处理,这里用的OpenCV
- 根据处理结果发送ADB命令模拟点击屏幕
- 以上循环
原理其实很简单,重点就在图像处理的步骤,这个游戏中也很好解决,首先我们知道游戏里小人跳的距离跟我们点击屏幕的时间成正比,因此PC端任务就是测量出小人和下一个站台之间的距离。对于小人的识别,我们直接使用模板匹配算法,OpenCV里有提供现成的matchTemplate方法;站台的识别则麻烦一点,因为站台是随机生成的,而且我们也不知道到底有几种,所以这里用了一个比较巧妙的方案↓
仔细观察每个场景,下一个跳台始终是出现在最上方的,也就是说,我们把图像进行边缘二值化,从分数显示的那一行下面开始一行一行搜索,如果发现某个像素不为黑色,就找到了下一个跳台的上边缘,然后我们把这值往下偏移一点,就可以作为下一个跳点了,这个策略对每种跳台都是适用的。
最终实现的效果还是非常不错的,在朋友的手机上轻松刷到了2000多分,该方案的主要速度限制在于手机截图上传的过程,可能会演示2-3秒,因此要想的高分还是得挂上个把小时的~