微信“跳一跳”外挂制作历程
最近微信出了个“跳一跳”小游戏还挺火的,但是我这种手残人士,小手一滑,棋子就不知道飞哪儿去了。那我气啊,排行榜得拉到底才能看到我的名字,手残肯定不是一两天能解决的,那就写个挂呗,让电脑精准到毫秒给我来按屏幕,那岂不是美滋滋。
0. V1.0版人工不智能外挂
这两天在网上看到过几个“跳一跳”辅助工具,有些人做了机器手指,每次跳之前用尺量一下两块方块之间的距离,然后根据这个距离机器手指按下相应的时间,棋子就成功跳到了下一个方块。
这种方法其实挺有意思的,这种机器人之类的玩意儿应该挺好玩的,但一来我没有设备,买回来用一次压箱底也有点败家,二来我对这东西也不了解,但感觉时间控制上应该没办法做到特别精准,三来,我有adb啊,我要机器人做啥。
Adb全称Android Debug Bridge,做过移动开发的一般都用过。经过这样那样*()@……)¥&%@!*%一系列的操作,在cmd中输入adb,看到图1所示的结果,就说明adb能用了。
图1 adb运行成功
然后拿出你的安卓手机,进入开发者模式(一般在关于手机里找个版本之类的东西猛戳一顿就行),打开USB调试,连上电脑,在cmd中输入adb devices,看到图2所示的结果,那么手机和adb就连上了。
图2 设备连接成功
Adb里的功能命令是相当之多,因为玩“跳一跳”是要长按屏幕然后释放,来实现棋子的跳跃,因此这里我们想做到的是通过adb向手机发送一个能控制长按时间的长按指令,那么在adb shell中输入input看一下,会看到这样的结果:
The sources are:
keyboard
mouse
joystick
touchnavigation
touchpad
trackball
dpad
stylus
gamepad
touchscreen
The commands anddefault sources are:
text <string> (Default:touchscreen)
keyevent [--longpress] <key codenumber or name> ... (Default: keyboard)
tap <x> <y> (Default:touchscreen)
swipe <x1> <y1> <x2><y2> [duration(ms)] (Default: touchscreen)
press (Default: trackball)
roll <dx> <dy> (Default: trackball)
而这里我们需要的就是swipe <x1> <y1> <x2> <y2> [duration(ms)](Default: touchscreen),通过x和y来控制按的位置,也就是坐标。其实swipe是滑动指令,但是这个指令可以设置duration(ms),精确到毫秒的控制按压时间,所以这里就用这个滑动指令。
Adb能用了,指令也知道了,那就打开“跳一跳”试一下吧。开始游戏后,在adbshell中输入input swipe100 100 100 100 300,意思就是从(100,100)位置滑动到(100,100)位置,耗时300ms,发现棋子果然跳了出去,不过似乎弹跳和我差不多,跳了一个火柴盒就掉下去了。很显然,这里最关键的参数就是长按时长,经过多次实验,按压时长和跳出距离的关系大概是:
T=distance(mm)*23(ms/mm)
这个distance靠尺子量,这里要感谢我学机械制图时候那套尺子我留到今天还没仍,以后给我孙子继续用,毕竟小时候我爷爷就给过我一套这样的尺子。23这个数字应用是因人而异的,每款手机屏幕大小是有差异的,直接在屏幕上用尺子量出的绝对距离和参数的关系肯定也是不同的。一般来说应该在20左右。
用这种方法很难跳到下一块方块的中心点,因为尺子量出来的距离也不怎么准,23这个系数肯定也不精确,但这种方法至少能保证不死,每次有个1分,碰到井盖魔方便利店唱片还能加个分,耐心足够的话排行榜第一唾手可得。
不过这个V1.0版太蠢了,拿出来都要让人笑话,于是乎,V2.0版急需上线,不过到点了,我上传到CSDN之后就要吃晚饭了,下次再写吧。