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

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实现跳一跳自动跳跃功能 ,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

(0)

相关推荐

  • 100行python代码实现跳一跳辅助程序

    写在前面 分享一下今天下午用python写的"跳一跳"小游戏的辅助程序.之前是准备用树莓派操控一个"机械手指"来代替人的触摸操作,但该方案还在酝酿中,实现了再分享.接下来要分享的是用"纯软件"的方法来玩"跳一跳". 原理 原理其实很简单,按如下步骤操作即可: 每次跳跃之前,截取一下手机屏幕,并将截图保存到本地电脑中: 计算截图中人偶的位置与将要跳至的台面中心的距离dd: 将以上距离dd换算成相应的触摸时间ss: 发送模拟触摸的

  • 微信跳一跳python辅助脚本(总结)

    这段时间微信跳一跳这个游戏非常火爆,但是上分又非常的难,对于程序员来说第一个念头就是通过写一个辅助脚本外挂让上分变的容易,python现在比较火,我们一起来以python语言为基础总结以下各路神仙写的关于跳一跳的辅助脚本,大家在学习的时候主要理解他们的写法思路,对你学习python非常的有帮助. 1.微信跳一跳自动运行python脚本 注解:思路 核心:每次落稳之后截图,根据截图算出棋子的坐标和下一个块顶面的中点坐标, 根据两个点的距离乘以一个时间系数获得长按的时间 识别棋子:靠棋子的颜色来识别

  • 微信跳一跳小游戏python脚本

    Python编写微信小游戏"跳一跳"的运行脚本,分享给大家. 更新了微信后发现了一款小游戏跳一跳,但是玩了一下午最高才达到200,每次差点破纪录后总是手抖就挂掉了,气的想要砸手机.闲来无事刷微博的时候正好看到有人分析如何编写脚本自动运行游戏破了3000多分,细看后觉得原理并不复杂,就索性花了一个晚上,参考大神的实现方法,在他的基础上删减了一些代码,也用Python写了个脚本.接下来进行原理和代码分析. 图1.跳一跳启动界面 原理 配置adb环境变量,在我的电脑–>属性–>高

  • 微信跳一跳辅助python代码实现

    微信跳一跳辅助的python具体实现代码,供大家参考,具体内容如下 这是一个 2.5D 插画风格的益智游戏,玩家可以通过按压屏幕时间的长短来控制这个「小人」跳跃的距离.可能刚开始上手的时候,因为时间距离之间的关系把握不恰当,只能跳出几个就掉到了台子下面. 玩法类似于<flappy bird> 下载github的一个程序,但是在windows10下不能运行,原因是windows10下没有copy命令了,修改为Python自带的复制方法,即可完成.今天运行好像一开始不能正确跳第一次,人工辅助后,后

  • python3实现跳一跳点击跳跃

    借鉴了网上一些大神的代码和思路,这里整理一下写出点击跳跃玩跳一跳这个小游戏的思路 一.整体思路 棋子所在的坐标以及下一步所要到的坐标,根据两个坐标计算出两点之间距离进行跳跃. 二.分布思路 1.根据命令截图获取初始图保存到手机,然后上传到本地文件夹 2.将获取的截图放入新建的坐标轴中(matplotlib) 3.通过鼠标点击事件获取所在初始坐标以及重点坐标,并计算出直线距离 4.进行跳跃,跳跃完成后清空坐标并更新截图 三.所用到的相关技术或模块 1.python3基础 2.numpy 3.mat

  • 微信跳一跳自动运行python脚本

    本文实例为大家分享了微信小程序跳一跳自动运行脚本,供大家参考,具体内容如下 1.压缩包带了adb等必须工具,配置一下环境变量即可 2.Python 直接运行即可 (Python3.6) 代码: wechat_jump_auto.py # coding: utf-8 ''' # === 思路 === # 核心:每次落稳之后截图,根据截图算出棋子的坐标和下一个块顶面的中点坐标, # 根据两个点的距离乘以一个时间系数获得长按的时间 # 识别棋子:靠棋子的颜色来识别位置,通过截图发现最下面一行大概是一条

  • 微信跳一跳游戏python脚本

    微信更新后出来了一块比较火的小游戏,要是一款不涉及到排行的游戏,可能 没人去关注这款游戏.最开自己一直苦练技术,想在微信排行上面装一装,练了好久才跑三百多分.接着在Github(Github地址:https://github.com/wangshub/wechat_jump_game),有一个大神发布了,一个Python脚本自动跳,分数随便跳,当然分数不要太高,分数太高了,微信是不会把分数录上去了,在好友排行刷个第一名还是可以的. 这个大神已经讲了关于安装的过程,大家可以去参考一下,不过有些地方

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

    1.   OpenCV:模板匹配.    获得小跳棋中心位置 2.   OpenCV:边缘检测.    获得下一方块中心位置 Python+ADB+OpenCv,实现「 跳一跳 」自动化. / 01 / ADB ADB工具即Android Debug Bridge(安卓调试桥) tools. ADB 是一个命令行窗口,用于通过电脑端与模拟器或者真实设备交互. 与之前小F接触过的Appium有点相似. ADB的安装很简单,就是将安装包解压后,将路径添加到系统的环境变量中即可. 然后使用Python

  • 跳一跳自动跳跃C#代码实现

    最近这款"跳一跳"很火,在段子里面看到有人才放了张画着坐标的纸在手机上,说根据距离确定摁的"嘟"的次数,还有通过程序来实现自动计算的.看得心血来潮忍不住来试一试?话不多说,先上图. 因为比较急着做出成品,所以细节上没多细抠.感觉设置的跳跃速度稍快了一点,有兴趣的同学可以实测一下.也有一个因素是测试时后台程序比较多,影响了结果.        原理其实也是跟大家想的一样很简单,无非就是三个要素:距离.速度.时间.就是通过当前小蓝人脚底所在的像素坐标和目标平台中心像素的

  • python微信跳一跳游戏辅助代码解析

    这个代码实现的是   手动点击起点 和 终点  ,程序自动判断距离.触屏时间  完成跳跃 原理(摘自项目说明页面): 1. 将手机点击到"跳一跳"小程序界面: 2. 用Adb 工具获取当前手机截图,并用adb将截图pull上来: adb shell screencap -p /sdcard/1.png adb pull /sdcard/1.png . 3. 用matplot显示截图: 4. 用鼠标点击起始点和目标位置,计算像素距离: 5. 根据像素距离,计算按压时间: 6. 用Adb工

  • python微信跳一跳系列之棋子定位像素遍历

    前言 在前几篇博客中,分别就棋子的颜色识别.模板匹配等定位方式进行了介绍和实践,这一篇博客就来验证一下github中最热门的跳一跳外挂中采用的像素遍历的方法. 方法说明 像素遍历的实质依然是颜色识别. 在github中给出的方法中,采用像素遍历的方法是: 从高度的1/3处开始至高度的2/3处进行遍历: 首先间隔50像素进行搜索 当像素的颜色和每一行开始的像素颜色不同时,认为找到了最上面的棋盘位置,则返回上一个间隔处开始遍历(i-50): 对每一行的像素都进行遍历,当满足给定的颜色范围时,记录最下

  • python微信跳一跳系列之自动计算跳一跳距离

    到现在为止,我们通过前面几篇博文的描述和分析,已经可以自动实现棋子.棋盘位置的准确判断,计算一下两个中心点之间的距离,并绘制在图形上,效果如下. 效果 图中的棋子定位采用HSV颜色识别,棋盘定位采用轮廓分割的方法获得,感兴趣的同学可以对其它的定位方法自行验证. 代码 # -*- coding: utf-8 -*- #VS2017+python3.6+opencv3.4 #2018.02.03 #作者:艾克思 import cv2 import numpy as np import math de

  • python微信跳一跳系列之色块轮廓定位棋盘

    在前几篇博文中,我们分别采用颜色识别,模板匹配,像素遍历等方法实现了棋子和棋盘的定位,具体内容可以参见我的前面的文章内容,在这一篇中,我们来探索一种定位棋盘的新方法. 分析 经过观察,我们看到,无论什么情况下,棋盘和背景之间总是存在着非常明显的色彩对比,这当然是必须的,否则玩游戏的人都无法分辨棋子.棋盘.背景,这个游戏就不可能大火.显然,如果我们将每一幅画面进行色块分割,将彩色图转变为黑白二值图,就可以将背景和棋盘隔离出来,然后对黑白图中的白色轮廓进行分析,将其中位置最高(y值最小)的轮廓标记出

  • python实现QQ空间自动点赞功能

    本文实例为大家分享了python实现QQ空间自动点赞的具体代码,供大家参考,具体内容如下 项目github地址 使用python实现qq空间自动点赞功能. 需自行安装库并配置环境. 我想实现的是每6个小时就自动更新一次cookie.这也是和网上其他版本相比具有的优点.不用手动输入cookie.更加自动.(不负责任的说,这个功能没有测试过.) 程序运行方法:将代码存为.py文件,运行即可. 输入QQ密码的时候采用了linux登录的方式--没有回显. from selenium import web

  • python微信跳一跳系列之棋子定位颜色识别

    python微信跳一跳,前言 这是python玩跳一跳系列博文中一篇,主要内容是用颜色识别的方法来进行跳跳小人的定位. 颜色识别 过观察,我们可以发现,尽管背景和棋子在不停的变化,但跳跳小人的形状和颜色基本保持不变,对于形状,我们在上一篇博文中已经采用模板匹配的方法来进行识别定位,效果非常好.这一篇博文就来对颜色识别进行验证. 基本思路 用HSV颜色空间对输入的图片进行处理,用某种指定的颜色进行蒙版mask处理进而得到二值化的黑白图像,膨胀和腐蚀后去除噪点,对轮廓区域进行计算,画出圆心和质心位置

  • Python实现某论坛自动签到功能

    1.[文件] DakeleSign.py ~ 4KB #!/usr/bin/env python # -*- coding: utf-8 -*- __author__ = 'poppy' ''' dakele bbs sigin ''' import sys import urllib2 import urllib import requests import cookielib import json from pyquery import PyQuery as pq import loggi

随机推荐