以程序员的角度玩微信跳一跳

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

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

fail

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

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

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

chess

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

chess_scan

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

chess_scan_1

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

chess_scan_2

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

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

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

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

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

# dist time
1 278 444
2 301 493
3 403 608
4 154 273
5 496 775
6 304 501
7 397 632
8 260 445
9 473 709
10 143 257
11 543 802
12 666 953
13 618 884
14 507 794

使用指数模型进行拟合

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

mathematica

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

jump

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

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


最后感谢一下把我文章抄走的网站

http://www.sohu.com/a/214275441_309070
搜狐网,删除作者署名,删除 GitHub 链接,删除原文链接

本文采用 CC BY-NC-SA 3.0 Unported 协议进行许可
本文链接:https://i-meto.com/wechat-jump-game/