用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)

 

下面就来看一下「跳一跳」自动跳跃的视频。

 

https://v.qq.com/x/page/e0887dhjvux.html

 

轻轻松松得分,毫无问题。

 

 

/ 03 / 总结

 

相关工具及代码已上传网盘,公众号回复「跳一跳」即可获取。

 

安装好ADB工具,然后通过数据线将安卓手机和电脑连接。

 

最后运行代码,亲测有效。

 

当然代码还是有待优化的,如下图~

 

 

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

 

所以还有待改进呢!!!

  • 7
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 游戏实际上是一个图形识别问题,需要识别屏幕上的棋子和目标位置,然后通过计算跳跃时间来模拟人的触摸操作。 下面是一种使用 Python 实现该游戏的方法: 1. 使用 Python 的图像处理库(如 OpenCV)截取手机屏幕。 2. 通过图像处理技术识别棋子和目标位置的位置。 3. 计算棋子与目标位置的距离和跳跃时间。 4. 通过 Python 的触摸操作库(如 ADB)模拟人的触摸操作,实现自动跳跃。 该方法的实现较为复杂,需要涉及到图像处理、计算机视觉等方面的知识,并且可能需要解决许多具体问题,如图像采集、识别准确度、触摸操作的稳定性等。 ### 回答2: 游戏是一款流行的小游戏,现在我们来学习如何使用Python实现这个游戏。 首先,我们需要导入相关的模块,如Pygame来创建游戏界面和处理用户输入。 接下来,我们需要定义一些全局变量,如屏幕的宽度和高度,小人的位置等。 然后,我们需要创建一个游戏主循环,不断更新游戏界面和处理用户操作。 在主循环中,我们需要监听用户的鼠标点击事件。当玩家点击鼠标时,我们需要计算并存储小人的位置和跳跃距离。 接下来,我们需要根据小人跳跃的距离计算出小人落地的位置,并绘制小人和落地的目标方块。 然后,我们需要根据小人的跳跃距离判断得分,并更新得分的显示。 最后,我们需要判断小人是否成功到目标位置,如果是,则游戏继续进行;如果不是,则游戏结束,并显示最终得分。 在实现过程中,还可以加入一些额外的功能,如添加音效、难度调节等,以提高游戏的趣味性。 总体来说,使用Python实现游戏是一项有趣且有挑战性的任务,通过学习和实践,我们可以更好地掌握Python编程技巧和游戏开发的知识。 ### 回答3: 是一款非常流行的手机游戏,我们可以用Python实现一个简化版的游戏。下面是一个可能的实现方案: 我们将使用Python中的pygame库来创建游戏窗口和显示游戏界面。首先需要安装pygame库,可以使用pip来安装,命令如下: ``` pip install pygame ``` 首先,我们需要导入pygame库,并进行一些必要的初始化,创建游戏窗口,设置窗口的大小等。然后,我们需要在窗口上绘制游戏的初始界面,包括小人的起位置和方块的位置。 接下来,我们需要监听用户的输入。当用户点击鼠标左键时,小人会向上跳跃跳跃的距离与鼠标点击的时间长度成正比。我们可以使用pygame的鼠标事件来监听鼠标点击事件,当鼠标点击时,记录下鼠标点击的时间,并计算小人跳跃的距离。 跳跃结束后,会有一个方块以一定的速度移动到小人的跳跃位置。我们需要在游戏窗口上绘制方块,并让方块向小人的位置移动。方块的速度可以通过随机函数来生成,保证每次游戏的难度都有所不同。 最后,我们需要判断小人是否成功上方块。我们可以通过判断小人与方块的距离来判断结果。如果小人上方块,则游戏继续,重新生成下一个方块;如果小人没有上方块,则判断游戏结束,显示最终得分。 总结一下,以上就是一种简化版的游戏的Python实现方案。实际上,游戏还有很多细节和功能,比如计分规则、音效、特殊道具等。如果要完整实现这些功能,需要更多的代码和逻辑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值