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


Posted in Python onJuly 10, 2019

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

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

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

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

模板匹配原理图如下。

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

当返回的最大矩阵值大于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

得到结果如下。

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

下面通过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

边缘检测原理图如下。

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

最后便是主程序啦。

# 循环直到游戏失败结束
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实现跳一跳自动跳跃功能

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

总结

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

Python 相关文章推荐
Python简单删除目录下文件以及文件夹的方法
May 27 Python
Python多线程下载文件的方法
Jul 10 Python
Python彩色化Linux的命令行终端界面的代码实例分享
Jul 02 Python
浅谈Python 的枚举 Enum
Jun 12 Python
Python OpenCV处理图像之图像像素点操作
Jul 10 Python
Flask框架重定向,错误显示,Responses响应及Sessions会话操作示例
Aug 01 Python
django-crontab 定时执行任务方法的实现
Sep 06 Python
Win10下python 2.7与python 3.7双环境安装教程图解
Oct 12 Python
tensorflow获取预训练模型某层参数并赋值到当前网络指定层方式
Jan 24 Python
django ORM之values和annotate使用详解
May 19 Python
python爬虫请求头的使用
Dec 01 Python
python数字图像处理:图像的绘制
Jun 28 Python
windows安装TensorFlow和Keras遇到的问题及其解决方法
Jul 10 #Python
使用python对多个txt文件中的数据进行筛选的方法
Jul 10 #Python
Python 占位符的使用方法详解
Jul 10 #Python
Python寻找路径和查找文件路径的示例
Jul 10 #Python
python获取当前文件路径以及父文件路径的方法
Jul 10 #Python
通过python实现弹窗广告拦截过程详解
Jul 10 #Python
python高斯分布概率密度函数的使用详解
Jul 10 #Python
You might like
php 不同编码下的字符串长度区分
2009/09/26 PHP
php模拟socket一次连接,多次发送数据的实现代码
2011/07/26 PHP
深入分析php之面向对象
2013/05/15 PHP
探讨各种PHP字符串函数的总结分析
2013/06/05 PHP
php curl 模拟登录并获取数据实例详解
2016/12/22 PHP
网页中实现浏览器的最大,最小化和关闭按钮
2007/03/12 Javascript
JMenuTab简单使用说明
2008/03/13 Javascript
jquery实现鼠标拖动图片效果示例代码
2014/01/09 Javascript
js调试系列 源码定位与调试[基础篇]
2014/06/18 Javascript
JavaScript中逗号运算符介绍及使用示例
2015/03/13 Javascript
javascript多行字符串的简单实现方式
2015/05/04 Javascript
ajax如何实现页面局部跳转与结果返回
2015/08/24 Javascript
JavaScript中的原型prototype完全解析
2016/05/10 Javascript
Node.js的Koa框架上手及MySQL操作指南
2016/06/13 Javascript
jquery  实现轮播图详解及实例代码
2016/10/12 Javascript
js实现目录链接,内容跟着目录滚动显示的简单实例
2016/10/15 Javascript
JavaScript之生成器_动力节点Java学院整理
2017/06/30 Javascript
jQuery中过滤器的基本用法示例
2017/10/11 jQuery
jQuery实现标签子元素的添加和赋值方法
2018/02/24 jQuery
Vue开发中遇到的跨域问题及解决方法
2020/02/11 Javascript
[02:42]DOTA2英雄基础教程 杰奇洛
2013/12/23 DOTA
Python中的匿名函数使用简介
2015/04/27 Python
centos6.5安装python3.7.1之后无法使用pip的解决方案
2019/02/14 Python
详解10个可以快速用Python进行数据分析的小技巧
2019/06/24 Python
html5 迷宫游戏(碰撞检测)实例一
2013/07/25 HTML / CSS
澳大利亚冒险体验:Adrenaline(跳伞、V8赛车、热气球等)
2017/09/18 全球购物
德国高尔夫商店:Par71.de
2020/11/29 全球购物
Jar包的作用是什么
2014/03/30 面试题
sealed修饰符是干什么的
2012/10/23 面试题
几个Shell Script面试题
2012/08/31 面试题
《富饶的西沙群岛》教学反思
2014/04/09 职场文书
社区务虚会发言材料
2014/10/20 职场文书
副总经理岗位职责
2015/02/02 职场文书
大学生个人学年总结
2015/02/15 职场文书
2015年八一建军节演讲稿
2015/03/19 职场文书
Python按顺序遍历并读取文件夹中文件
2022/04/29 Python