[聚合文章] 以程序员的角度玩微信跳一跳

程序员 2018-01-01 22 阅读

前些日子微信推出了一款小游戏「跳一跳」,游戏中玩家需要扮演一个「黑色」小人,在不同颜色、形状的跳板方块间进行跳跃。操作也很容易,按压屏幕越久,小人会跳得越远。

显然这游戏对我这样的手残党非常不友好

若干次徘徊在十位数后,决定好好研究这个游戏,用程序员的思路去解决它。

外挂无非两种:内存修改、物理辅助。这里研究后者,也就是识别出跳跃距离后,换算成时间后模拟真实触碰操作。这种方式最保险,而且不容易被后台察觉 XD

观察棋子,不难发现棋子的颜色始终是没有变化的,因此可以根据颜色识别出棋子中最宽的部分,取中心即可

棋盘部分比较难识别,忽略掉背景色后会有阴影等因素的干扰,还有前后两个棋子紧挨的特殊情况。

考虑从上到下做行扫描,提取出所有连续的颜色块,排除掉中心点与棋子过于靠近的情况,这样就避免识别到棋子头部,取最上面且长度大于棋子宽度的切片,就得到目标点横坐标。

对于纵坐标可以只考虑棋盘右侧,这样就不需要和阴影打交道。棋盘只有圆盘、方块两种类型,边缘的锯齿状如下

容易发现规律,方块的中心线位于边缘峰值处,圆盘的中心线在峰值处偏下。可以设定一个计数器,当边缘连续 4-5 次没有增加时停止,将此处确定为纵坐标。

有时候两个方块相邻会出现识别失败,可以通过角度的方式来重新确定纵坐标。

$$T_x = S_x - \frac{|T_y-S_y|}{\sqrt{3}}$$

通过以上步骤就可以精准识别坐标点了,接下去需要将坐标距离转成按压时间。

我们先使用命令 adb shell input swipe 500 1600 500 1601 <time> 测出几组数据

# dist time
1 496 775
2 304 501
3 397 632
4 260 445
5 473 709

使用指数模型进行拟合

$$time = k \cdot dist^{p}$$

随便写个 PHP 脚本跑一下看看

微调参数后还没有出现失败的情况,最高连击 72 次!完美!

脚本地址: https://github.com/metowolf/JumpJumpHelper

允许署名转载,请注明作者及其文章链接。

注:本文内容来自互联网,旨在为开发者提供分享、交流的平台。如有涉及文章版权等事宜,请你联系站长进行处理。