WechatJump

adb + pillow + opencv + sklearn 实现的微信跳一跳机器人,分数可达 30 万以上。

反对一切使用外挂的行为,该项目只为学习目的,没有加入反作弊代码,以后也不会有:)

30万分数

[TOC]

命名约定

为便于描述,做以下约定:

命名约定

特性

与年初的跳一跳机器人相比,进行了以下改进:

投影距离

使用的技术和库

使用说明

环境准备

brew install opencv
brew cask install android-platform-tools

设置项

在项目根目录 run.py 中,有几个配置项需要修改:

另外,如果选择展示标注数据的 RGB 图像,还需要向 assests 目录中放入 TTF 字体文件(需支持中英文),并命名为 font.ttf,用于标注图像。由于版权问题,项目中不包含该字体文件。

分辨率

由于模版匹配的特性(踩过的坑第 2 点),不同分辨率手机可能需要重新采集模版图片,模版图片在 assests 目录下。

本项目在分辨率为 2160*1080 的小米 6x 上运行正常,理论上相同分辨率的手机都可以直接使用项目自带的模版图片,无需重新采集。

运行

将跳一跳小程序打开,并点击开始游戏按钮进入游戏界面。运行:

python3 run.py

输出数据格式为:

[上次跳跃实际距离 pixel] [上次跳跃按压时间 ms] [上次跳跃是否跳中棋盘中心]

例如:

293.0696181049753 445 True

表示上次跳跃按压屏幕 445 ms,实际跳跃距离为 293.0696181049753 像素,且跳中了棋盘中心。

该数据格式与训练数据格式相同,因此程序输出数据可保存用作下次启动程序时的模型训练数据。

建议运行时将其保存到文件中:

# -u 使 stdout 直接输出,不缓存
python3 -u run.py > run.log

Show Time

最好成绩

目前运行到最高的成绩已经超过 30 万(见上图),跑了一晚上没有要停的意思,只能 Ctrl + C 了,理论上分数无上限。

后续再测试每小时大概能跳 23000~24000 分。连跳中心的连击中断造成了一定的分数损失。

线性回归拟合

线性回归

多项式回归拟合(degree=7)

多项式回归

踩过的坑

  1. 由于图像坐标系从左上角开始,Y轴在向下的方向上是递增的,所以斜率与普通直角坐标系相反。也就是说,从左下到右上方向的直线实际为负斜率。
  2. OpenCV 模版匹配对缩放图片处理效果不好,导致从小程序文件解包出来的棋子图像无法使用,必须获取当前分辨率下的棋子图像和中心点图像作为模版;

还可以改进的地方

  1. 使用并发同时进行上次跳跃评估和本次跳跃计算,提高运行速度;
  2. 自动适配不同分辨率的手机屏幕;