小编给大家分享一下怎么使用Python实现跳一跳自动跳跃功能,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获、下面让我们一起去了解一下吧!
1只,OpenCV:模板匹配只,,获得小跳棋中心位置
2只,OpenCV:边缘检测只,,获得下一方块中心位置
Python +亚行+ OpenCv,实现“跳一跳”自动化。
<强>/01/亚行强>
亚行工具即Android调试桥(安卓调试桥)的工具。
亚洲开发银行是一个命令行窗口,用于通过电脑端与模拟器或者真实设备交互。
与之前小F接触过的Appium有点相似。
亚行的安装很简单,就是将安装包解压后,将路径添加到系统的环境变量中即可。
然后使用Python的os模块执行亚行命令。
def get_screenshot (): ,#截取手机的屏幕 ,os.system (& # 39; adb  shell /系统/bin/screencap -p /sdcard/screencap.png& # 39;) ,#把模拟器里面的文件或文件夹传到电脑上 ,os.system (& # 39; adb  pull /sdcard/screencap.png screencap.png& # 39;) def 跳(距离): ,#设置按压时间,系数为1.35 ,press_time =, int (distance *, 1.35) ,#生成随机手机屏幕模拟触摸点,防止成绩无效 ,#生成随机整数(0 - 9),最终数值为(0 - 90)=,,rand  random.randint (0, 9), *, 10 ,#亚行长按操作,即在手机屏幕上((320 - 410),(410 - 500))坐标处长按press_time毫秒 ,cmd =, (& # 39; adb  shell input swipe %小姐:%小姐:%小姐:%小姐:& # 39;,+,str (press_time)), %,(320, +,兰德,,410,+,兰德,,320,+,兰德,,410,+,兰特) ,#输出亚行命令 ,打印(cmd) ,#执行亚行命令 之前,os.system (cmd) >本次涉及到的亚行命令,就只有三个,不多。
一个截屏,一个推送手机截图到电脑上,最后模拟长按手机屏幕。
<强>/02/跳动实现强>
先检测游戏结束画面。
判断是否需要结束游戏程序。#,游戏结束的模板图像 时间=temp_end cv2.imread (& # 39; end.jpg& # 39;,, 0) def game_over (img): “““大敌;模板匹配,检测是否要将程序结束,“““ ,#如果在游戏截图中匹配到带“再玩一局“字样的模板,则循环中止=,,res_end  cv2.matchTemplate (img, temp_end,, cv2.TM_CCOEFF_NORMED) ,if cv2.minMaxLoc (res_end)[1],祝辞,0.95: ,打印(& # 39;Game  ! & # 39;) ,return 真正的模板匹配原理图如下。
#,读取小跳棋模板图像 时间=temple cv2.imread (& # 39; temple.png& # 39;,, 0) #,获取小跳棋模板图像的高和宽 th, tw =, temple.shape (2): def get_start (img): “““大敌;模板匹配,获取跳一跳起点的位置参数(小跳棋),“““ ,#使用标准相关系数匹配,1表示完美匹配,1表示糟糕的匹配,0表示没有任何相关性=,,result  cv2.matchTemplate (img,寺庙,,cv2.TM_CCOEFF_NORMED) ,#使用函数minMaxLoc,确定匹配结果矩阵的最大值和最小值(val),以及它们的位置(loc) ,min_val, max_val, min_loc,, max_loc =, cv2.minMaxLoc(结果) ,#得到小跳棋的中心位置参数 ,return max_loc[0], +, 47岁,max_loc [1], +, 208
得到结果如下。
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([马克斯(行),for row 拷贝canny_img[400年]])[0][0],+,400 ,#第一个顶点的宽度 ,x_top =, int (np.mean (np.nonzero (canny_img [y_top]))) ,#跳过小白圈,然后遍历=,,y_bottom  y_top +, 80 ,for row 拷贝范围(y_bottom, H): ,if canny_img[行,x_top], !=, 0: y_bottom =,才能行 ,打破 ,#得到方块的中心点 ,x_center, y_center =, x_top,,(时间+ y_top y_bottom),//2 ,return x_center, y_center