几年前参考网上的文章写过天天连萌自动玩的项目(之前写在 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
最后贴一下我的排行榜,在朋友圈里刷个第一名还是挺简单的。
领取专属 10元无门槛券
私享最新 技术干货