Python+OpenCV+ADB实现跳一跳辅助器:从图像识别到自动跳跃实战
简介这份适配Windows系统的微信跳一跳辅助工具资源以ADB调试与Java编程为核心面向希望了解自动化游戏辅助实现原理的开发者、Android入门学习者以及追求高分的玩家。包体共14个文件压缩后大小仅1.26MB轻巧紧凑包含Java源码、class字节码、工程配置文件以及多张窗口截图与步骤图示可让读者直接查看实现逻辑无需额外整理目录。学习热度方面已有1605人浏览过该资源具备一定的参考价值。通过源码与截图读者能掌握在Windows系统中配置ADB环境、连接安卓设备、安装辅助程序并触发自动跳跃的完整技术路径同时也能学习到如何读取手机屏幕信息、计算落点距离并模拟点击的简易自动化思路。这套资源特别适合用来作为Android设备调试、命令行工具应用和轻量级游戏辅助开发的入门实战参考为后续深入相关项目提供了扎实的起点。1. 为什么Windows上还要自己写一个跳一跳辅助器周末打开微信小程序想冲个排行榜跳一跳玩到后面几百步每一下都得盯着方块边缘算距离手指按久了又酸又容易抖。有人选择纯手动有人直接用辅助器自动跑分。要说明的是这个辅助器并不需要去逆向微信的协议它做的事情和你在屏幕上看到的一样截一张图判断棋子该跳多远然后模拟一次按压。Windows上做这件事比手机上更方便因为有完整的桌面环境来跑图像识别和调试脚本ADB一条数据线就能把手机屏幕实时拉过来。这个方案适合想接触图像识别、自动化脚本又不想上来就啃复杂项目的开发者新手照着能跑通老手也能在参数和边界上找到可折腾的点。2. 辅助器的核心原理从截图到按压时长的换算整个辅助器只有两个核心问题看清楚按准时长。看清楚靠图像识别按准时长靠距离和按压时间的线性关系。跳一跳的画面相对简单没有复杂光照和动态模糊所以识别方案可以很直接先用颜色特征把棋子挖出来再用边缘特征找下一个落脚点。这一章先把这两个问题的原理讲透后面写代码才有依据。别急着搬代码先搞懂每一步为什么这么做后面调参时才不会瞎试。2.1 识别棋子找底部的中心点跳一跳里的棋子是一个多面体从截图看它的颜色和背景有明显区别。常见做法是把截图从BGR转到HSV色彩空间然后根据棋子的颜色范围生成掩膜再用轮廓检测找到棋子的区域。为什么用HSV而不用RGB因为HSV把颜色和亮度分开手机截图在不同光照下会有轻微色偏HSV下只需要调H色调和S饱和度范围对V亮度容忍度大很多。我试过直接用RGB阈值只要手机亮度一变就识别失灵换成HSV后稳定多了。下面是识别棋子的核心代码import cv2 import numpy as np img cv2.imread(screen.png) hsv cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # 棋子颜色范围实际值建议用截图里的像素点取色 lower np.array([0, 0, 100]) # H范围S范围V下限 upper np.array([20, 255, 255]) # H上限S上限V上限 mask cv2.inRange(hsv, lower, upper) contours, _ cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) largest max(contours, keycv2.contourArea) # 取棋子底部中心轮廓的最低点 x, y, w, h cv2.boundingRect(largest) bottom_x x w // 2 bottom_y y h这段代码先读图再转HSV然后通过inRange过滤出所有符合棋子颜色的像素形成一张二值掩膜。findContours会在掩膜上找到所有连通区域max取面积最大的那个作为棋子。棋子底部中心用轮廓的外接矩形下边中点表示因为按压模拟点击的位置就是棋子的底边中心这比用整个轮廓的重心更准。重心会把位置抬到棋子的中部按下去时模拟的按压点就不在底边跳跃方向会偏。参数说明lower和upper是HSV阈值是识别准不准的关键。我一般会先用画图工具打开截图用取色器在棋子颜色最典型的区域采几个点记录H、S、V值再上下浮动10到20作为范围。这里写的[0, 0, 100]是红色系棋子的默认范围如果你的手机截图偏暗V下限要调低到60左右如果棋子是白色S下限要调小因为白色饱和度很低。此外findContours返回的轮廓在OpenCV不同版本里结构略有差异但cv2.findContours在3.4以上版本返回两个值直接解包即可。2.2 识别目标落点找颜色差异明显的区域目标落点比棋盘背景高亮或者颜色截然不同。常见方法有两种一种是沿着棋子位置斜上方扫描找颜色突变的位置另一种是用边缘检测找到下一个方块的边界。第二种更稳定因为方块边缘在图像上总是有梯度的。第一种对纯色背景有效但遇到背景里有类似颜色就会误判。我推荐用边缘检测它对颜色不敏感只抓结构特征。用Canny边缘检测和霍夫变换找方块轮廓是常见做法但对于跳一跳这种方块边缘非常规整的场景直接用像素行扫描反而更简单。先对ROI区域做Canny然后从下往上找第一条完整的横向边缘这条边缘的上下就是目标方块的上表面gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) edges cv2.Canny(gray, 50, 150) # 只保留棋子附近的边缘减少干扰 x0, y0 bottom_x, bottom_y roi edges[y0 - 300:y0 - 50, x0:x0 400] # 找落点从底部向上扫描第一个白色边缘行的中心 rows np.where(roi.any(axis1))[0] if len(rows) 0: target_y y0 - 300 rows[-1] row_coords np.where(roi[rows[-1]] 0)[0] target_x x0 row_coords.mean().astype(int)逻辑是这样的把截图转灰度Canny提取边缘。然后只关注棋子右上方的一块区域roi因为下一个方块总是往右上方延伸。从ROI底部向上找最后一条完整的边缘线那条线就是目标方块的边界取它的中点作为落点。这里的rows是ROI中每一行是否有白边像素的索引rows[-1]是离棋子最近的那条边缘也就是方块的下边缘。参数说明Canny的两个阈值50和150控制边缘敏感度。调太低会把噪音也当成边缘调太高可能漏掉浅色方块。我一般先保持50/150如果背景复杂就升到80/200。roi的大小和位置需要按棋子坐标动态调整不能写死否则分辨率一变就失效。特别注意roi的纵向范围从y0 - 300到y0 - 50覆盖了棋子高度上方的大部分区域但不会把屏幕顶部无关元素圈进来。2.3 距离到按压时长的线性关系识别出棋子和目标落点后距离就是两点欧几里得距离。按下时间的经验公式是按压毫秒数 距离 × 系数。这个系数不是某个固定值它取决于手机屏幕的解析度、手指按压的模拟方式甚至安卓系统的触摸处理逻辑。有些教程里直接给出一个万能系数实际上一换手机就翻车。原因在于触屏的长按事件在系统层被转换成一段连续触摸信号这个信号的物理效果近似线性的推力但屏幕像素密度和刷新率会改变同一推力对应的位移。代码里最常用的按压方式是adb shell input swipe从同一个点滑到同一个点模拟长按import subprocess distance ((target_x - bottom_x) ** 2 (target_y - bottom_y) ** 2) ** 0.5 press_time int(distance * 1.35) cmd fadb shell input swipe {bottom_x} {bottom_y} {bottom_x} {bottom_y} {press_time} subprocess.run(cmd, shellTrue)这段命令模拟手指按在棋子上不动起点和终点相同时间就是按压时长。1.35是一个典型系数针对1080×1920分辨率大约能让棋子跳过它所在方块宽度的一半。为什么是线性关系可以近似理解为按压时间长意味着积攒的“冲量”更大棋子起跳的初速度与按压时间成正比。但真实游戏里还有重力、惯性、方块弹性等因素所以这个线性关系在距离很大时会有些偏差。误差补偿的做法是每次跳跃后根据上一跳的实际落点和目标点的偏差微调这次按压时长。比如上一跳跳过了目标点中心10像素那么这次按压时长减掉一个修正量press_time - int(previous_overshoot * 0.03)。这个补偿系数也要靠实测我一般设0.03到0.05之间调太大了会矫枉过正。3. 在Windows上搭出最小可用版本环境与脚本骨架原理讲清楚后就可以动手搭一个能跑的最小版本。这一章从环境检查、截图到自动跳跃给出一条完整命令链。别急着一口气写完所有功能先让脚本能截屏、能识别、能跳一次跑通了再加功能。Windows下的主要坑是ADB路径和USB驱动先解决这两个后面顺畅得多。3.1 需要的工具与安装检查Windows下需要四样东西ADB工具、Python3、OpenCV、NumPy。ADB是Android调试桥负责连接手机、截图、模拟触摸OpenCV负责图像处理NumPy用来算距离。多数人电脑里已经有ADB没有的话可以在Android开发者官网下载把platform-tools目录加进环境变量PATH。注意Python版本建议3.8以上OpenCV在Windows下用pip装的是预编译包不需要自己编译。装Python依赖就三条命令pip install opencv-python numpy adb devices第一条装图像处理库第二条列出当前连接的设备。如果adb devices只显示序列号没有device字样说明手机没有开启USB调试或没装驱动。常见确认步骤是手机设置里打开开发者选项开启USB调试插线后手机上允许调试。Windows上有些手机需要安装自家驱动我在某台笔记本上遇到过始终显示unauthorized的情况把USB模式从充电切到文件传输MTP就解决了。每次连接后先跑一次adb devices确认状态是device再继续。3.2 用ADB截屏并拉回本地截屏是每次跳跃的数据来源。ADB提供一条标准命令adb shell screencap -p /sdcard/screen.png adb pull /sdcard/screen.png screen.png第一条命令在手机上把当前屏幕保存为PNG第二条拉回Windows当前目录。-p参数指定PNG格式。如果截图出现文件损坏常见原因是没有加-pWindows下重定向会改动换行符。另外screencap保存的文件路径权限因手机厂商而异有些手机不允许写在根目录可以写到/sdcard/下这是Android通用目录。更稳的写法是让Python来执行并检查结果import subprocess import os def capture(): subprocess.run([adb, shell, screencap, -p, /sdcard/screen.png], timeout10) subprocess.run([adb, pull, /sdcard/screen.png, screen.png], timeout10) if os.path.getsize(screen.png) 10000: raise Exception(截图文件过小检查屏幕是否点亮)这里加了超时和文件大小检查防止手机息屏或ADB卡住时脚本傻等。截图文件如果小于10KB基本是黑屏或者没解锁直接报错比后面识别瞎猜好。timeout10设了10秒上限某些老手机截图偶尔会超过5秒但10秒足够。3.3 写一个能跑通的辅助循环把第二章的识别逻辑和上面的截屏组合起来就是一个最小循环。每次跳完先等棋子落稳再截新图反复执行import time import cv2 import numpy as np import subprocess def press(x, y, duration): cmd fadb shell input swipe {x} {y} {x} {y} {duration} subprocess.run(cmd, shellTrue) def distance_to_time(d): return int(d * 1.35) while True: capture() img cv2.imread(screen.png) # 这里粘贴第二章的棋子识别和落点识别代码 bottom_x, bottom_y find_piece(img) target_x, target_y find_target(img, bottom_x, bottom_y) d ((target_x - bottom_x) ** 2 (target_y - bottom_y) ** 2) ** 0.5 press(bottom_x, bottom_y, distance_to_time(d)) time.sleep(2.5) # 等待棋子落定和平台移动这个循环的节奏是截图、识别、按压、等待。time.sleep(2.5)很关键如果小于2秒棋子还没落稳就截下一张图会识别到半空中的棋子如果大于3秒游戏节奏太慢很多挑战模式有时间限制。逻辑说明find_piece和find_target在第二章有代码实际使用时要定义成两个函数。press用adb shell input swipe完成触摸事件distance_to_time里的系数1.35是初始值不一定适用于你的手机下一章讲怎么校准。为了让代码结构更清晰我通常会把整个循环封装成一个jump_once函数把识别、距离计算和按压都放在里面。这样后续调试时可以单独调用一次跳跃而不必跑整个循环。用函数返回本次跳跃的距离和按压时长方便输出日志def jump_once(): img cv2.imread(screen.png) p find_piece(img) t find_target(img, p) d np.hypot(t[0]-p[0], t[1]-p[1]) press(p[0], p[1], distance_to_time(d)) return d, distance_to_time(d)find_piece返回棋子的底部(x, y)find_target返回落点(x, y)。用np.hypot一行算出欧几里得距离比手写平方开根更简洁。这样写还有个好处返回的距离值可以直接喂给第四章的系数校准函数。4. 参数调优按压系数、识别阈值、跳跃方向很多辅助器能用但总失败不是代码写错而是参数没跟着自己的手机调整。这一章把三个最影响结果的参数逐一说明并给出校准方法。参数调优没有捷径但有一个顺序先校准按压系数再调识别阈值最后处理动态场景。顺序反了往往事倍功半因为识别偏移会被误当成系数问题。4.1 按压系数是怎么定的系数直接决定跳跃距离。最笨但最有效的校准办法是用你手机玩一局停止在某个位置然后用脚本或adb shell input swipe手动模拟一次跳跃记录棋子起点、目标点距离和按压力度反推系数。假设截图中棋子到目标落点距离实测是400像素你手动用900毫秒按压刚好跳上去那么系数就是900 / 400 2.25。但手机屏幕缩放会影响像素距离所以不要直接抄别人的系数别人在1080p屏幕上用的1.35在1440p屏幕上可能变成1.05左右。更稳的校准方式是测多组数据做一个简单的最小二乘拟合。我通常在一个新手机上连跑五次记录五组(distance, press_time)然后用下面的方式算斜率data [ (250, 450), (320, 580), (410, 740), (500, 900), (380, 680), ] distances np.array([d for d, _ in data]) times np.array([t for _, t in data]) slope np.polyfit(distances, times, 1)[0] print(建议系数:, slope)np.polyfit做一元线性拟合返回的斜率就是系数。为什么不用平均值因为单次测量可能受跳跃轨迹影响拟合能把偶然偏差摊平。拟合完最好再实测一次如果跳过头或跳不足按 1% 微调系数。press_time保持整数因为ADB的swipe时间参数是毫秒浮点数会被截断。4.2 识别阈值和颜色容差图像识别里的阈值在跳一跳场景中可以分为HSV范围、Canny阈值和轮廓面积阈值。HSV范围太小棋子会漏掉一部分外接矩形偏小按压点就不在底边中心范围太大背景里类似颜色的物体也会被并进来轮廓面积异常大落点计算全乱。我习惯把阈值做成可配置参数放在脚本开头PIECE_LOWER np.array([0, 0, 80]) PIECE_UPPER np.array([20, 255, 255]) CANNY_LOW 50 CANNY_HIGH 150 MIN_AREA 2000MIN_AREA是最小轮廓面积过滤掉噪点。如果你的手机分辨率高截图里棋子可能占到5000像素以上MIN_AREA调到3000也不过分。识别失败时先把这个面积阈值往下调看是不是小色块被当成棋子了如果调了还不行就去调HSV颜色范围。注意PIECE_LOWER和PIECE_UPPER要覆盖棋子的主体颜色但不要覆盖到背景的相近色。一个快速验证方法是把mask存储下来用cv2.imwrite看白色部分是不是正好圈住棋子。4.3 处理连续跳跃和方块上升跳一跳的方块并不总在同一水平线上有些关卡方块会逐级升高。这意味着棋子跳跃的落点可能高于棋子起始水平线识别的ROI不能只往右方找还要允许向上偏移。很多新写的辅助器只会找同一水平高度的目标遇到上升方块就跳空。解决方法是在落点识别时把ROI的纵向范围从y0 - 300扩大到y0 - 500并且在计算落点中心时对上半部分边缘给予更高权重因为上升方块的可见边缘在图像上方更密集。我后来直接用了一个更简单的办法不再用固定ROI而是从棋子底部中心出发沿45度斜上方逐行扫描边缘这样能同时覆盖水平和上升方向。# 斜向扫描每步偏移 (1, -1) for step in range(50, 400): scan_x bottom_x step scan_y bottom_y - step if scan_x 0 or scan_y 0 or scan_x gray.shape[1]: break if gray[scan_y, scan_x] 200: target_x, target_y scan_x, scan_y break这个扫描假设目标方块总是向右上方。如果遇到负方向的方块可以通过游戏当前角度来判断。跳一跳支持玩家在方块间左右移动但大多数辅助器只处理向右的常规路线遇到向左的方块需要额外的方向判断。最简单的做法是同时扫描左斜和右斜取更近的边缘作为目标。遇到棋盘旋转视角时斜向扫描会比垂直扫描更鲁棒因为旋转后的可见边缘方向更接近 45 度。5. 避坑指南让人血压升高的5个常见问题这个章节专门记录我在Windows下调辅助器时踩过的坑。每一条都是现象、原因、解决的完整链路建议你把这些问题当成调试手册遇到类似的症状直接翻对应条。5.1 截图发绿识别率突然下降现象脚本本来跑得好好的换了台电脑或重新插上手机后识别出来的棋子位置明显偏了看保存的截图发现整张图发绿。原因手机截屏在传输时ADB默认把RGBA格式转成了RGB但某些安卓版本会多加一个透明度通道导致颜色偏移。更常见的原因是用了RGB模式读取图片而图像的色彩空间本身不是标准sRGB尤其是一些国产手机为了让屏幕“鲜艳”会调高饱和度截图记录下来就是偏色的。解决在Python里读取截图用cv2.imread它默认按BGR读再转HSV时用cv2.COLOR_BGR2HSV。如果发现颜色不对检查图片尺寸是不是原始分辨率用img.shape看通道数。如果是4通道用cv2.cvtColor转成BGR再继续。img cv2.imread(screen.png) if img is None: raise Exception(读取失败) if img.shape[2] 4: img cv2.cvtColor(img, cv2.COLOR_BGRA2BGR)加了这段后我遇到的颜色偏移问题基本都解决了。有些手机截图默认是宽高反转的比如竖屏截图在电脑上显示是横向拉长的但OpenCV读取时行列号是对的不需要额外翻转除非你用了PIL的Image.open那不是同一套几何坐标系。5.2 按压力度对了但棋子总向斜后方跳现象按压时间算出来刚好能跳到目标中心但实际跳跃角度总是偏右或偏左落点差半个身位。原因adb shell input swipe的起点和终点虽然相同但系统在极短的按压内可能把动作解析成一次快速滑动产生方向性。另外某些手机设置里开启了触摸特效或手势干扰比如三指截屏会把触摸事件拦截。解决把起点和终点设为棋子上方的两个不同点模拟一个原地长按却带有微小轨迹的触摸。我一般写成这样def press(x, y, duration): # 从(x,y)到(x2, y1)的微位移避开系统手势误判 subprocess.run([adb, shell, input, swipe, str(x), str(y), str(x2), str(y1), str(duration)])2像素的偏移不会影响跳动方向但能骗过一些解析滑动的底层逻辑。如果还是斜跳检查手机有没有开启防误触。防误触会拦截靠近屏幕边缘的触摸把按压点移向屏幕中央附近。还有一个小众坑某些录音软件会全局监听屏幕导致触摸事件延迟或坐标偏移关掉后台应用再试。5.3 换手机后系数全废识别框错位现象同一套代码在A手机上完美运行换到B手机上棋子位置识别偏移按压也总是跳过头或跳不到。原因不同手机屏幕像素密度和系统UI缩放不同。比如A手机是1080×1920B手机是1440×3200同样的逻辑像素对应的物理像素差了一倍。图像里同样长度的距离在像素值上变成原来的1.33倍系数自然要变。解决不要硬编码分辨率而是让脚本自动读取截图尺寸然后按比例缩放所有像素坐标h, w img.shape[:2] scale w / 1080.0 # 以1080宽为基准 bottom_x int(bottom_x * scale) target_x int(target_x * scale)这样识别逻辑里的ROI、阈值面积、距离计算都跟着缩放。按压系数仍然要重新校准但至少图像识别不会错位。还有一个容易忽视的点手机状态栏高度会占掉屏幕顶部一部分像素坐标系从状态栏下方开始。如果两块手机状态栏高度不同识别到的棋子y坐标会有偏移。解决办法是在find_piece时忽略顶部一定高度比如从y 200开始扫描。5.4 游戏页面弹窗和翻牌动画干扰识别现象跳到某些位置后游戏会弹出“得分翻倍”或者“复活”的小窗辅助器把这些弹窗当成目标方块棋子直接往弹窗上跳然后摔死。原因弹窗区域颜色和形状都像独立的色块而且位置正好在棋子前进方向附近。轮廓检测只按面积取最大弹窗面积通常不小很容易被当成落点。跳一跳的翻牌动画还会在棋盘上生成新的色块这些色块和真实方块混在一起。解决在落点识别时把目标限制在比棋子位置更靠上的区域并拒绝识别面积过大的轮廓。给落点轮廓加一个最大面积约束超过某个阈值就跳过本次跳跃等弹窗消失再继续。常见做法是if area max_area: print(疑似弹窗跳过本次跳跃) return Nonemax_area可以先设成棋子面积的3倍。跳一跳正常方块的面积不会比棋子的中心轮廓大太多弹窗通常整个占满半个屏幕面积轻松超过这个倍数。另一个判断是形状周长比弹窗多有圆角或描边而游戏方块是直角矩形轮廓的周长与面积比落在某个区间内。如果你不想引入太多参数就只用面积上限。5.5 ADB连接不稳定截图命令卡死现象脚本跑几分钟后就停在截图那一步终端没有报错也不继续执行最后按CtrlC退出。原因ADB server和手机通信超时尤其是使用USB HUB或老式数据线时偶尔会有一两条命令被卡住。Python的subprocess.run不设超时就会一直等。手机长时间连续截屏时手机端的screencap进程可能会被系统杀掉导致返回空文件。解决给每一条ADB命令都加超时并且封装成带单次失败的函数import subprocess def adb(args, timeout5): try: return subprocess.run([adb] args, capture_outputTrue, timeouttimeout) except subprocess.TimeoutExpired: print(ADB command timeout:, args) return None调用capture()时检查返回值如果为None就重试两三次再不行就提示重新插拔USB。我最近一次跑连续跳跃就是用这个方式把失败率从每2分钟一次降到几乎为零。注意adb shell screencap有时会占用手机端CPU连续高频截屏会让手机发热导致截图变慢。保险起见每次截屏之间至少间隔0.8秒不要太贪。6. 让辅助器更像样加一个实时预览和手动微调基础版能跑通但调试时你看不到它在识别什么失败只能猜。最后一章加两个小功能一个是把识别结果画在截图上另一个是提供手动按压模式方便你校准系数和救场。这两个功能加起来不到40行代码但能让你的调试效率翻倍。6.1 把识别结果画在截图上用OpenCV的画圆和画线函数把棋子底部点、目标落点、距离线绘制出来存成preview.png。这样每次跳跃前你都能看到辅助器到底看到了什么比看日志直观得多。preview img.copy() cv2.circle(preview, (bottom_x, bottom_y), 10, (0, 0, 255), 2) # 红圈棋子 cv2.circle(preview, (target_x, target_y), 10, (0, 255, 0), 2) # 绿圈目标 cv2.line(preview, (bottom_x, bottom_y), (target_x, target_y), (255, 0, 0), 2) cv2.imwrite(preview.png, preview)红圈标记起点绿圈标记落点蓝线是计算出的跳跃方向。如果蓝线穿过了错误的目标你立刻就知道该调颜色阈值还是ROI范围。这个预览文件也可以配合弹窗查看Windows上直接start preview.png就能打开。我一般会在每次跳跃后保留最新的一张预览失败时翻这张图看是哪一步出了问题。预览还有一个作用验证你的按压系数。你可以把算出的duration用白字写在图上然后拿图对比实际跳跃结果。如果每次duration都偏大你就能直观地看出系统性的偏差而不是靠猜。实践里我还会把当前帧的连续跳跃序号也写到图上方便回看是哪一步开始翻车的。6.2 手动按压模式作为后悔药自动模式跳失败时不能每次都从头开始。我加了一个手动模式脚本只负责截图和识别不自动按而是把建议的按压时长算出来等待你按一次空格执行。这样你可以临时干预决定这次跳还是不跳。简单实现是每次识别后等待键盘输入import keyboard print(建议按压:, duration, 按空格执行按q退出) while True: try: if keyboard.is_pressed(space): press(...) time.sleep(0.5) if keyboard.is_pressed(q): break except: passkeyboard库需要管理员权限如果不想装可以用input()等回车只是节奏慢一点。手动模式的最大价值是当你发现系数偏了时可以先手动调整按压时长而不是直接拆代码重修系数。我常用一个更快的调整办法在手动模式下如果建议按压900毫秒你觉得跳过头了就把脚本里临时改成850毫秒再按一次观察效果而不是改全局系数。找到合适的值后再更新到distance_to_time函数里。这套辅助器做到这一步已经能稳定自动刷分也能在翻车时救场。我自己常用的习惯是第一次跑先开手动模式连续跳十次确认识别点和落点几乎都准确再切自动。这样不会一上来就看着棋子乱飞。调参的时候记得把预览图打开哪个点标歪了一眼就能看出来。希望以上的经验能帮你少走几步弯路玩得顺心也把图像识别这条路练顺手。本文还有配套的精品资源点击获取