精华内容
下载资源
问答
  • 游戏脚本其实并不高深,最简单的体验方法就是下载一个Airtest了,直接截几个图片,几层代码,就可以按照自己的逻辑玩儿游戏了。当然,本篇文章不是要讲Airtest这个怎么用,而是用原始的python+opencv来实...

    前言

    最近在玩儿公主连结,之前也玩儿过阴阳师这样的游戏,这样的游戏都会有个初始号这样的东西,或者说是可以肝的东西。

    当然,作为一名程序员,肝这种东西完全可以用写代码的方式帮我们自动完成。游戏脚本其实并不高深,最简单的体验方法就是下载一个Airtest了,直接截几个图片,写几层代码,就可以按照自己的逻辑玩儿游戏了。

    19bbfaffb56e88f34da3d12bfcea83aaa0b48b09.gif

    当然,本篇文章不是要讲Airtest这个怎么用,而是用原始的python+opencv来实现上面的操作。

    这两天我写了一个公主连结刷初始号的程序,也不能算写游戏脚本的老手,这篇文章主要是分享一些基础的技术和使用上的心得吧。

    准备工作

    首先,我们要完成以下准备。安卓设备一个:模拟器或者真机都可以。

    安装ADB,并添加到系统的PATH里:adb是用来

    安装tesseract-ocr,并添加到系统的PATH里:帮助我们实现简单的字符识别

    安装python3.7以上的版本

    这里adb和tesseract我放在百度网盘里了,里面顺便放了一个录制的效果视频。链接:pan.baidu.com/s/1edTPu2o7… ?提取码:33aw

    python库安装

    pip install pillow pytesseract opencv-python

    除此以外,如果有需要可以安装uiautomator2,这篇文章就不涉及这块知识了。

    使用adb获取安卓设备

    这里我们主要是涉及到单个安卓设备的ADB连接操作,首先我们打开模拟器。

    然后我们调用adb devices来获取当前的安卓设备,我这里是一个模拟器。1cf6243e92313a78730fe026135026fabd3d5629.png

    接下来可以调用adb shell测试一下是否能进入到安卓设备的shell环境下,确认可以输入exit退出即可。cc51aa21710048e684f95460bbb38e986924f139.png

    如果有的时候进不了shell,可以先调用一下adb kill-server,然后再调用adb devices。

    可能常用的ADB Shell命令

    接下来是一些ADB的命令操作。通过adb命令,我们可以用python来操作的安卓设备。

    屏幕截图

    最常见的操作就是截图了,先调用screencap截图放到安卓设备里,然后再把截图下拉到电脑。

    def take_screenshot(): ? ? os.system("adb shell screencap -p /data/screenshot.png") ? ? os.system("adb pull /data/screenshot.png ./tmp.png")

    下拉文件

    下拉文件就是刚刚那个adb pull了,以公主连结为例,以下代码可以导出账号信息的xml,以后通过xml就可以登录了。

    os.system(f"adb pull /data/data/tw.sonet.princessconnect/shared_prefs/tw.sonet.princessconnect.v2.playerprefs.xml ./user_info.xml")

    上传文件

    有了下拉自然就有上传了,通过adb push即可完成。以公主连结为例,以下代码可以完成账号的切换。

    # 切换账号1 os.system("adb push ./user_info1.xml /data/data/tw.sonet.princessconnect/shared_prefs/tw.sonet.princessconnect.v2.playerprefs.xml") # 切换账号2 os.system("adb push ./user_info2.xml /data/data/tw.sonet.princessconnect/shared_prefs/tw.sonet.princessconnect.v2.playerprefs.xml") 复制代码

    点击屏幕某个位置

    def adb_click(center, offset=(0, 0)): ? ? (x, y) = center ? ? x += offset[0] ? ? y += offset[1] ? ? os.system(f"adb shell input tap {x} {y}")

    输入文字

    text = "YourPassword" os.system(f"adb shell input text {text}")

    删除字符

    有的时候输入框会有输入的缓存,我们需要删除字符。

    # 删除10个字符 for i in range(10): ? ? os.system("adb shell input keyevent 67") 复制代码

    查询当前运行的包名和Activity

    通过以下代码,可以查询当前运行的程序的Activity,也可以顺便查包名。

    adb shell dumpsys activity activities

    c9c4809ffe19cfd7bbd35755e787ed1f4d85cbbc.png

    停止某个应用

    有时候会需要停止某个应用,需要提供应用的包名。

    adb shell am force-stop tw.sonet.princessconnect 复制代码

    开启某个应用

    开启某个应用需要提供包名以及Activity。

    adb shell am start -W -n tw.sonet.princessconnect/jp.co.cygames.activity.OverrideUnityActivity

    图像操作

    对于图像的操作第一就是图像查找了,比如说像Airtest提供的这种,无非就是判断某个图像在不在截屏中,在的话在什么位置。28f5bfc08dda09f4421521674de637e4c3edfbb8.png

    除此之外还需要一些抠图,比如说我们想获取账号的id,账号的等级,需要截取出一部分图片然后进行OCR操作。869e85e84be179b74f99f001397afcdcbf29af55.png

    图像查找

    图像查找其实就是先拿到两张图片,然后调用cv2.matchTemplate方法来查找是否存在以及位置,这里匹配是一个相对模糊的匹配,会有一个相似度的概率,最高是1。我们设定一个阈值来判断模板是否在截屏里即可。

    这里截屏如下,文件名为tmp.png:8a235b683a31e6cdb5221afd64b0278b81768112.png

    模板如下:86a65621f81259faf5513e0e42cb42c2f38d8ce8.png

    代码如下:

    import cv2 def image_to_position(screen, template): ? ? image_x, image_y = template.shape[:2] ? ? result = cv2.matchTemplate(screen, template, cv2.TM_CCOEFF_NORMED) ? ? min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result) ? ? print("prob:", max_val) ? ? if max_val > 0.98: ? ? ? ? global center ? ? ? ? center = (max_loc[0] + image_y / 2, max_loc[1] + image_x / 2) ? ? ? ? return center ? ? else: ? ? ? ? return False if __name__ == "__main__": ? ? screen = cv2.imread('tmp.png') ? ? template = ?cv2.imread('Xuandan.png') ? ? print(image_to_position(screen, template))

    运行上述代码后,可以看到模板匹配出来的概率为0.9977,位置为(1165, 693),对于一张图片,左上角为原点,因为我的分辨率是1280 * 720,那么右下角的坐标就是(1280, 720)。可以看到我们这个选单其实就是刚好在右下角的位置。5dc3df5f07da2740dabb6fc2f116ea5934f58f93.png

    如何快速裁剪模板?(win10)

    游戏脚本其实并不是代码很难写,而是需要截很多的图,这些图要保证分辨率和原始一样。我发现在win10如果用画图打开图片d00ca2bf0b669de8e5d9ae5fa8f9fdb2c338df54.png

    可以保证使用QQ截屏出来的分辨率,和图片本身的分辨率一样。d05e9376d51bc08efeda91fa7d9aadcdb0cd3dad.png

    这个时候直接用qq截屏出来的模板即可直接用于识别。

    图像裁剪

    接下来就是有时候需要裁剪一些图像了,当然我们的模板图片也可以通过裁剪图片的方式得到,这样的模板图片是最准的。

    裁剪其实就是需要裁剪的位置,以及需要的高度和宽度,说白了就是一篇长方形的区域,下面的代码使用PIL库实现。

    from PIL import Image def crop_screenshot(img_file, pos_x, pos_y, width, height, out_file): ? ? img = Image.open(img_file) ? ? region = (pos_x, pos_y, pos_x + width, pos_y + height) ? ? cropImg = img.crop(region) ? ? cropImg.save(out_file) ? ? print("exported:", out_file) if __name__ == "__main__": ? ? crop_screenshot("tmp.png", 817,556, 190, 24, "test_id.png")

    上面的代码以截取玩家的id为例。4c9df1a7eaf93ba597ac70b9c926ddc4f086aac2.png

    运行代码后,得到截图如下:43758e00befa673c80ab86e32f784f9f16fba1db.png

    简单的OCR

    得到了以上的图片信息后就是进行OCR了,也就是光学字符识别。这里代码非常简单,只要调用API即可。

    from PIL import Image import pytesseract image = Image.open('test_id.png') content = pytesseract.image_to_string(image) ? # 识别图片 print(content)

    198298243d6591b9072aab423642dedb4a47b729.png

    不过需要注意的一点就是pytesseract识别出来的结果会有空格符,换行符这样的符号,真正要用的时候进行一些字符的过滤即可。

    The End

    这篇文章到这里就结束了,主要还是介绍一些ADB以及图像相关的基础操作,有些内容比如说多开和uiautomator2因为我暂时没用到所以就没写,百度一下应该也不是很难。代码写的比较丑还没完善好,就先不放了。

    作者:叁公子KCN

    链接:https://juejin.im/post/6860726908833759239

    来源:掘金

    展开全文
  • 最近玩一个手游,非常肝,想脚本做做日常啥的,请问各位大佬用python写的话,需要用到哪些知识和工具跟模块呢
  • 引言最近python语言大火,除了在科学计算领域python有用武之地之外,在游戏、后台等方面,python也大放异彩,本篇博文将按照正规的项目开发流程,手把手教大家python游戏,来感受下其中的有趣之处。...

    引言

    最近python语言大火,除了在科学计算领域python有用武之地之外,在游戏、后台等方面,python也大放异彩,本篇博文将按照正规的项目开发流程,手把手教大家写个python小游戏,来感受下其中的有趣之处。本次开发的游戏叫做alien invasion。

    安装pygame并创建能左右移动的飞船

    安装pygame

    本人电脑是windows 10、python3.6,pygame下载地址: 传送门

    请自行下载对应python版本的pygame 运行以下命令

    $ pip install wheel

    $ pip install pygame‑1.9.3‑cp36‑cp36m‑win_amd64.whl

    创建Pygame窗口及响应用户输入

    新建一个文件夹alien_invasion,并在文件夹中新建alien_invasion.py文件,输入如下代码。

    import sys

    import pygame

    def run_game():

    #initialize game and create a dispaly object

    pygame.init()

    screen = pygame.display.set_mode((1200,800))

    pygame.display.set_caption("Alien Invasion")

    # set backgroud color

    bg_color = (230,230,230)

    # game loop

    while True:

    # supervise keyboard and mouse item

    for event in pygame.event.get():

    if event.type == pygame.QUIT:

    sys.exit()

    # fill color

    screen.fill(bg_color)

    # visualiaze the window

    pygame.display.flip()

    run_game()

    运行上述代码,我们可以得到一个灰色界面的窗口:

    $ python alien_invasion.py

    201842161817865.jpg?201832161844

    创建设置类

    为了在写游戏的过程中能便捷地创建一些新功能,下面额外编写一个settings模块,其中包含一个Settings类,用于将所有设置存储在一个地方。这样在以后项目增大时修改游戏的外观就更加容易。 我们首先将alien_invasion.py中的显示屏大小及显示屏颜色进行修改。 首先在alien_invasion文件夹下新建python文件settings.py,并向其中添加如下代码:

    class Settings(object):

    """docstring for Settings"""

    def __init__(self):

    # initialize setting of game

    # screen setting

    self.screen_width = 1200

    self.screen_height = 800

    self.bg_color = (230,230,230)

    然后再alien_invasion.py中导入Settings类,并使用相关设置,修改如下:

    import sys

    import pygame

    from settings import Settings

    def run_game():

    #initialize game and create a dispaly object

    pygame.init()

    ai_settings = Settings()

    screen = pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height))

    pygame.display.set_caption("Alien Invasion")

    # set backgroud color

    bg_color = (230,230,230)

    # game loop

    while True:

    # supervise keyboard and mouse item

    for event in pygame.event.get():

    if event.type == pygame.QUIT:

    sys.exit()

    # fill color

    screen.fill(ai_settings.bg_color)

    # visualiaze the window

    pygame.display.flip()

    run_game()

    添加飞船图像

    接下来,我们需要将飞船加入游戏中。为了在屏幕上绘制玩家的飞船,我们将加载一幅图像,再使用Pygame()方法blit()绘制它。 在游戏中几乎可以使用各种类型的图像文件,但是使用位图(.bmp)文件最为简单,这是因为Pygame默认加载位图。虽然其他类型的图像也能加载,但是需要安装额外的库。我们推荐去免费的图片素材网站上去找图像: 传送门 。我们在主项目文件夹(alien_invasion)中新建一个文件夹叫images,将如下bmp图片放入其中。

    201842161943551.jpg?201832161957

    接下来,我们创建飞船类ship.py:

    import pygame

    class Ship():

    def __init__(self,screen):

    #initialize spaceship and its location

    self.screen = screen

    # load bmp image and get rectangle

    self.image = pygame.image.load('image/ship.bmp')

    self.rect = self.image.get_rect()

    self.screen_rect = screen.get_rect()

    #put spaceship on the bottom of window

    self.rect.centerx = self.screen_rect.centerx

    self.rect.bottom = self.screen_rect.bottom

    def blitme(self):

    #buld the spaceship at the specific location

    self.screen.blit(self.image,self.rect)

    最后我们在屏幕上绘制飞船,即在alien_invasion.py文件中调用blitme方法:

    import sys

    import pygame

    from settings import Settings

    from ship import Settings

    def run_game():

    #initialize game and create a dispaly object

    pygame.init()

    ai_settings = Settings()

    screen = pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height))

    ship = Ship(screen)

    pygame.display.set_caption("Alien Invasion")

    # set backgroud color

    bg_color = (230,230,230)

    # game loop

    while True:

    # supervise keyboard and mouse item

    for event in pygame.event.get():

    if event.type == pygame.QUIT:

    sys.exit()

    # fill color

    screen.fill(ai_settings.bg_color)

    ship.blitme()

    # visualiaze the window

    pygame.display.flip()

    run_game()

    重构:模块game_functions

    在大型项目中,经常需要在添加新代码前重构既有代码。重构的目的是为了简化代码的结构,使其更加容易扩展。我们将实现一个game_functions模块,它将存储大量让游戏Alien invasion运行的函数。通过创建模块game_functions,可避免alien_invasion.py太长,使其逻辑更容易理解。

    函数check_events()

    首先我们将管理事件的代码移到一个名为check_events()的函数中,目的是为了隔离事件循环

    import sys

    import pygame

    def check_events():

    #respond to keyboard and mouse item

    for event in pygame.event.get():

    if event.type == pygame.QUIT:

    sys.exit()

    然后我们修改alien_invasion.py代码,导入game_functions模块,并将事件循环替换成对函数check_events()的调用:

    import sys

    import pygame

    from settings import Settings

    from ship import Ship

    import game_functions as gf

    def run_game():

    #initialize game and create a dispaly object

    pygame.init()

    ai_settings = Settings()

    总结

    以上所述是小编给大家介绍的Python写一个小游戏,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

    本文标题: 使用Python写一个小游戏

    本文地址: http://www.cppcns.com/jiaoben/python/224353.html

    展开全文
  • 如何用python写游戏脚本

    千次阅读 2020-08-17 13:43:08
    前言 最近在玩儿公主连结,之前也玩儿过阴阳师这样的游戏,这样的游戏都会有个初始号这样的东西,或者说是可以肝的东西。 很多人学习python,不知道从何学起。 很多人学习python,掌握...游戏脚本其实并不高深,最简

    前言

    最近在玩儿公主连结,之前也玩儿过阴阳师这样的游戏,这样的游戏都会有个初始号这样的东西,或者说是可以肝的东西。

    很多人学习python,不知道从何学起。
    很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手。
    很多已经做案例的人,却不知道如何去学习更加高深的知识。
    那么针对这三类人,我给大家提供一个好的学习平台,免费领取视频教程,电子书籍,以及课程的源代码!
    QQ群:101677771

    当然,作为一名程序员,肝这种东西完全可以用写代码的方式帮我们自动完成。游戏脚本其实并不高深,最简单的体验方法就是下载一个Airtest了,直接截几个图片,写几层代码,就可以按照自己的逻辑玩儿游戏了。

    当然,本篇文章不是要讲Airtest这个怎么用,而是用原始的python+opencv来实现上面的操作。

    这两天我写了一个公主连结刷初始号的程序,也不能算写游戏脚本的老手,这篇文章主要是分享一些基础的技术和使用上的心得吧。

    准备工作

    首先,我们要完成以下准备。

    • 安卓设备 一个:模拟器或者真机都可以。
    • 安装 ADB ,并添加到系统的 PATH 里:adb是用来
    • 安装 tesseract-ocr ,并添加到系统的 PATH 里:帮助我们实现简单的字符识别
    • 安装 python3.7 以上的版本

    这里adb和tesseract我放在百度网盘里了,里面顺便放了一个录制的效果视频。

    链接: pan.baidu.com/s/1edTPu2o7… 提取码:33aw

    python库安装

    pip install pillow pytesseract opencv-python
    复制代码

    除此以外,如果有需要可以安装 uiautomator2 ,这篇文章就不涉及这块知识了。

    使用 adb 获取安卓设备

    这里我们主要是涉及到单个安卓设备的ADB连接操作,首先我们打开模拟器。

    然后我们调用 adb devices 来获取当前的安卓设备,我这里是一个模拟器。

    接下来可以调用 adb shell 测试一下是否能进入到安卓设备的shell环境下,确认可以输入 exit 退出即可。

    如果有的时候进不了shell,可以先调用一下 adb kill-server ,然后再调用 adb devices 。

    可能常用的ADB Shell命令

    接下来是一些ADB的命令操作。通过adb命令,我们可以用python来操作的安卓设备。

    屏幕截图

    最常见的操作就是截图了,先调用 screencap 截图放到安卓设备里,然后再把截图下拉到电脑。

    def take_screenshot():
        os.system("adb shell screencap -p /data/screenshot.png")
        os.system("adb pull /data/screenshot.png ./tmp.png")
    复制代码

    下拉文件

    下拉文件就是刚刚那个 adb pull 了,以公主连结为例,以下代码可以导出账号信息的xml,以后通过xml就可以登录了。

    os.system(f"adb pull /data/data/tw.sonet.princessconnect/shared_prefs/tw.sonet.princessconnect.v2.playerprefs.xml ./user_info.xml")
    复制代码

    上传文件

    有了下拉自然就有上传了,通过 adb push 即可完成。以公主连结为例,以下代码可以完成账号的切换。

    # 切换账号1
    os.system("adb push ./user_info1.xml /data/data/tw.sonet.princessconnect/shared_prefs/tw.sonet.princessconnect.v2.playerprefs.xml")
    
    # 切换账号2
    os.system("adb push ./user_info2.xml /data/data/tw.sonet.princessconnect/shared_prefs/tw.sonet.princessconnect.v2.playerprefs.xml")
    复制代码

    点击屏幕某个位置

    def adb_click(center, offset=(0, 0)):
        (x, y) = center
        x += offset[0]
        y += offset[1]
        os.system(f"adb shell input tap {x} {y}")
    复制代码

    输入文字

    text = "YourPassword"
    os.system(f"adb shell input text {text}")
    复制代码

    删除字符

    有的时候输入框会有输入的缓存,我们需要删除字符。

    # 删除10个字符
    for i in range(10):
        os.system("adb shell input keyevent 67")
    复制代码

    查询当前运行的包名和Activity

    通过以下代码,可以查询当前运行的程序的Activity,也可以顺便查包名。

    adb shell dumpsys activity activities
    复制代码

    停止某个应用

    有时候会需要停止某个应用,需要提供应用的包名。

    adb shell am force-stop tw.sonet.princessconnect
    复制代码

    开启某个应用

    开启某个应用需要提供包名以及Activity。

    adb shell am start -W -n tw.sonet.princessconnect/jp.co.cygames.activity.OverrideUnityActivity
    复制代码

    图像操作

    对于图像的操作第一就是图像查找了,比如说像Airtest提供的这种,无非就是判断某个图像在不在截屏中,在的话在什么位置。

    除此之外还需要一些抠图,比如说我们想获取 账号的id , 账号的等级 ,需要截取出一部分图片然后进行OCR操作。

    图像查找

    图像查找其实就是先拿到两张图片,然后调用 cv2.matchTemplate 方法来查找是否存在以及位置,这里匹配是一个相对模糊的匹配,会有一个相似度的概率,最高是1。我们设定一个阈值来判断模板是否在截屏里即可。

    这里截屏如下,文件名为 tmp.png :

    模板如下:

    代码如下:

    import cv2
    
    def image_to_position(screen, template):
        image_x, image_y = template.shape[:2]
        result = cv2.matchTemplate(screen, template, cv2.TM_CCOEFF_NORMED)
        min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
        print("prob:", max_val)
        if max_val > 0.98:
            global center
            center = (max_loc[0] + image_y / 2, max_loc[1] + image_x / 2)
            return center
        else:
            return False
    
    if __name__ == "__main__":
        screen = cv2.imread('tmp.png')
        template =  cv2.imread('Xuandan.png')
        print(image_to_position(screen, template))
    复制代码

    运行上述代码后,可以看到模板匹配出来的概率为 0.9977 ,位置为(1165, 693),对于一张图片,左上角为原点,因为我的分辨率是1280 * 720,那么右下角的坐标就是(1280, 720)。可以看到我们这个选单其实就是刚好在右下角的位置。

     

    如何快速裁剪模板?(win10)

    游戏脚本其实并不是代码很难写,而是需要截很多的图,这些图要保证分辨率和原始一样。我发现在win10如果用画图打开图片

    可以保证使用QQ截屏出来的分辨率,和图片本身的分辨率一样。

    这个时候直接用qq截屏出来的模板即可直接用于识别。

    图像裁剪

    接下来就是有时候需要裁剪一些图像了,当然我们的模板图片也可以通过裁剪图片的方式得到,这样的模板图片是最准的。

    裁剪其实就是需要裁剪的位置,以及需要的高度和宽度,说白了就是一篇长方形的区域,下面的代码使用PIL库实现。

    from PIL import Image
    
    def crop_screenshot(img_file, pos_x, pos_y, width, height, out_file):
        img = Image.open(img_file)
        region = (pos_x, pos_y, pos_x + width, pos_y + height)
        cropImg = img.crop(region)
        cropImg.save(out_file)
        print("exported:", out_file)
    
    if __name__ == "__main__":
        crop_screenshot("tmp.png", 817,556, 190, 24, "test_id.png")
    
    复制代码

    上面的代码以截取玩家的id为例。

    运行代码后,得到截图如下:

    简单的OCR

    得到了以上的图片信息后就是进行OCR了,也就是光学字符识别。这里代码非常简单,只要调用API即可。

    from PIL import Image
    import pytesseract
    
    image = Image.open('test_id.png')
    content = pytesseract.image_to_string(image)   # 识别图片
    print(content)
    
    复制代码

    不过需要注意的一点就是pytesseract识别出来的结果会有空格符,换行符这样的符号,真正要用的时候进行一些字符的过滤即可。

    The End

    这篇文章到这里就结束了,主要还是介绍一些ADB以及图像相关的基础操作,有些内容比如说多开和uiautomator2因为我暂时没用到所以就没写,百度一下应该也不是很难。代码写的比较丑还没完善好,就先不放了。

    展开全文
  • 游戏脚本其实并不高深,最简单的体验方法就是下载一个Airtest了,直接截几个图片,几层代码,就可以按照自己的逻辑玩儿游戏了。当然,本篇文章不是要讲Airtest这个怎么用,而是用原始的python+opencv来实...

    前言

    最近在玩儿公主连结,之前也玩儿过阴阳师这样的游戏,这样的游戏都会有个初始号这样的东西,或者说是可以肝的东西。

    当然,作为一名程序员,肝这种东西完全可以用写代码的方式帮我们自动完成。游戏脚本其实并不高深,最简单的体验方法就是下载一个Airtest了,直接截几个图片,写几层代码,就可以按照自己的逻辑玩儿游戏了。

    19bbfaffb56e88f34da3d12bfcea83aaa0b48b09.gif

    当然,本篇文章不是要讲Airtest这个怎么用,而是用原始的python+opencv来实现上面的操作。

    这两天我写了一个公主连结刷初始号的程序,也不能算写游戏脚本的老手,这篇文章主要是分享一些基础的技术和使用上的心得吧。

    准备工作

    首先,我们要完成以下准备。安卓设备一个:模拟器或者真机都可以。

    安装ADB,并添加到系统的PATH里:adb是用来

    安装tesseract-ocr,并添加到系统的PATH里:帮助我们实现简单的字符识别

    安装python3.7以上的版本

    这里adb和tesseract我放在百度网盘里了,里面顺便放了一个录制的效果视频。链接:pan.baidu.com/s/1edTPu2o7…  提取码:33aw

    python库安装

    pip install pillow pytesseract opencv-python

    除此以外,如果有需要可以安装uiautomator2,这篇文章就不涉及这块知识了。

    使用adb获取安卓设备

    这里我们主要是涉及到单个安卓设备的ADB连接操作,首先我们打开模拟器。

    然后我们调用adb devices来获取当前的安卓设备,我这里是一个模拟器。1cf6243e92313a78730fe026135026fabd3d5629.png

    接下来可以调用adb shell测试一下是否能进入到安卓设备的shell环境下,确认可以输入exit退出即可。cc51aa21710048e684f95460bbb38e986924f139.png

    如果有的时候进不了shell,可以先调用一下adb kill-server,然后再调用adb devices。

    可能常用的ADB Shell命令

    接下来是一些ADB的命令操作。通过adb命令,我们可以用python来操作的安卓设备。

    屏幕截图

    最常见的操作就是截图了,先调用screencap截图放到安卓设备里,然后再把截图下拉到电脑。

    def take_screenshot():     os.system("adb shell screencap -p /data/screenshot.png")     os.system("adb pull /data/screenshot.png ./tmp.png")

    下拉文件

    下拉文件就是刚刚那个adb pull了,以公主连结为例,以下代码可以导出账号信息的xml,以后通过xml就可以登录了。

    os.system(f"adb pull /data/data/tw.sonet.princessconnect/shared_prefs/tw.sonet.princessconnect.v2.playerprefs.xml ./user_info.xml")

    上传文件

    有了下拉自然就有上传了,通过adb push即可完成。以公主连结为例,以下代码可以完成账号的切换。

    # 切换账号1 os.system("adb push ./user_info1.xml /data/data/tw.sonet.princessconnect/shared_prefs/tw.sonet.princessconnect.v2.playerprefs.xml") # 切换账号2 os.system("adb push ./user_info2.xml /data/data/tw.sonet.princessconnect/shared_prefs/tw.sonet.princessconnect.v2.playerprefs.xml") 复制代码

    点击屏幕某个位置

    def adb_click(center, offset=(0, 0)):     (x, y) = center     x += offset[0]     y += offset[1]     os.system(f"adb shell input tap {x} {y}")

    输入文字

    text = "YourPassword" os.system(f"adb shell input text {text}")

    删除字符

    有的时候输入框会有输入的缓存,我们需要删除字符。

    # 删除10个字符 for i in range(10):     os.system("adb shell input keyevent 67") 复制代码

    查询当前运行的包名和Activity

    通过以下代码,可以查询当前运行的程序的Activity,也可以顺便查包名。

    adb shell dumpsys activity activities

    c9c4809ffe19cfd7bbd35755e787ed1f4d85cbbc.png

    停止某个应用

    有时候会需要停止某个应用,需要提供应用的包名。

    adb shell am force-stop tw.sonet.princessconnect 复制代码

    开启某个应用

    开启某个应用需要提供包名以及Activity。

    adb shell am start -W -n tw.sonet.princessconnect/jp.co.cygames.activity.OverrideUnityActivity

    图像操作

    对于图像的操作第一就是图像查找了,比如说像Airtest提供的这种,无非就是判断某个图像在不在截屏中,在的话在什么位置。28f5bfc08dda09f4421521674de637e4c3edfbb8.png

    除此之外还需要一些抠图,比如说我们想获取账号的id,账号的等级,需要截取出一部分图片然后进行OCR操作。869e85e84be179b74f99f001397afcdcbf29af55.png

    图像查找

    图像查找其实就是先拿到两张图片,然后调用cv2.matchTemplate方法来查找是否存在以及位置,这里匹配是一个相对模糊的匹配,会有一个相似度的概率,最高是1。我们设定一个阈值来判断模板是否在截屏里即可。

    这里截屏如下,文件名为tmp.png:8a235b683a31e6cdb5221afd64b0278b81768112.png

    模板如下:86a65621f81259faf5513e0e42cb42c2f38d8ce8.png

    代码如下:

    import cv2 def image_to_position(screen, template):     image_x, image_y = template.shape[:2]     result = cv2.matchTemplate(screen, template, cv2.TM_CCOEFF_NORMED)     min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)     print("prob:", max_val)     if max_val > 0.98:         global center         center = (max_loc[0] + image_y / 2, max_loc[1] + image_x / 2)         return center     else:         return False if __name__ == "__main__":     screen = cv2.imread('tmp.png')     template =  cv2.imread('Xuandan.png')     print(image_to_position(screen, template))

    运行上述代码后,可以看到模板匹配出来的概率为0.9977,位置为(1165, 693),对于一张图片,左上角为原点,因为我的分辨率是1280 * 720,那么右下角的坐标就是(1280, 720)。可以看到我们这个选单其实就是刚好在右下角的位置。5dc3df5f07da2740dabb6fc2f116ea5934f58f93.png

    如何快速裁剪模板?(win10)

    游戏脚本其实并不是代码很难写,而是需要截很多的图,这些图要保证分辨率和原始一样。我发现在win10如果用画图打开图片d00ca2bf0b669de8e5d9ae5fa8f9fdb2c338df54.png

    可以保证使用QQ截屏出来的分辨率,和图片本身的分辨率一样。d05e9376d51bc08efeda91fa7d9aadcdb0cd3dad.png

    这个时候直接用qq截屏出来的模板即可直接用于识别。

    图像裁剪

    接下来就是有时候需要裁剪一些图像了,当然我们的模板图片也可以通过裁剪图片的方式得到,这样的模板图片是最准的。

    裁剪其实就是需要裁剪的位置,以及需要的高度和宽度,说白了就是一篇长方形的区域,下面的代码使用PIL库实现。

    from PIL import Image def crop_screenshot(img_file, pos_x, pos_y, width, height, out_file):     img = Image.open(img_file)     region = (pos_x, pos_y, pos_x + width, pos_y + height)     cropImg = img.crop(region)     cropImg.save(out_file)     print("exported:", out_file) if __name__ == "__main__":     crop_screenshot("tmp.png", 817,556, 190, 24, "test_id.png")

    上面的代码以截取玩家的id为例。4c9df1a7eaf93ba597ac70b9c926ddc4f086aac2.png

    运行代码后,得到截图如下:43758e00befa673c80ab86e32f784f9f16fba1db.png

    简单的OCR

    得到了以上的图片信息后就是进行OCR了,也就是光学字符识别。这里代码非常简单,只要调用API即可。

    from PIL import Image import pytesseract image = Image.open('test_id.png') content = pytesseract.image_to_string(image)   # 识别图片 print(content)

    198298243d6591b9072aab423642dedb4a47b729.png

    不过需要注意的一点就是pytesseract识别出来的结果会有空格符,换行符这样的符号,真正要用的时候进行一些字符的过滤即可。

    The End

    这篇文章到这里就结束了,主要还是介绍一些ADB以及图像相关的基础操作,有些内容比如说多开和uiautomator2因为我暂时没用到所以就没写,百度一下应该也不是很难。代码写的比较丑还没完善好,就先不放了。

    作者:叁公子KCN

    链接:https://juejin.im/post/6860726908833759239

    来源:掘金

    展开全文
  • 对于有兴趣学习游戏脚本的同学有一定的帮助。运行环境:Win10/Python3.5。主要模块:win32gui(识别窗口、窗口置顶等操作)、PIL(屏幕截图)、numpy(创建矩阵)、operator(比较值)、pymouse(模拟鼠标点击)。...
  • 游戏脚本其实并不高深,最简单的体验方法就是下载一个Airtest了,直接截几个图片,几层代码,就可以按照自己的逻辑玩儿游戏了。当然,本篇文章不是要讲Airtest这个怎么用,而是用原始的python+opencv来实...
  • python写lol游戏脚本俾格米人和搅拌机的引擎。python-ogre和panda3d是用c/c编写的,但只提供了一个python接口。 你好,蟒蛇可以在Android上工作。 因为你可以在Android上安装一个pythonruntime,这就行了! 就像...
  • 广告关闭腾讯云11.11云上盛惠 ,精选...python实用脚本实践一、文件相关查找文件import ospath = xxxfiles =os.listdir(path) for f in files: if f.endswith(.png) and fish in f:print(i found this + f) 分类文...
  • python调用已有的各种模块和方法,用来写游戏里的逻辑,并自行调试在游戏内跑效果,这是我非常熟练的。但是我不知道怎么用它来实现可执行的脚本,怎么读写文件,怎么查找替换等等!千里之行始于足下。要不...
  • 微信跳一跳已经落伍了,最近不是出了一个头脑王者的小游戏么,今天用Python编写一个脚本,调用百度API,进行自动检索答题,自动识别出现频率最多的答案,然后列出并选择。首先,我们要认识到,什么是脚本脚本的本质...
  • 前言想自己搞游戏小程序的在github 有人已经利用 python程序, 通过adb 获取不同型号安卓手机的系统截图,然后通过计算小人与目标位置距离之后得到准确的触摸时间,再通过 开发者模式里的 adb模拟触摸操作,实现电脑...
  • 之前电脑系统崩了,重装之后就直接安装Anaconda来使用Python语言(装的时候记得把添加路径勾上,不想装Anaconda可参考之前的Python环境搭建),咱们还是先用Sublime来写脚本吧。在Sublime上使用Anaconda里的Python...
  • 微信跳一跳已经落伍了,最近不是出了一个头脑王者的小游戏么,今天用Python编写一个脚本,调用百度API,进行自动检索答题,自动识别出现频率最多的答案,然后列出并选择。 首先,我们要认识到,什么是脚本 脚本的...
  • 第一次听到脚本,会不会...小编就有这样的感觉,事实上,脚本确实真的很厉害,能解决我们软件运行的大小问题,比如游戏时候,脚本也是很常见的哦~下面就教大家写脚本,一起来学习下吧~准备工具:安装python安装教程点击...
  • Python作为一门面向对象的性语言,其实它的学习也很简单- 配置- Python基础(语法、、数据类型、高级变量、函数、Python高级特性)- 面向对象编程、面向对象高级编程- 错误、调试、测试- 网络编程、进程、线程、协程...
  • 教你如何使用Python写游戏辅助脚本

    千次阅读 2019-05-05 14:15:00
    主要实现方式是通过...PIL: 图片处理模块 (python3 换成了 pillow) 下载地址:https://www.lfd.uci.edu/~gohlke/pythonlibs/ pywin32 : 用来模拟点击用的 pip install pypiwin32 tesseract : 实现图片文字...
  • 使用 Python 进行游戏脚本编程

    千次阅读 2012-09-29 16:18:06
    使用 Python 进行游戏脚本编程 作者 Bruce Dawson Humongous 娱乐公司 http://www.cygnus-software.com/papers/ 介绍 使用脚本语言可以更加快速地开发游戏逻辑,而不必担心由于 C++ 程序员的粗心大意所造成的...
  • 利用Python进行游戏脚本编程,不愧是最强的脚本语言! 使用脚本语言可以更加快速地开发游戏逻辑,而不必担心由于 C++ 程序员的粗心大意所造成的后果。使用已有的脚本语言可以节省开发新型自定义语言的时间和开销,...
  • 开始着手用Python写一个游戏脚本(一)

    万次阅读 多人点赞 2019-06-04 15:26:04
    学习python有一段时间了,由于python语言的强大和简洁,是一个不错的脚本语言,就准备做个游戏脚本练练手。 这次以热门手游楚留香作为练手的目标啦
  • 如果能利用Python做个自动化的脚本,帮我们自动玩游戏刷怪呢?不就意味着可以一直让我们的金币数目增加,而我们挂着电脑就可以了。对于LOL的脚本,我以前用过一个朋友做的软件,但是没有看他的代码,所以最近还在...
  • 使用脚本语言可以更加快速地...Python 对于游戏脚本语言来说是一种不错的选择,它很强大,容易嵌入使用,能够无缝地使用 C/C++ 进行扩展,包含很多脚本语言所具有的高级特性,并且它可以用来实现自动化过程[TR1: aut...
  • Python写一个游戏脚本,你会吗?

    千次阅读 2020-05-06 15:12:30
    学习python有一段时间了,由于python语言的强大和简洁,是一个不错的脚本语言,就准备做个游戏脚本练练手。 听说pywin32写脚本还不错 pywin32主要代码 我以楚留香的电脑版为例,记录脚本的编写之路吧。 因为主要...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 41,538
精华内容 16,615
关键字:

python写游戏脚本

python 订阅