使用Python实现跳一跳自动跳跃功能
作者:数据森麟 发布时间:2023-04-07 01:57:55
1. OpenCV:模板匹配。 获得小跳棋中心位置
2. OpenCV:边缘检测。 获得下一方块中心位置
Python+ADB+OpenCv,实现「 跳一跳 」自动化。
/ 01 / ADB
ADB工具即Android Debug Bridge(安卓调试桥) tools。
ADB 是一个命令行窗口,用于通过电脑端与模拟器或者真实设备交互。
与之前小F接触过的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实现跳一跳自动跳跃功能 ,网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
来源:https://mp.weixin.qq.com/s
猜你喜欢
- 本节我们来介绍一下新浪微博宫格验证码的识别,此验证码是一种新型交互式验证码,每个宫格之间会有一条指示连线,指示了我们应该的滑动轨迹,我们需要
- FTP即文件传输协议;它基于客户机-服务器模型体系结构,应用广泛。它有两个通道:一个命令通道和一个数据通道。命令通道用于控制通信,数据通道用
- 本文实例为大家分享了python实现端口扫描的具体代码,供大家参考,具体内容如下今天老师上课说的内容,使用多线程+socket写一个端口扫描
- BootStrap模态框简单概述Bootstrap Modals(模态框)是使用定制的 Jquery 插件创建的。它可以用来创建模态窗口丰富
- 大数据分析必定少不了数据抓取,只有拥有海量的数据才能对数据进行对比分析。因此,网页爬虫是作为程序员必须要懂得技能,下文我将通过文字形式记录下
- 许多服务器管理员都知道,MySQL数据库管理系统(RDBMS)是高度灵活的软件块,带有范围广阔的启动选项,可以用来修改相关行为。然而,大部分
- 本文实例讲述了Bootstrap实现前端登录页面带验证码功能。分享给大家供大家参考,具体如下:Bootstrap有自定义的验证码样式,在前端
- 前言上一篇文章写了关于字典操作方法的增删改,这篇主要讲解如何查找字典数据。查找数据写法一共有两种,一种能够是key值查找,另外一种是按照函数
- 从 PDF 表格中获取数据是一项痛苦的工作。不久前,一位开发者提供了一个名为 Camelot 的工具,使用三行代码就能从 PDF 文件中提取
- 在不久前的一天,当我为了解决一个语法问题来翻阅VBscript文档时,偶然间发现在了下面的一句话: &nb
- 如下所示:import urllib,json,requestsurl = 'http://127.0.0.1:8000/accou
- 一、前言:mysql8之后想比起之前常用的版本改动还是挺大的,因为刚从安装接触,就先从基本的说起。现在的mysql8安装只能采用解压配置版,
- 循环链表就是将单链表的末尾指向其头部,形成一个环。循环链表的增删操作和单链表的增删操作区别不大。只是增加时,需要考虑空链表增加第一个节点的特
- 1 Git简介Git 是目前世界上最先进的分布式版本控制系统(没有之一)作用: 源代码管理为什么要进行源代码管理?
- 安装cuda更新nvidia驱动打开GeForce Game Ready Driver或在GeForce Experience中下载符合自己
- 130 :文件格式不正确。(还不是很清楚错误的状况) 145 :文件无法打开。 1005:创建表
- 如果你在 ForeignKey或 ManyToManyField字段上使用 related_name属性,你必须总是为该字段指定一个唯一的反
- 使用场景:按文件名字正序,批量执行某文件夹下的所有sql文件,并输出日志适合人群:实施工程师一、使用篇1、准备bat文件:1.1、ExecS
- Python 做为一个脚本语言,可以很方便地写各种工具。当你在服务端要运行一个工具或服务时,输入参数似乎是一种硬需(当然你也可以通过配置文件
- python里dict(字典)怎么变成list(列表)?说明:列表不可以转换为字典1、转换后的列表为无序列表a = {'a'