简介面向微信“跳一跳”小游戏的 Python 破解源代码专为 64 位 Windows 电脑打造通过 USB 连接安卓手机即可自动完成跳跃适合想突破手动分数上限、研究图像识别与自动点击方案的玩家或开发者。资源共 55 个文件压缩包约 9.68MB包含 Python 主脚本、可直接运行的免环境版程序、编译后的中间文件、安卓调试桥及其依赖库还提供 17 个针对不同屏幕分辨率的 json 配置与 17 张运行截图方便使用者对照排查目录按主程序、配置、截图备份等模块划分整体结构清楚。随包附有中文说明文档与“使用流程——必读”文本完整交代了环境准备、手机调试模式开启、分辨率选择与脚本启动注意事项并特别提醒曲面侧屏设备需关闭侧屏以免干扰零基础也能按步骤跑通。目前已有 4544 人学习下载适合对安卓自动化操作感兴趣的学习者借鉴其触摸模拟、adb 调用与图像识别思路也可作为完整示例直接改造扩展。1. 这款“破解源码”不是破解Python 自动跳跃脚本到底做了什么从网上下载了一个号称“破解”的跳格子小游戏源码包解压之后我愣住了里面没有改内存的代码也没有绕过验证的补丁只有几个 Python 文件、一份 requirements.txt还有一张棋子的模板图片。这个“破解”实际上是自动玩游戏的辅助脚本——通过截图识别当前棋子和下一块跳板计算距离生成按压时长再调用 ADB 模拟触摸让棋子自动跳过去。别看名字带了破解二字技术上就是图像识别加自动化测试。对新手来说它能帮你理解 OpenCV、ADB 和 Python 的配合对熟手来说它是一套能拆开改的核心模板。下面我按“原理—跑通—调参—排坑—进阶”的顺序把这个源码包拆明白。2. 图像识别与坐标计算让代码找到棋子和下一块跳板2.1 游戏画面的坐标系与像素定位思路跳格子游戏的画面是固定视角棋子从当前方块跳到相邻方块。自动脚本要做的事就是在每次截图里确定两个像素坐标当前棋子中心点、目标方块中心点。这两个点决定了跳跃的方向和距离而跳跃距离又通过按压时长来控制。所以整个项目的核心不是“破解”而是把游戏画面抽象成坐标问题。截图在内存中是一个二维数组坐标从左上角 (0,0) 开始向右是 x 增大向下是 y 增大。ADB 的 input swipe 命令也使用同样的屏幕坐标所以图像识别得到的坐标可以直接用不需要做转换。正因为这样第一步就要保证截图和实际屏幕分辨率一致任何缩放都必须记录缩放比例否则后面坐标就会错位。定位思路常见有两种。一种是模板匹配预先截取一张棋子的局部图在整张截图中滑窗寻找最相似的位置。优点是不需要理解颜色语义只要外观不变就能找到缺点是分辨率变了、棋子换了皮肤就失效。另一种是颜色分割根据棋子的 HSV 颜色范围建立掩膜找连通区域。优点是对分辨率和尺寸不敏感更鲁棒缺点是需要找到合适的颜色阈值白色棋子或背景复杂时会翻车。我下载的这个源码包默认用模板匹配但我在使用中发现它的模板图片只有在原配的分辨率下才准换了手机就不行。所以本章后面我会把两种思路都讲清楚方便你改造。2.2 用 OpenCV 模板匹配锁定当前棋子模板匹配的原理是把模板图片在原始截图上从左到右、从上到下滑动计算每个位置的相似度得到一个相似度矩阵。opencv 的 matchTemplate 支持多种度量方式这里一般用 TM_CCOEFF_NORMED因为归一化相关性对整体亮度变化不敏感棋子在阳光下或阴影中都不会太离谱。import cv2 def find_piece(screen_img, template_pathpiece.png): # 读取模板灰度化有助于提升匹配稳定性 template cv2.imread(template_path, cv2.IMREAD_GRAYSCALE) if template is None: raise FileNotFoundError(模板不存在请先截取棋子模板) th, tw template.shape[:2] # 将截图也转为灰度减少颜色干扰 gray cv2.cvtColor(screen_img, cv2.COLOR_BGR2GRAY) # 模板匹配 res cv2.matchTemplate(gray, template, cv2.TM_CCOEFF_NORMED) _, max_val, _, max_loc cv2.minMaxLoc(res) # 置信度太低就认为没找到 if max_val 0.8: return None, None, max_val # max_loc 是模板左上角坐标换算成模板中心 cx max_loc[0] tw // 2 cy max_loc[1] th // 2 return cx, cy, max_val逻辑说明先将模板和截图转灰度是因为棋子颜色会随场景变化但轮廓和纹理比较稳定。matchTemplate 返回一个相似度矩阵minMaxLoc 取出最大值及其位置。阈值 0.8 是可调参数如果误识别率高可以提高到 0.85。如果棋子很小模板尺寸不要太大建议只包含棋子主体不要包含下面的阴影否则匹配位置会偏低。参数说明template_path 是模板文件路径最好放在 assets 目录下max_val 就是匹配置信度在调试时会输出这个值来判断当前模板是否合适。另一个容易踩坑的点是模板尺寸如果模板是 100x100 的 PNG而实际棋子在游戏画面里只有 80x80匹配置信度会非常低这时候不是调阈值能解决的必须重新截取模板。2.3 目标方块识别与按压时长换算目标方块的识别比棋子麻烦一些因为方块颜色多种多样。常见做法有两种如果游戏版本固定直接配置目标方块的 HSV 颜色区间如果方块颜色会变就找背景和方块的边缘。下面的代码采用“找白色背景的连通区域”的思路因为大多数版本的跳格子游戏背景是浅色方块本身颜色更深。import cv2 import numpy as np def find_target(screen_img, piece_x, piece_y): hsv cv2.cvtColor(screen_img, cv2.COLOR_BGR2HSV) # 提取低饱和度、高亮度的背景区域 lower np.array([0, 0, 200]) upper np.array([180, 30, 255]) mask cv2.inRange(hsv, lower, upper) # 在棋子右侧上方搜索避免把当前棋子当成目标 search_x0 piece_x 30 search_y0 max(0, piece_y - 350) search_y1 min(screen_img.shape[0], piece_y 20) search_region mask[search_y0:search_y1, search_x0:] contours, _ cv2.findContours(search_region, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) best None best_dist float(inf) for cnt in contours: x, y, w, h cv2.boundingRect(cnt) if w * h 1000: continue cx search_x0 x w // 2 cy search_y0 y h // 2 dist (cx - piece_x) ** 2 (cy - piece_y) ** 2 if dist best_dist: best_dist dist best (cx, cy) return best逻辑说明mask 提取的是接近白色的区域背景因此成为白色方块区域成为黑色。然后找外轮廓筛选面积大于 1000 的连通域。由于下一个目标方块总是在棋子的右上方或正右方我们从棋子右侧开始搜索且向上收缩搜索区域。这样可以把当前棋子底下的大方块排除因为它在搜索区域左侧之外。面积阈值 1000 是个经验值如果方块很小可以调低。参数说明lower 和 upper 是 HSV 的两个边界这个阈值不是通用的。如果游戏背景是浅蓝色或灰色需要先在第 4 章调试工具里取色再改这两个数组。findContours 在 OpenCV 4.x 里返回两个值在旧版本 3.x 里返回三个值所以源码里如果报错多半是版本不匹配把 contours, _ 改成 _, contours, _ 即可。按压时长换算是整个脚本里最关键的一行import math def calc_press_time(piece_x, piece_y, target_x, target_y, coefficient1.35): distance math.hypot(target_x - piece_x, target_y - piece_y) return int(distance * coefficient)逻辑说明math.hypot 返回两点之间的欧氏距离单位是像素。按压时长和这个距离近似线性关系coefficient 就是比例系数。这个系数不是物理常数而是跟屏幕密度、游戏版本、触摸采样率都有关。同一台手机换了游戏版本系数可能从 1.35 变成 1.45所以它必须放在配置文件里而不是写死在函数里。常见误用是有人直接把距离当成按压时间结果棋子飞出去。还有人用整条对角线距离而不用欧氏距离碰到斜向跳跃时就差一口气。这两种情况我在不同源码包中都见到过改过来之后基本就准了。3. 环境搭建与代码跑通ADB、依赖和第一个自动跳跃3.1 Python 依赖清单与安装命令源码包是基于 Python 3 的依赖很少opencv-python、numpy、Pillow。其中 OpenCV 负责图像识别numpy 做矩阵运算Pillow 用于读取部分图片格式。实际上 OpenCV 已经自带图像解码但源码里可能用 PIL 处理截图所以装齐比较稳妥。安装命令pip install opencv-python numpy Pillow如果机器上有多个 Python 环境建议用虚拟环境python -m venv venv source venv/bin/activate # Windows 下是 venv\Scripts\activate pip install -r requirements.txtrequirements.txt 里一般就是这三行没有多余依赖。安装过程如果遇到 opencv-python 下载慢可以换国内镜像源但这属于通用操作就不展开了。注意不要用 opencv-contrib-python包更大基础功能用不到。装完后执行 python -c import cv2; print(cv2.version) 确认版本我这边用的是 4.8 和 4.9都能跑。3.2 ADB 连接与设备状态检查ADB 是 Android 调试桥脚本通过它执行截图和模拟触摸。先下载平台工具解压后把 adb 所在目录加入 PATH或者直接在源码的 adb_util.py 里指定完整路径。检查连接是否成功adb devices正常情况下输出List of devices attached 1234567890abcdef device如果显示 unauthorized说明手机弹了授权框需要解锁手机点允许如果列表为空换一根能传数据的 USB 线或者检查开发者选项是否开启。无线调试也可以比如同一局域网手动连接adb connect 192.168.0.10:5555连接成功后执行一次截图命令验证adb exec-out screencap -p screen.pngWindows 终端可能把 PNG 二进制写坏建议在 Python 里用 subprocess 重定向输出到文件而不是用 cmd 重定向。源码包里的 pull_screenshot 函数就是这么做的def pull_screenshot(pathscreen.png): import subprocess with open(path, wb) as f: subprocess.run([adb, exec-out, screencap, -p], stdoutf)逻辑说明adb exec-out 会把截图二进制直接打到 stdoutPython 里通过 stdoutf 把字节写到文件比在 shell 里重定向更稳。注意不要用 adb shell screencap那样输出会混入终端控制字符图片会损坏。参数说明path 可以自己定义调试时我会用带时间戳的文件名比如 screen_20250101.png方便回溯。3.3 源码文件结构每个模块各司其职解压后的目录大概是这样的文件作用main.py主循环截屏、识别、计算、按压adb_util.py封装 adb 命令提供 pull_screenshot 和 jump 接口image_util.py封装 find_piece、find_target 等识别函数config.py全局参数按压系数、阈值、模板路径assets/piece.png棋子模板图片需要按真机截图截取requirements.txt依赖清单config.py 是调参入口里面几乎每个常量都有注释。比如PRESS_COEFFICIENT 1.35 PIECE_TEMPLATE assets/piece.png MIN_MATCH_CONFIDENCE 0.8 AREA_THRESHOLD 1000这些值看起来简单但决定了脚本能不能用。很多人在网上下的源码跑不起来八成是这几个参数没有跟着自己的设备改。我把 config.py 里的参数全部打印到控制台方便每次运行前确认当前值。尤其是 PRESS_COEFFICIENT每次调参后都要重新看一遍避免改错地方。3.4 第一次运行截图、识别、按压三步闭环整个主循环只有三步截屏找点按压。这里给一个可以直接跑的 main.py 简化版本import subprocess import time import cv2 from image_util import find_piece, find_target from config import PRESS_COEFFICIENT def pull_screenshot(pathscreen.png): with open(path, wb) as f: subprocess.run([adb, exec-out, screencap, -p], stdoutf) def jump(piece_x, piece_y, target_x, target_y): import math, subprocess distance math.hypot(target_x - piece_x, target_y - piece_y) press_time int(distance * PRESS_COEFFICIENT) subprocess.run([ adb, shell, input, swipe, str(piece_x), str(piece_y), str(piece_x), str(piece_y), str(press_time) ]) def main(): while True: pull_screenshot() screen cv2.imread(screen.png) px, py, conf find_piece(screen) if px is None: print(棋子识别失败等待后重试) time.sleep(0.5) continue target find_target(screen, px, py) if target is None: print(目标方块识别失败等待后重试) time.sleep(0.5) continue jump(px, py, target[0], target[1]) time.sleep(1.5) if __name__ __main__: main()逻辑说明jump 里的 input swipe 四个坐标前两个是起点后两个是终点这里起点终点都取棋子中心所以手指按住原地不动最后一个参数就是按压时长单位毫秒。模拟器上可能不能用 input swipe需要用 input touchscreen但真机优先用 swipe。参数说明sleep(1.5) 是因为跳跃动画和棋子落地需要时间如果画面还没稳定就截下一帧识别结果会错。如果你的手机帧率低或者游戏有拖影可以加大到 2.0。如果嫌慢可以等 1.2 秒但风险增加。第一次运行时建议不要直接刷分先跑两个跳跃用 debug 可视化确认识别点是否正确可视化方法在下一章会讲。4. 参数调优分辨率、按压系数和识别阈值4.1 分辨率适配模板图像与坐标缩放模板匹配最怕分辨率不对。同样的棋子在 1080P 屏幕上占 200 像素高在 720P 屏幕上只占 130 像素高模板还是 200 像素匹配必然失败。所以模板图片必须从当前设备真实截图里截取。截取方法先手动跑一次 pull_screenshot得到真实截图然后用图片编辑工具把棋子区域裁出来保存为 assets/piece.png。如果不想手动裁可以用 OpenCV 写一个小工具在截图里手动框选棋子import cv2 selecting False start (0, 0) end (0, 0) def on_mouse(event, x, y, flags, param): global selecting, start, end img param if event cv2.EVENT_LBUTTONDOWN: selecting True start (x, y) elif event cv2.EVENT_MOUSEMOVE and selecting: img_copy img.copy() cv2.rectangle(img_copy, start, (x, y), (0, 255, 0), 2) cv2.imshow(crop, img_copy) elif event cv2.EVENT_LBUTTONUP: selecting False end (x, y) roi img[start[1]:end[1], start[0]:end[0]] cv2.imwrite(assets/piece.png, roi) print(模板已保存) img cv2.imread(screen.png) cv2.imshow(crop, img) cv2.setMouseCallback(crop, on_mouse, img) cv2.waitKey(0)逻辑说明鼠标画框松开就保存。注意模板要只包含棋子本体不要包含太多背景或阴影否则匹配位置会偏移。参数说明screen.png 是之前截图得到的原始画面保存路径 assets/piece.png 要和 config.py 里的 PIECE_TEMPLATE 一致。如果一定要用一套模板兼容多分辨率可以先把截图等比缩放到模板对应的宽度计算坐标后再缩放回去。例如def scale_img(img, target_width): h, w img.shape[:2] scale target_width / w new_h int(h * scale) return cv2.resize(img, (target_width, new_h)), scale使用的时候将截图缩放到模板尺寸附近得到坐标后再乘 1/scale 还原。但缩放会损失精度我的建议是每台设备单独截模板别偷懒。不同设备即使分辨率一样屏幕圆角、导航栏占位也可能导致画面偏移模板匹配就可能偏几个像素。4.2 按压系数影响命中率的最大变量按压系数是整份源码里最“玄学”的值。同样的距离系数差 0.05落点就可能整体偏移十像素。为什么会这样因为物理引擎在不同帧率、不同设备上可能略有差异触摸事件的采样频率也会影响实际按压时长。调参方法先让脚本自由跑三次观察落点。如果每次跳到目标中心的前方也就是跳过头说明系数偏大如果落在后方说明系数偏小。每调整一次系数重启脚本再观察。调整幅度跳过头coefficient - 0.02跳不够coefficient 0.02我习惯用二分法先设 1.3观察偏差再设 1.5观察偏差如果 1.3 偏后、1.5 偏前就试 1.4如此反复几轮就能收敛。还有一个小技巧记录上一次跳的落点和预期点计算误差值自动修正系数。但大多数源码没有这个功能需要自己加。下面是不同设备经验值分辨率按压系数参考范围720x12801.10~1.251080x19201.30~1.451440x25601.35~1.50注意这个范围只是起点就算同分辨率不同手机也可能不一样。不要盲目抄别人的 config.py。注意按压系数不要从别人的配置文件里直接抄必须在自己的设备上标定一次。我在 1440x2560 手机上用 1.38 很准换到另一台同分辨率的手机后竟然偏了 30 像素最后标定出来是 1.43。4.3 识别阈值与干扰物排除HSV 阈值主要用于目标方块识别。如果识别时把背景方块误认为目标或者把棋子的阴影误认为目标需要调整颜色区间。最直接的方法是在调试窗口打印点击位置的 HSV 值import cv2 import numpy as np def on_mouse(event, x, y, flags, param): if event cv2.EVENT_LBUTTONDOWN: hsv cv2.cvtColor(param, cv2.COLOR_BGR2HSV) print(BGR:, param[y, x], HSV:, hsv[y, x]) img cv2.imread(screen.png) cv2.imshow(debug, img) cv2.setMouseCallback(debug, on_mouse, img) cv2.waitKey(0)逻辑说明点击画面任意位置控制台会输出该点的 BGR 和 HSV 值。分别点击背景白色区域、方块颜色区域、棋子阴影区域记录 HSV 三个分量然后设置合理的下限和上限。注意 HSV 的 H 分量在 OpenCV 中是 0-180不是 0-360很多人在这里翻车。如果背景颜色和方块颜色很接近比如白色方块上面的“提取背景做反向”方法就会失效。这时可以改成 Canny 边缘检测配合感兴趣区域edges cv2.Canny(cv2.GaussianBlur(hsv, (5, 5), 0), 50, 150)然后找近似的矩形轮廓。但这套方法需要更多的后处理不如固定色板来得快。如果游戏版本新加了彩色动态背景模板匹配和 HSV 都容易失效这时我一般会手动截一张目标方块的模板用模板匹配找目标方块代价是每张新方块都要维护模板麻烦。5. 避坑指南从跑不起来到稳定刷分5.1 ADB 连接不上设备现象adb devices 列表为空或者显示 unauthorized。脚本启动后一直卡在截图失败。原因手机没开启 USB 调试、驱动没装好、或者数据线只支持充电不支持数据传输。unauthorized 则是因为手机弹窗没有确认。解决换一根正规数据线在开发者选项里开启 USB 调试插入手机后等待弹窗勾选“始终允许使用这台计算机进行调试”然后重新执行 adb devices。如果仍然不行执行 adb kill-server 后重新启动 adb 服务adb kill-server adb devices连接成功后先用前面提到的 adb exec-out screencap 测一张截图确认输出文件能被 OpenCV 正常打开。如果截图文件大小只有几十字节多半是 adb 命令没执行对优先排查这步而不是直接改识别逻辑。5.2 棋子识别位置漂移现象find_piece 返回的坐标不在棋子中心有时在阴影上导致跳跃方向偏。原因模板图片包含了太多背景或者截图与模板分辨率不一致。模板匹配会把最相似的位置当作棋子如果模板里有半个阴影匹配中心就会偏向阴影方向。解决用第 4 章的框选工具重新截模板只保留棋子本体。然后把 MIN_MATCH_CONFIDENCE 提高到 0.85如果识别置信度低就丢弃这一帧。另外如果棋子位置居左或居右考虑在匹配前只截取棋盘区域减小搜索范围。我之前遇到一个更隐蔽的情况游戏画面顶部有状态栏截图包含状态栏时棋子整体下移了几像素模板匹配就把状态栏里的圆形图标当成棋子。后来我把截图顶部裁掉一行识别立刻稳定了。5.3 按压时间总差一截现象棋子每次跳过去都落在目标边缘距离把握不准。原因按压系数不对或者 input swipe 的 duration 在不同设备上存在系统级延迟。同一个按压时间在不同手机上的实际触摸时长可能有几十毫秒差异。解决用固定距离标定法让棋子站在一个方块上手动计算到相邻方块的距离和按压时间多测几次求平均值。然后把这个平均值和距离反推系数。更简单的方法是逐次微调系数每次调整 0.02直到偏差小于 5 像素。不要贪快一步调整 0.05 很容易过冲。如果标定后仍然时准时不准检查背景应用是否导致系统掉帧。我关掉手机上的省电模式和后台自动清理后按压时间就稳了。5.4 USB 授权弹窗打断循环现象脚本跑了几十次后突然停止手机屏幕亮着界面是 USB 调试授权框。原因部分手机即使勾选了“始终允许”每次重新插拔或重启后仍然会再弹一次。脚本因为点击被拦截游戏画面冻结识别也无从谈起。解决使用无线 ADB 连接减少插拔。或者将手机设置为“保持唤醒”并且通过命令授权adb pair 192.168.0.10:5555 adb connect 192.168.0.10:5555pair 需要输入配对码配对成功后重新连接可以避免每次弹窗。注意无线连接也有掉线风险最好用一台专门跑脚本的备用机。如果只有一台主力机可以在脚本里加一个异常保护检测到 adb 连接断开后自动 reconnect。5.5 游戏版本更新后脚本全部失效现象之前好好的某天开始棋子识别失败、目标方块误识别率暴增甚至按压系数也变了。原因游戏更新改了棋子造型、方块颜色或物理参数。模板匹配和 HSV 阈值都是基于旧版本视觉特征写的版本一变自然失效。解决把更新前的配置备份然后重新截取模板重新采集颜色阈值重新标定按压系数。如果游戏连物理都改了按压系数也要重新标。建议保留一个配置文件历史记录比如 config_20250101.py这样每次更新只需要对比参数差异不用从零开始。我在一次游戏版本更新后发现方块的高度变矮了面积阈值 1000 直接过滤掉了所有目标。把 AREA_THRESHOLD 从 1000 改成 500 才恢复正常。所以版本更新后不要只盯着模板所有在 config.py 里的经验值都要再过一遍。6. 进阶把脚本改造成离线压测与分数统计工具6.1 批量处理历史截图离线校验识别算法在真机上反复跑脚本太费时间更高效的做法是提前收集一批历史截图离线调试识别算法。方法是把截图放到 test 目录遍历每张截图做识别再画框输出到 debug 目录import glob import os import cv2 from image_util import find_piece, find_target os.makedirs(debug, exist_okTrue) for path in glob.glob(test/*.png): img cv2.imread(path) px, py, conf find_piece(img) if px is None: print(f{path}: 棋子识别失败 {conf:.2f}) continue target find_target(img, px, py) if target: cv2.circle(img, (px, py), 5, (0, 0, 255), -1) cv2.circle(img, target, 5, (0, 255, 0), -1) cv2.putText(img, f{conf:.2f}, (px 10, py - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 1) cv2.imwrite(fdebug/{os.path.basename(path)}, img)逻辑说明画红点是识别出的棋子位置画绿点是目标方块位置文本显示匹配置信度。这样不用等真机跳跃就能看出哪张图的识别框偏了。调整参数后重新跑一遍所有结果对比一次比在手机上边跑边观察快得多。6.2 增加跳跃日志与分数估算在 jump 函数里把每次跳跃的坐标、距离、按压时间写入 csv方便后续做系数回归import csv, time def log_jump(piece_x, piece_y, target_x, target_y, press_time): with open(jump_log.csv, a, newline) as f: writer csv.writer(f) writer.writerow([time.time(), piece_x, piece_y, target_x, target_y, press_time])分数估算基于跳跃次数和落点。跳到方块中心加 2 分落在边缘加 1 分。需要知道落点是否中心可以对比目标方块矩形的中心与实际落点坐标。但脚本通常不知道落点只能在下一帧截图里判断棋子的位置是否接近上一帧目标中心。这部分实现起来会复杂一些简化的做法是按下落点偏移概率估算平均分数日志里记录每次按压是否成功。我的习惯是把日志和调试图都保存下来每次调参后跑一轮离线压测看识别成功率和落点偏差再决定要不要调整。从那以后我每次下载这类“破解源码”第一件事不是急着运行而是先看 config.py 和模板图片是否匹配自己的设备再跑一轮离线测试。很多所谓破解脚本失败不是代码不行是环境和参数没对齐。希望帮到你。本文还有配套的精品资源点击获取