一开始想用按键精灵写,但是安卓模拟器一直跑不起来跳一跳。后来偶然看到 Github 上 wangshub/wechat_jump_game ,刚好Python比较熟悉,就仔细看了下。从Issues里找到了安卓运行的方法。
跑起来之后就研究了一下代码,还是蛮有启发的。但因为之前构思按键精灵有过一个思路,比现有的这个方法简化不少。于是改了一下代码。这里记录一下思路。
PS: 本代码目前只处理了安卓,但核心算法部分和iOS是通用的。
- 找到棋子的x,y
- 找到目标平台中心点的x,y
- 计算两点像素距离(橙色)
- 按压时间 = 距离 × 系数
缺点:这个方法得到的结果是直线的像素距离,于是不同屏幕尺寸下,感官上相同的跳跃距离,像素距离确是不同的,这就需要手动设置不同系数(一大堆的congif)。
思考:能不能更直观地设置跳跃所需要的时间?
实测 4:3/16:9/2:1 三类屏幕比例,得到如下结果。
- 根据我们上一节提到的宽度适配原则。
- 假设两个方块离得非常远,刚好斜着隔开整个屏幕,跳跃时间假设是1秒。
- 那么如果把目标平台移近一半,那跳跃需要时间是不是就是0.5秒呢?
- 也就是说 把跳跃距离,从像素的绝对距离,转化为相对的比例关系。
- 另外,因为游戏视角固定。
- 所以斜边的比例关系,可以用 X 轴的水平的比例关系替代。
- 那么 跳跃距离 就转化为:起点到目标的水平距离 和 屏幕宽度 的比例关系。
- 不再需要获取 Y 轴。
- 按压时间 = 跳全屏宽度需要的时间 × (起点和目标的横向距离 / 屏幕宽度)
distanceX = abs(board_x-piece_x) #起点到目标的水平距离
shortEdge = min(im.size) #屏幕宽度
jumpPercent = distanceX/shortEdge #跳跃百分比
jumpFullWidth = 1700 #跳过整个宽度 需要按压的毫秒数
press_time = round(jumpFullWidth*jumpPercent) #按压时长
优点:省略了所有 Y 轴的取值,并且自适应所有设备。(实测 4:3/16:9/2:1都成功。原方案的所有配置文件都不需要了。)
- 上一次从另一个方向跳过来且未落在中心
- 可能下次起跳位置需要修正(紫色)
- 不过误差并不大,除非当前格子很大。
- 加上还有模拟器卡顿或者其他细微的影响,所以这点偏移基本忽略,目前没有看到方案适配这个。
之所以不必纠结误差,因为即使每次偏移中心10%,不考虑平台大小,也要连续累积10次才会掉落。
也就是棋子要往一个方向跳10次,概率(1/2)^(10-1)=1/512
,其实很低的。
实际过程中,模拟器卡顿掉帧对我来说影响更大。
- 我用的夜神模拟器。需要在【多开管理】里新建一个安卓5.1才可以运行小游戏。默认的安卓4.4.2运行会闪退。
- 需要额外安装 adb,然后把安装好的
adb.exe
,复制覆盖掉~/nox/bin
下面的nox_adb.exe
和adb.exe
。 - 环境配置添加
~/nox/bin
- 从多开管理中重启模拟器。
- 安装依赖
pip install -r requirements.txt
- 到模拟器打开跳一跳,进入游戏界面。
- 运行脚本
python wechat_jump_auto_slim
就会自动玩了。 - 运行的话只需要这单个文件就可以了
https://github.com/Erimus-Koo/wechat_jump_game
还搞不懂Github怎么用,不晓得怎么提交回去,就先这样吧。
- 更新为内存IO,不再写入根目录文件,减少磁盘IO。(其实是因为读写中途经常和onedrive起冲突)
- 更新了随机时间,扩大了点击的随机范围。但是发现腾讯很可能搞了服务器黑名单(详见跳一跳外挂屏蔽规则),就先凉着吧。
- 从抓包数据看,这个版本已经绕过作弊检测了。# 958 2018-01-09 # 1053 实测防ban成功。
- 又把readme给细化了一遍。目前花费的时间,写代码 < 写说明 < Pull Request ,也是醉了。
微信 小程序 跳一跳 python 外挂