从微信6.6.1版本更新后,除了小程序入口增多外,还开放了小程序游戏,其中最火热的当属跳一跳,从发布当天开始大家就在拼命刷分,力争在排行榜中占据第一。
刚开始玩的时候,能上几十分时手感就已经算是很好了,朋友圈里有人刷到了两百多分就已经被膜拜了,但是最近经常有爆出上千分的截图以及排名,直接让很多人望而却步,直到发现了……
(文末附github地址)
按照作者的描述,配置好python环境,打开手机USB调试运行起来后,就发现游戏自动进行,而且跳的位置相当精确,甚至能连续多次跳在中心点上,这种中心点的额外加成最高达到32分。
一个多小时的时候,实在耐不住性子,就终止了程序,此时分数已经超过了5000分了。
但是在排行榜中我的分数居然是0,所以这里腾讯应该是做了一个最大值的反作弊(暂且称为人类极限值吧),此时恍然大悟,为什么有些人能跑更多的分数,但是民间流传的最高得分都是3999。
实验做完了,作为技术人员,绝逼按耐不住要去分析原理。
这里使用的是一个python脚本,原理其实相当简单,关键步骤就三步:
adb 命令截图
分析截图中棋子与下一跳的距离
adb 命令跳转
跳转需要设定点击的时间长短,而时间是由位置距离决定的,所以重点在于如何计算出跳跃距离。
从代码里看到,跳跃距离是通过勾股定理计算得出,而关键数据在于通过find_piece_and_board函数得到的棋子底盘中心点的位置piece_xpiece_y和下一跳上平面中心点的位置board_xboard_y。
重点聚焦在find_piece_and_board函数中,先看一下截到的图。
首先,屏幕的上半部分和下半部分都不会有主要游戏元素,所以可以被直接忽略,假设重要的部分只有中间的1/3的长度;而棋子和下一跳也不会太靠近左右两边,所以作者也将x轴进行了8等分。
首先确定下一跳最高点的y轴坐标,直接遍历出第一次颜色跃变的点。当然这里还有个前提条件,就是下一跳位于游戏画面偏上方的位置(位于棋子的左上方或右上方)。
确定了下一跳最高点y轴的值之后,就开始寻找棋子底座的坐标。此时棋子的范围就在scan_start_y 与 屏幕的 2/3 的位置之间。
从代码里可以看出,默认棋子的颜色RGB范围在(50,53,95)与(60,63,110)之间。使用某工具网站查看结果如下:
(50,53,95)
(60,63,110)
其中,piece_base_height_1_2是经验值,通过配置文件获取,不同的手机不同的分辨率可能有不同的值。
然后是确认下一跳上表面中心点的x轴,始终是跟左侧边界颜色做对比,色差超过一定值就记录一次,最后算平均。
y轴的方式差不多,就是换了个方向,色差小于某个值才算是在下一跳上表面区域内。
最终这些关键值都计算得出后,就可以执行模拟点击了。
从刚刚的分析中很容易发现,想针对此脚本进行反作弊相当容易,至少有三点可以做:
定制棋子,改变形状和颜色
定制下一跳上表面,使得颜色不均匀
定制背景颜色,有更多的色差
所以,可能很快这个游戏就会有改进版本,趁着还能用……
github地址:
https://github.com/wangshub/wechat_jump_game
领取专属 10元无门槛券
私享最新 技术干货