使用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学习之asyncore模块用法实例教程
Sep 29 Python
举例讲解Django中数据模型访问外键值的方法
Jul 21 Python
Python获取暗黑破坏神3战网前1000命位玩家的英雄技能统计
Jul 04 Python
详解python并发获取snmp信息及性能测试
Mar 27 Python
使用Python处理BAM的方法
Sep 28 Python
Python爬虫实战之12306抢票开源
Jan 24 Python
python字符串Intern机制详解
Jul 01 Python
浅谈Python中函数的定义及其调用方法
Jul 19 Python
Python如何使用k-means方法将列表中相似的句子归类
Aug 08 Python
Python:type、object、class与内置类型实例
Dec 25 Python
pytorch使用tensorboardX进行loss可视化实例
Feb 24 Python
python 模拟在天空中放风筝的示例代码
Apr 21 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更新购物车数量(表单部分/PHP处理部分)
2013/05/03 PHP
PHP无限分类(树形类)的深入分析
2013/06/02 PHP
php 伪造ip以及url来路信息方法汇总
2014/11/25 PHP
php模拟post提交数据的方法
2015/02/12 PHP
PHP随机生成唯一HASH值自定义函数
2015/04/20 PHP
Zend Framework教程之连接数据库并执行增删查的方法(附demo源码下载)
2016/03/21 PHP
Zend Framework实现留言本分页功能(附demo源码下载)
2016/03/22 PHP
header与缓冲区之间的深层次分析
2016/07/30 PHP
Laravel 5.5 的自定义验证对象/类示例代码详解
2017/08/29 PHP
JavaScript性能优化 创建文档碎片(document.createDocumentFragment)
2010/07/13 Javascript
jquery交替变换颜色的三种方法 实例代码
2013/11/19 Javascript
js实现弹出窗口、页面变成灰色并不可操作的例子分享
2014/05/10 Javascript
面向切面编程(AOP)的理解
2015/05/01 Javascript
JS实现来回出现文字的状态栏特效代码
2015/10/31 Javascript
总结JavaScript三种数据存储方式之间的区别
2016/05/03 Javascript
微信小程序中页面FOR循环和嵌套循环
2017/06/21 Javascript
VUE Error: getaddrinfo ENOTFOUND localhost
2018/05/03 Javascript
Vue中的字符串模板的使用
2018/05/17 Javascript
vue配置接口域名方法总结
2019/05/12 Javascript
nodeJs的安装与npm全局环境变量的配置详解
2020/01/06 NodeJs
ant-design-vue按需加载的坑的解决
2020/05/14 Javascript
OpenLayer3自定义测量控件MeasureTool
2020/09/28 Javascript
微信小程序tab左右滑动切换功能的实现代码
2021/02/08 Javascript
微信跳一跳python辅助软件思路及图像识别源码解析
2018/01/04 Python
单链表反转python实现代码示例
2018/02/08 Python
详解Python计算机视觉 图像扭曲(仿射扭曲)
2019/03/27 Python
Selenium python时间控件输入问题解决方案
2020/07/22 Python
python asyncio 协程库的使用
2021/01/21 Python
雅诗兰黛旗下走天然植物路线的彩妆品牌:Prescriptives
2016/08/14 全球购物
澳大利亚制造的蜡烛和扩散器:Glasshouse Fragrances
2018/05/20 全球购物
娇韵诗香港官网:Clarins香港
2020/08/13 全球购物
建筑文秘专业个人求职信范文
2013/12/28 职场文书
生日宴会答谢词
2014/01/09 职场文书
播音主持专业个人自我评价
2014/01/09 职场文书
安全事故检讨书
2014/01/18 职场文书
幼儿园教师自荐书
2015/03/06 职场文书