在上一期的开源周报中,我们介绍了利用图像识别来估计按压的时间而实现精确跳跃的Python脚本,今天我们对这个微信跳一跳小游戏的“外挂”做一些更多的介绍。

核心原理:

每次落稳之后截图,根据截图算出棋子的坐标和下一个块顶面的中点坐标,根据两个点的距离乘以一个时间系数获得长按的时间。

识别棋子:

靠棋子的颜色来识别位置,通过截图发现最下面一行大概是一条直线,就从上往下一行一行遍历,比较颜色(颜色用了一个区间来比较)找到最下面的那一行的所有点,然后求个中点,求好之后再让 Y 轴坐标减小棋子底盘的一半高度从而得到中心点的坐标。

识别棋盘:

靠底色和方块的色差来做,从分数之下的位置开始,一行一行扫描,由于圆形的块最顶上是一条线,方形的上面大概是一个点,所以就用类似识别棋子的做法多识别了几个点求中点,这时候得到了块中点的 X 轴坐标,这时候假设现在棋子在当前块的中心,根据一个通过截图获取的固定的角度来推出中点的 Y 坐标。

最后:根据两点的坐标算距离乘以系数来获取长按时间(似乎可以直接用 X 轴距离)

这个思路非常典型,就是去找所需属性的特征,而且这个游戏的设定完美地避开了这个算法的漏洞:基本上没有与平台相同的颜色(当然相同的话是会被玩家吐槽的),并且游戏的视角没有出现过旋转或者缩放。如果有的话识别上会有一定难度。

利用背景色色差来识别棋盘:

跳一跳的背景现在会逐渐变色,有的时候甚至会与下一个平台的颜色一模一样,不过截图也就一瞬间的事,对于这个算法来说并不是什么问题。作者还专门优化了当小人的图案位于下个矩形顶部上方的情况。不过识别平台大小的算法对于杂色效果并不好,笔者测试的时候大部分都是这个时候挂掉的( ̄ε(# ̄) Σ

对这个程序的探索大概到这里就结束了,这个小项目后续的更新基本上是对识别的进一步优化以及防反外挂机制。本篇延展权当大家学习中的一个小插曲,希望它能让大家在钻研之余轻松一刻。