脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服务器之家 - 脚本之家 - Python - 使用Python实现跳一跳自动跳跃功能

使用Python实现跳一跳自动跳跃功能

2021-08-07 00:06数据森麟 Python

这篇文章主要介绍了使用Python实现跳一跳自动跳跃功能,本文图文并茂通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下

1.   OpenCV:模板匹配。    获得小跳棋中心位置

2.   OpenCV:边缘检测。    获得下一方块中心位置

使用Python实现跳一跳自动跳跃功能

Python+ADB+OpenCv,实现「 跳一跳 」自动化。

/ 01 / ADB

ADB工具即Android Debug Bridge(安卓调试桥) tools。

ADB 是一个命令行窗口,用于通过电脑端与模拟器或者真实设备交互。

与之前小F接触过的Appium有点相似。

ADB的安装很简单,就是将安装包解压后,将路径添加到系统的环境变量中即可。

然后使用Python的os模块执行ADB命令。

  1. def get_screenshot():
  2. # 截取手机的屏幕
  3. os.system('adb shell /system/bin/screencap -p /sdcard/screencap.png')
  4. # 把模拟器里面的文件或文件夹传到电脑上
  5. os.system('adb pull /sdcard/screencap.png screencap.png')
  6.  
  7. def jump(distance):
  8. # 设置按压时间,系数为1.35
  9. press_time = int(distance * 1.35)
  10.  
  11. # 生成随机手机屏幕模拟触摸点,防止成绩无效
  12. # 生成随机整数(0-9),最终数值为(0-90)
  13. rand = random.randint(0, 9) * 10
  14. # adb长按操作,即在手机屏幕上((320-410),(410-500))坐标处长按press_time毫秒
  15. cmd = ('adb shell input swipe %i %i %i %i ' + str(press_time)) % (320 + rand, 410 + rand, 320 + rand, 410 + rand)
  16. # 输出adb命令
  17. print(cmd)
  18. # 执行adb命令
  19. os.system(cmd)

本次涉及到的ADB命令,就只有三个,不多。

一个截屏,一个推送手机截图到电脑上,最后模拟长按手机屏幕。

/ 02 / 跳动实现

先检测游戏结束画面。
判断是否需要结束游戏程序。

  1. # 游戏结束的模板图像
  2. temp_end = cv2.imread('end.jpg', 0)
  3. def game_over(img):
  4. """ 模板匹配,检测是否要将程序结束 """
  5. # 如果在游戏截图中匹配到带"再玩一局"字样的模板,则循环中止
  6. res_end = cv2.matchTemplate(img, temp_end, cv2.TM_CCOEFF_NORMED)
  7. if cv2.minMaxLoc(res_end)[1] > 0.95:
  8. print('Game over!')
  9. return True

模板匹配原理图如下。

使用Python实现跳一跳自动跳跃功能

当返回的最大矩阵值大于0.95时,则认为原始图像中肯定出现了再玩一局字样。

则游戏结束,程序也随之结束。

小跳棋的模板匹配代码如下。

主要是获取小跳棋的位置,即「跳一跳」起点位置参数。

  1. # 读取小跳棋模板图像
  2. temple = cv2.imread('temple.png', 0)
  3. # 获取小跳棋模板图像的高和宽
  4. th, tw = temple.shape[:2]
  5. def get_start(img):
  6. """ 模板匹配,获取跳一跳起点的位置参数(小跳棋) """
  7. # 使用标准相关系数匹配,1表示完美匹配,-1表示糟糕的匹配,0表示没有任何相关性
  8. result = cv2.matchTemplate(img, temple, cv2.TM_CCOEFF_NORMED)
  9. # 使用函数minMaxLoc,确定匹配结果矩阵的最大值和最小值(val),以及它们的位置(loc)
  10. min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
  11. # 得到小跳棋的中心位置参数
  12. return max_loc[0] + 47, max_loc[1] + 208

得到结果如下。

使用Python实现跳一跳自动跳跃功能

下面通过OpenCV的边缘检测获取「跳一跳」的终点位置。

  1. def get_end(img):
  2. """ 边缘检测,获取跳一跳终点的位置参数(方块) """
  3. # 高斯模糊
  4. img_rgb = cv2.GaussianBlur(img, (5, 5), 0)
  5. # 边缘检测
  6. canny_img = cv2.Canny(img_rgb, 1, 10)
  7. # 获得边缘检测图像的高和宽
  8. H, W = canny_img.shape
  9.  
  10. # 第一个顶点的高度
  11. y_top = np.nonzero([max(row) for row in canny_img[400:]])[0][0] + 400
  12. # 第一个顶点的宽度
  13. x_top = int(np.mean(np.nonzero(canny_img[y_top])))
  14.  
  15. # 跳过小白圈,然后遍历
  16. y_bottom = y_top + 80
  17. for row in range(y_bottom, H):
  18. if canny_img[row, x_top] != 0:
  19. y_bottom = row
  20. break
  21.  
  22. # 得到方块的中心点
  23. x_center, y_center = x_top, (y_top + y_bottom) // 2
  24. return x_center, y_center

边缘检测原理图如下。

使用Python实现跳一跳自动跳跃功能

最后便是主程序啦。

  1. # 循环直到游戏失败结束
  2. for i in range(10000):
  3. # 将安卓手机上的截图移到电脑当前文件夹下
  4. get_screenshot()
  5. # 读取截图图像
  6. img = cv2.imread('screencap.png', 0)
  7.  
  8. # 游戏结束
  9. if game_over(img):
  10. break
  11.  
  12. # 得到起点位置参数
  13. x_start, y_start = get_start(img)
  14. # 获取终点位置参数
  15. x_end, y_end = get_end(img)
  16.  
  17. # 将起点位置绘制出来,一个圆
  18. cv2.circle(img, (x_start, y_start), 10, 255, -1)
  19. # 将终点位置绘制出来,一个圆
  20. img_end = cv2.circle(img, (x_end, y_end), 10, 255, -1)
  21. # 保存图片
  22. cv2.imwrite('end.png', img_end)
  23.  
  24. # 计算起点和终点的直线距离,勾三股四弦五
  25. distance = (x_start - x_end) ** 2 + (y_start - y_end) ** 2
  26. distance = distance ** 0.5
  27.  
  28. # 根据获得的距离来设置按压时长
  29. jump(distance)
  30. time.sleep(1.3)

下面就来看一下「跳一跳」自动跳跃的视频。

轻轻松松得分,毫无问题。

/ 03 / 总结

相关工具及代码已上传网盘,公众号回复 「跳一跳」 即可获取。

安装好ADB工具,然后通过数据线将安卓手机和电脑连接。

最后运行代码, 亲测有效。

当然代码还是有待优化的,如下图~

使用Python实现跳一跳自动跳跃功能

一方面是得分不高,另一方面就是会被检测到作弊...

总结

以上所述是小编给大家介绍的使用Python实现跳一跳自动跳跃功能 ,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

延伸 · 阅读

精彩推荐