背景
微信「跳一跳」是 2017 年风靡一时的小游戏。虽然热度早已过去,但作为一个计算机视觉和自动化控制的练手项目,它的技术价值依然很高。
本项目基于 GitHub 上 14,000+ Stars 的开源项目 wangshub/wechat_jump_game, 针对 vivo X200 Pro(2800×1260 分辨率)做了完整的适配工作。
技术原理
整个自动化流程分为五个步骤:
- 截图:通过 ADB 命令获取手机屏幕截图
- 找棋子:根据棋子特有的 RGB 颜色范围(R:50~60, G:53~63, B:95~110)定位棋子底部中心
- 找目标方块:扫描像素行,检测与背景色差异超过阈值的区域,找到下一个方块的顶面中心
- 计算距离:利用游戏等距视角的对称中心,从方块 X 坐标反推 Y 坐标,得到精确的中心点位置
- 模拟按压:基于物理抛物线模型将像素距离转为按压时长,通过 ADB 模拟触屏
按压时间的计算并非简单线性,而是基于物理公式:
scale = 0.945 × 2 / head_diameter
actual_distance = distance × scale × (√6 / 2)
press_time = (-945 + √(945² + 4×105×36×actual_distance)) / (2×105) × 1000
vivo X200 Pro 适配工作
1. 分辨率配置
X200 Pro 屏幕为 2800×1260,像素密度 560 DPI,与常见的 1080p 或 2K 分辨率都不同。需要创建专门的分辨率配置文件:
| 参数 | 默认值 (1080p) | X200 Pro 适配值 | 说明 |
|---|---|---|---|
| under_game_score_y | 300 | 440 | 分数栏下方 Y 坐标,按高度比例缩放 |
| piece_base_height_1_2 | 20 | 30 | 棋子底盘半高,按高度比例缩放 |
| piece_body_width | 70 | 85 | 棋子身体宽度,按宽度比例缩放 |
| press_coefficient | 1.392 | 1.0 | 按压系数,经多次实测校准 |
2. 按压系数校准
这是最关键的适配工作。系数不对,不是跳太远就是跳太近,直接导致游戏失败。
校准过程:以默认系数 1.392 为起点,发现跳得太远;逐步降低到 0.65,又跳得太近。最终通过实际测算——对同一距离分别计算不同系数下的按压时长,锁定 1.0 为最优值。
3. Python 3.14 兼容性修复
原项目发布于 2018 年,部分代码在 Python 3.14 上存在兼容性问题:
io.StringIO无法处理二进制截图数据,改为io.BytesIO- ADB 截图管道模式在 Windows 下存在 CR/LF 换行符问题,改为文件拉取模式(
SCREENSHOT_WAY=0) subprocess.Popen在 Python 3.14 下的参数传递方式调整
4. 触屏坐标适配
ADB 模拟按压的坐标点需要落在屏幕范围内。X200 Pro 竖屏为 1260×2800,按压坐标设为 (630, 1600),即屏幕中央偏下位置。
小白使用教程
即使你没有编程基础,跟着下面步骤一步步来,也能把跳一跳跑起来。
第 1 步:装 Python
- 打开 python.org/downloads
- 下载最新版 Python(Windows 选 64-bit installer)
- 安装时勾选「Add Python to PATH」(重要!)
- 安装完成后,打开终端(Win+R 输入
cmd),验证:
python --version
正常应显示 Python 3.x.x。
第 2 步:装 ADB 工具
ADB 是 Android 调试桥,用来和手机通信。
- 下载 Android Platform Tools(Windows 版 zip)
- 解压到
C:\adb\目录 - 把
C:\adb\platform-tools加入系统 Path:- Win+S 搜索「环境变量」→ 编辑系统环境变量
- 环境变量 → 系统变量 → Path → 新建 → 粘贴
C:\adb\platform-tools - 确定保存
- 重新打开终端,验证:
adb version
显示版本号即安装成功。
第 3 步:手机开 USB 调试
vivo X200 Pro 操作路径:
- 设置 → 更多设置 → 关于手机 → 版本信息
- 连续点击「软件版本号」7 次 → 提示「已进入开发者模式」
- 返回:设置 → 更多设置 → 开发者选项
- 打开 「USB 调试」开关
- 用数据线连接手机和电脑
- 手机弹出「允许 USB 调试」→ 勾选「始终允许」→ 确定
验证连接:
adb devices
应显示一串设备 ID + device 字样。如果没有,换一根数据线或换一个 USB 口试试。
第 4 步:下载项目
git clone https://github.com/wangshub/wechat_jump_game.git
cd wechat_jump_game
如果没装 Git,可以直接在 GitHub 页面点「Code → Download ZIP」解压。
第 5 步:放入 vivo X200 Pro 配置文件
在项目 config/ 目录下创建 2800x1260/config.json,内容如下:
{
"under_game_score_y": 440,
"press_coefficient": 1.0,
"piece_base_height_1_2": 30,
"piece_body_width": 85,
"swipe": {
"x1": 630, "y1": 1600,
"x2": 630, "y2": 1600
}
}
也可以在终端输入以下命令一键完成:
mkdir config\2800x1260
echo {"under_game_score_y": 440, "press_coefficient": 1.0, "piece_base_height_1_2": 30, "piece_body_width": 85} > config\2800x1260\config.json
第 6 步:安装依赖 + 运行
pip install Pillow six
python wechat_jump_auto.py
运行前确保:
- 手机已连上电脑(
adb devices能看到设备) - 微信跳一跳已打开并开始游戏
- 棋子已落到第一个方块上(不要在空中截图)
程序启动后会连续自动跳跃,按 Ctrl+C 停止。
跳不准怎么办?
修改配置文件中的 press_coefficient 即可:
- 跳远了(棋子飞过方块)→ 减小系数,比如改
0.95 - 跳近了(棋子没够到)→ 增大系数,比如改
1.05
每次改完保存,重新运行脚本即可。微调建议 0.05 步进。
2025 旗舰手机参数参考
以下参数根据各机型屏幕规格计算,press_coefficient 建议在此基础上微调(±0.05)。
| 品牌 | 机型 | 分辨率 | press_coefficient | piece_body_width | under_game_score_y |
|---|---|---|---|---|---|
| vivo | X200 Pro | 1260×2800 | 1.00 ✅ 已实测 | 85 | 440 |
| X200 Ultra | 1440×3168 | 1.00 | 95 | 500 | |
| 小米 | 15 Ultra | 1440×3200 | 1.00 | 95 | 500 |
| 小米 15 | 1200×2670 | 1.05 | 80 | 420 | |
| OPPO | Find X8 Pro | 1264×2780 | 1.00 | 85 | 435 |
| Find X8 | 1264×2780 | 1.00 | 85 | 435 | |
| 华为 | Mate 70 Pro | 1312×2832 | 1.00 | 85 | 440 |
| Mate 70 Pro+ | 1312×2832 | 1.00 | 85 | 440 | |
| 荣耀 | Magic7 Pro | 1312×2848 | 1.00 | 85 | 445 |
| Magic7 | 1264×2800 | 1.00 | 85 | 440 | |
| 三星 | S25 Ultra | 1440×3120 | 1.00 | 95 | 490 |
| S25 | 1080×2340 | 1.38 | 75 | 365 | |
| 一加 | 13 | 1440×3168 | 1.00 | 95 | 500 |
| Apple | iPhone 16 Pro Max | 1320×2868 | 1.00 | 85 | 450 |
| iPhone 16 Pro | 1206×2622 | 1.05 | 80 | 410 |
• 2K+ 机型(高度 ≥ 2800px):系数 ≈ 1.00,body_width ≈ 85~95
• 1.5K 机型(高度 2600~2800px):系数 ≈ 1.05,body_width ≈ 80
• 1080P 机型(高度 ~2340px):系数 ≈ 1.38,body_width ≈ 75
• 配置目录命名:
config/{高度}x{宽度}/(如 config/2800x1260/)•
under_game_score_y ≈ 300 × 高度 ÷ 1920•
piece_body_width ≈ 70 × 宽度 ÷ 1080• ⚠️ 标注"已实测"的为实际校准值,其余为理论推算,建议首次使用时微调系数
踩坑记录
在做适配之前,我尝试自己从头写图像识别算法,踩了不少坑:
- 颜色差分法:通过采样背景色、找"非背景"像素来定位方块。问题是灰色方块和背景色太接近,需要不断调整阈值,不稳定。
- Canny 边缘检测:改用边缘检测可以避免颜色依赖,但阈值需要根据不同场景调整,远处的小方块边缘太弱,检测不到。
- 方块中心计算:简单的顶边+底边/2 不够准确,需要考虑等距视角下的透视变形,用加权质心法才得到稳定结果。
最终的教训是:别自己造轮子,直接用经过验证的开源方案,把精力放在适配和调优上。
技术栈
| 组件 | 技术 | 用途 |
|---|---|---|
| 图像采集 | ADB screencap | 截取手机屏幕 |
| 图像处理 | Pillow (PIL) | 像素级颜色读取、位置计算 |
| 距离建模 | 物理抛物线公式 | 将像素距离转换为按压时长 |
| 触控执行 | ADB input swipe | 模拟手指长按屏幕 |
| 主控逻辑 | Python 3.14 | 流程编排、异常处理 |
本项目基于 wangshub/wechat_jump_game(MIT 协议),感谢原作者的出色工作。
⚠️ 微信对作弊行为有严格检测,本项目仅供计算机视觉与自动化技术学习研究,使用可能导致分数清零或账号受限。