基于Python与OpenCV的跳一跳自动跳跃脚本实现
本文详解如何利用Python结合ADB与OpenCV实现跳一跳自动跳跃功能。通过ADB截取屏幕并推送至本地,使用模板匹配定位起点小跳棋坐标,利用边缘检测算法计算终点方块位置。核心逻辑包含距离计算、按压时间系数(1.35)模拟及随机偏移防检测,完整代码逻辑与参数设置均在文中展示。
首先利用OpenCV进行模板匹配,以获取小跳棋的中心位置坐标。
接着使用OpenCV进行边缘检测,从而确定下一个方块的中心位置。

本方案整合Python、ADB与OpenCV技术,实现跳一跳游戏的自动化操作。
ADB工具配置
01 ADB工具配置
ADB全称为Android Debug Bridge(安卓调试桥)工具集。
ADB提供命令行界面,用于通过电脑端与安卓模拟器或真实设备进行交互。
其操作模式与之前接触过的Appium有一定相似性。
ADB的安装过程较为简单,只需解压安装包并将路径添加至系统环境变量即可。
随后,利用Python的os模块来执行ADB相关命令。
def get_screenshot():
# 截取手机的屏幕
os.system('adb shell /system/bin/screencap -p /sdcard/screencap.png')
# 把模拟器里面的文件或文件夹传到电脑上
os.system('adb pull /sdcard/screencap.png screencap.png')
def jump(distance):
# 设置按压时间,系数为1.35
press_time = int(distance * 1.35)
# 生成随机手机屏幕模拟触摸点,防止成绩无效
# 生成随机整数(0-9),最终数值为(0-90)
rand = random.randint(0, 9) * 10
# adb长按操作,即在手机屏幕上((320-410),(410-500))坐标处长按press_time毫秒
cmd = ('adb shell input swipe %i %i %i %i ' + str(press_time)) % (320 + rand, 410 + rand, 320 + rand, 410 + rand)
# 输出adb命令
print(cmd)
# 执行adb命令
os.system(cmd)
本次实现涉及的ADB命令仅有三项,数量不多。
这三项命令分别用于截屏、将手机截图推送至电脑,以及模拟长按手机屏幕操作。
跳跃逻辑实现
02 跳跃逻辑实现
首先检测游戏结束画面,判断是否需要终止游戏程序。
# 游戏结束的模板图像
temp_end = cv2.imread('end.jpg', 0)
def game_over(img):
""" 模板匹配,检测是否要将程序结束 """
# 如果在游戏截图中匹配到带"再玩一局"字样的模板,则循环中止
res_end = cv2.matchTemplate(img, temp_end, cv2.TM_CCOEFF_NORMED)
if cv2.minMaxLoc(res_end)[1] > 0.95:
print('Game over!')
return True
模板匹配的原理示意图如下。

当返回的最大矩阵值大于0.95时,即认为原始图像中出现了“再玩一局”字样。
此时判定游戏结束,程序随之终止运行。
小跳棋的模板匹配相关代码如下。
该部分主要获取小跳棋的位置,即“跳一跳”游戏的起点位置参数。
# 读取小跳棋模板图像
temple = cv2.imread('temple.png', 0)
# 获取小跳棋模板图像的高和宽
th, tw = temple.shape[:2]
def get_start(img):
""" 模板匹配,获取跳一跳起点的位置参数(小跳棋) """
# 使用标准相关系数匹配,1表示完美匹配,-1表示糟糕的匹配,0表示没有任何相关性
result = cv2.matchTemplate(img, temple, cv2.TM_CCOEFF_NORMED)
# 使用函数minMaxLoc,确定匹配结果矩阵的最大值和最小值(val),以及它们的位置(loc)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
# 得到小跳棋的中心位置参数
return max_loc[0] + 47, max_loc[1] + 208
得到的结果如下所示。

接下来通过OpenCV的边缘检测功能获取“跳一跳”的终点位置。
def get_end(img):
""" 边缘检测,获取跳一跳终点的位置参数(方块) """
# 高斯模糊
img_rgb = cv2.GaussianBlur(img, (5, 5), 0)
# 边缘检测
canny_img = cv2.Canny(img_rgb, 1, 10)
# 获得边缘检测图像的高和宽
H, W = canny_img.shape
# 第一个顶点的高度
y_top = np.nonzero([max(row) for row in canny_img[400:]])[0][0] + 400
# 第一个顶点的宽度
x_top = int(np.mean(np.nonzero(canny_img[y_top])))
# 跳过小白圈,然后遍历
y_bottom = y_top + 80
for row in range(y_bottom, H):
if canny_img[row, x_top] != 0:
y_bottom = row
break
# 得到方块的中心点
x_center, y_center = x_top, (y_top + y_bottom) // 2
return x_center, y_center
边缘检测的原理示意图如下。

最后展示主程序的完整逻辑。
# 循环直到游戏失败结束
for i in range(10000):
# 将安卓手机上的截图移到电脑当前文件夹下
get_screenshot()
# 读取截图图像
img = cv2.imread('screencap.png', 0)
# 游戏结束
if game_over(img):
break
# 得到起点位置参数
x_start, y_start = get_start(img)
# 获取终点位置参数
x_end, y_end = get_end(img)
# 将起点位置绘制出来,一个圆
cv2.circle(img, (x_start, y_start), 10, 255, -1)
# 将终点位置绘制出来,一个圆
img_end = cv2.circle(img, (x_end, y_end), 10, 255, -1)
# 保存图片
cv2.imwrite('end.png', img_end)
# 计算起点和终点的直线距离,勾三股四弦五
distance = (x_start - x_end) ** 2 + (y_start - y_end) ** 2
distance = distance ** 0.5
# 根据获得的距离来设置按压时长
jump(distance)
time.sleep(1.3)
下面来看一下“跳一跳”自动跳跃的实际运行视频。
轻松得分,运行毫无问题。
总结
03 总结
相关工具及代码已上传网盘,公众号回复“跳一跳”即可获取。
安装好ADB工具后,通过数据线将安卓手机与电脑连接。
最后运行代码,经亲测有效。
当然代码仍有待优化,如下图所示。

一方面得分不高,另一方面就是会被检测到作弊。
总结
以上所述是使用Python实现跳一跳自动跳跃功能的介绍,希望对大家有所帮助。如果大家有任何疑问请留言,小编会及时回复。在此非常感谢大家对本站网站的支持!如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









