跳一跳——电脑能做的事就不要人工来做啦

几年前参考网上的文章写过天天连萌自动玩的项目(之前写在 iteye 的博客上:http://maosidiaoxian.iteye.com,github 项目地址为:https://github.com/GameTerminator/lianmeng),这次微信小游戏里的跳一跳的自动玩实现同理,但更简单。

几年前参考网上的文章写过天天连萌自动玩的项目(之前写在 iteye 的博客上:http://maosidiaoxian.iteye.com,github 项目地址为:https://github.com/GameTerminator/lianmeng),这次微信小游戏里的跳一跳玩了玩,就自然而然地想到用同样的方式来做。

经过几次修正和简化,最终思路和实现如下:

使用 monkeyrunner 里的接口截图

找出跳动的那个小球的 x 坐标

找出最终要跳达的点的 x 坐标

算出其距离,并按线性方程计算出时间

使用 monkeyrunner 里的接口模拟长按事件

长话短说,下面是完整的 Java 代码实现过程。

截图及模拟长按

要调用 monkeyrunner 来截图及模拟长按,我们需要 sdk 里的几个 jar 包,它们分别是(以下版本省略为):

chimpchat-*.jar

common-*.jar

ddmlib-*.jar

guava-*.jar

以上这些 包在 中的 中可以找到。然后我们使用其 来实现 连接,截图,长按。代码如下:

上面的代码中,由于 没有直接提供长按的接口,这里使用的是拖拽方法。

找到起始位置

接下来是要找到跳跃的起始位置。这里我们简化一下,允许存在一些误差,找到小球的中心的坐标,和目的点的坐标即可。

由于在每一步中小球都不会有变化,并且在小球上面不会有其他色块与小球颜色接近,所以我想到的找到小球中心的坐标的思路如下:

先获取小球的一部分图像,然后截图整个界面,由上至下遍历,找到与小球颜色接近的那块区域,其中心点就是小球的中心点。

截图小球的方式有多种,比如用 PS 抠图,或 QQ 截图,代码也可以,方式如下:

先截取游戏时的界面,然后用 PxCook 测量出小球的位置。我手机屏幕为,截取的是小球中间的的一块区域,代码如下:

上面的 及 是在 PxCook 中测量出来的数值。

然后就是找出每一步小球所在的位置。思路也很简单,一行一行地往下遍历,如果某个像素点的颜色与刚才所获取的小球区域的颜色相近,则遍历这个点为起始点的[x,y][x+23, y+23]矩形区域,如果每个像素点都接近,则表示这块区域就是小球,否则则继续遍历。判断颜色相近,我想到的是其相差均小于10。最终找到小球的代码如下:

从上往下每一行进行遍历,遍历代码如下:

找出跳跃终点

在上面的代码中,有个方法的调用,它就是用于找出跳跃的终点坐标。它的原理也很简单。

由于在游戏中,背影是纯色渐变的,而要到达的区域,它的顶部颜色与背影色相差较大,并且不是椭圆就是菱形,它的特点是在这个平面上,中心点与顶点的坐标相同。所以只要在显示分数的下面,从上往下每一行进行遍历,找到有一点与上面那一行的点颜色相差较大,这个点的坐标就是要跳过去的点的坐标了。代码如下:

最终代码

最后是写一个大循环,每一步里面截图,找到要终点 坐标,找到小球中心,算出距离,再换算成时间,发送模拟按下事件,然后暂停按下的时间,再暂停 2 秒。这里暂停 2 秒的原因是,有些场景,停留 2 秒以上会有加分。最终 方法代码如下:

其中由距离计算出时间的公式可以自己再进行调优。目前我的公式基本都能拿三四百分以上,最高是 800 多分。

项目完整代码,请参见 Github 项目:https://github.com/GameTerminator/lianmeng。Idea Gradle 项目。

其他相关项目:

天天连萌自动玩: https://github.com/GameTerminator/lianmeng

别踩白块儿暴力玩法: https://github.com/GameTerminator/dont-touch-white

最后贴一下我的排行榜,在朋友圈里刷个第一名还是挺简单的。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20171231G0040V00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券