最近跳一跳很火,我自己也玩的不亦乐乎,但是玩了三周了都没能上过400分。

之前就听说有人在github上用python写了辅助脚本来玩跳一跳,我趁着一天在公司吃完饭回来,闲着没事就去下了一份代码,在办公室把python环境搭起来,把依赖的库下好,跑起脚本体验了一把作弊的感觉~

( github项目地址:GitHub 跳一跳python脚本 )

第一把跳了1800多分,成绩也上传了,但是发现在同事那边看不到我的成绩,过了一会再看我这边,成绩也还原了。

难道脚本已经被微信ban掉了?

上网查了跳一跳封外挂的消息以后,看到了张小龙的原话:

“对于外挂来说,其实这种对抗是无止境的,你今天用这种能力对抗,可能第二天外挂又提高了一种新的办法。我们采取了一些特别的办法,这里可以泄露一点点,对于这样一个游戏来说,其实它的成长是非常艰苦的,我并不认为有任何一个人可以不经过练习就立即达到一个非常好的水平,按照这一点,我们会判断每个人是不是有一个成长曲线,如果不符合这样一个成长曲线,我们认为这个可能是你作弊的一种行为。所以大家应该看到了,最近朋友里面的外挂高分突然就少了。”

那么事情就明了了,成绩之所以会被还原,是因为一下跳了太高分导致不符合正常的成长曲线了。

后来我每次只增加100分200分到样子,也能正常刷分并且上传了。

下图为证:

不过作为一个程序员,怎么能仅仅满足于刷分呢,肯定要看看这个作弊脚本是怎么实现的啊。


细读了代码后,发现原理如下:

技术原理:

(因为我用的是锤子,所以这里只介绍android手机)

技术原理就是手机打开开发者模式通过usb连接pc,pc上跑py脚本然后通过adb在手机os的shell上执行命令,原理是每个一段时间截图分析图片,获取必要的坐标来计算jump函数所需要的距离,乘以一个固定的距离系数来得到按压时间,最后通过adb发一条指定了按压时间的swipe命令实现跳跃。

下图分别是主函数,截图函数和跳跃函数,分析图片的函数比较长我就没截。

主函数:

截图函数:

跳跃函数:

脚本原理:

1).确认棋子的中心点:
由于棋子的最底部一行像素的颜色具有特殊性,
于是:
1. 从图片顶部向下的三分之一高度处开始,到三分之二高度结束,从上到下(步长50px)、从左到右地(步长1px)进行扫描,
2. 发现像素值和棋子底部像素值相同时,进行横坐标的累加和最大纵坐标的比较
3. 扫描完成后用累加的横坐标除以像素点个数获得棋子底部中心点的横坐标
4. 计算得到平均横坐标、比较得出的最大的纵坐标,即获得棋子最底部的中心点位置
5. 根据手机的分辨率大小,将得到纵坐标上移一个固定的距离,即获得棋子的中心落点位置

2).确认下一个底块的中心点:
当确定了棋子的中心点坐标后,
下一个底块的位置被分成两种情况:
如果棋子的横坐标小于屏幕宽度的二分之一,则底块将出现在棋子的右侧
如果棋子的横坐标大于屏幕宽度的二分之一,则底块将出现在棋子的左侧
基于此可以确定接下来的扫描范围时屏幕的左侧还是右侧
确定扫描范围后:
1. 从扫描区域的顶部开始从上到下(步长1px),左右到右(步长1px)进行扫描
2. 找到第一个不是纯色的点(游戏背景一定是纯色),这个点的纵坐标将是底块的顶部的纵坐标
而横坐标则需要特殊处理:
但由于底块表面的形状分为方形和圆形两种,
如果是方形,则将只有一个顶点,
如果是圆形,则将有若干个顶点(圆形的顶部不是一个点而是一条线)
因此需要将扫描到的非纯色的点的横纵标累加后取平均值
3. 通过第2步获取到了底块的顶点后,从顶点向下的274px开始向上(步长1px)扫描
(274px取开局时最大的底块的上下顶点距离,之后的底块上下顶点距离都不会大于这个数字)
4. 找到第一个与底块顶点颜色相同的点,这个点就是底块的下顶点
5. 上顶点的纵坐标和下顶点的纵坐标相加除以2,就获得了底块中心点的最终坐标

3).获取到两个中心点的坐标后就可以计算两点间的距离了

4).最后再将预先设置好的系数与距离相乘,就可以算出跳跃需要的按压时间

代码里还有不少特殊情况的处理,比如这些
1. 棋子的最大高度比下一个底块的上顶点还要高(当下一底块特别小,并且距离特别近时会出现这种情况)
2. 底块的颜色不是纯色的,导致不好确认底块下顶点的
3. 利用上一跳命中中间时下个目标中心出现的白点进行坐标校正

总之,这套代码非常依赖于棋子和游戏背景的色值,如果微信一旦将棋子的色值和背景的色值复杂化,比如加上斑点和条纹,那么这一套代码就会失效了。不过还是佩服作者的动手能力,我和人家一比,可真是太懒了~

发表评论

电子邮件地址不会被公开。 必填项已用*标注