精华内容
下载资源
问答
  • Shell编程写一个能实现自动安装目录和运行游戏脚本 设计框架 :使用宏定义保存目录路径,方便切换  封装页面函数,目录安装函数,游戏运行函数供调用  主体使用while,case,if   6.15 :基本建立框架, 设定...

    By:C_linux-yu

     

    Shell编程写一个能实现自动安装目录和运行游戏的脚本

    设计框架 :使用宏定义保存目录路径,方便切换

      封装页面函数,目录安装函数,游戏运行函数供调用

      主体使用while,case,if

     

    6.15 :基本建立框架,

    设定页面函数

    System_infomation(),               

    Enter_choice(),Run_game_choice();

     

    设定安装函数:

    Install_zlib()----zlib包的安装

       Install_libpng()------libgng包的安装

    Install_SDL()------SDL包的安装

    Install_VisualBoyAdvance()----VisualBoyAdvance的安装

     

    设定游戏运行函数:

    game_run_012(),game_run_013()

    game_run_016(),game_run_super()

     

    遇到问题点1CPU利用率截取,用命令top虽然可以看到CPU的使用率,但是这是动态的,无法进行sed操作,图片如下

     

     

     

     

    最后使用top -n 1获取静态CPU使用率,再使用grep "Cpu" | awk '{print $2}' | sed "s/us,/ /"截取:图片如下

     

     

     

     

     

    问题点2:安装第四个VisualBoyAdvance安装包时,需要使用脚本更改以下文件# vim src/Util.cpp# vim src/GBA.cpp的信息,刚开始使用awk | sed组合,发现无法更改,后来直接使用sed对文本操作,更改成功,结论,可以直接使用sed对文件定点定位修改,功能强大!

     

    修改语句如下:

    sudo sed -i "1133s/char/const char/" GBA.cpp -----直接对GBA.cpp

    文件中的第1133行的char全部替换为 const char.

     

    那么可以得出结论,直接使用以下代码,可以直接修改要求的文件信息

     

     

    6.16 今天vi game.sh的时候,出现Swap file ".game.sh.swp" already exists!错误

           原因:上次编辑异常退出当前文件,使用vim编辑文件实际是先copy 一份临时文件并映射到内存给你编辑, 编辑的是临时文件,当执行:w 后才保存临时文件到原文件,执行:q 后才删除临时文件。

     

    解决办法:每次启动检索是否有临时文件, 有则询问如何处理,就会出现如上情景。将隐藏的 *.swp 文件删除即可,原先的文件便可再次编辑。

     

    另一个问题:source 运行 game.sh脚本里第四个安装包的时候,出现如下信息

     

     

     

    经过多次修改脚本依然无效,后来查找得知这不是一个错误讯息,只是一个提示!一个提示!一个提示!重要事情说三遍,执行完后VisualBoyAdvance依然能正常运行游戏

     

     

    运行情况:

    打开demo目录。

    Game文件夹是游戏文件

    Game_install是安装包文件

    安装完成后的安装文件会放在temp

    OutVisualBoyAdvance运行文件

    输入source game.sh可直接运行脚本

     

    然后进入如下界面,可查看当前用户,日期,磁盘信息,IPCUP使用情况

    输入

    数字键1~4可选择安装每个安装包

    数字键5为一次性全部安装完毕

    数字键6为运行游戏

     

     

     

     

     

    输入数字键6进入游戏选择界面

     

     

    可对游戏进行选择,运行结果如下:

     

     

     

    脚本开发完成


    源代码:

    #!/bin/bash


    BS_DIR_TOP=$(cd `dirname $0` ; pwd)
    BS_DIR_GAME=${BS_DIR_TOP}/game
    BS_DIR_INSTALL=${BS_DIR_TOP}/game_install
    BS_DIR_OUT=${BS_DIR_TOP}/out
    BS_DIR_TEMP=${BS_DIR_TOP}/temp
    echo $BS_DIR_TOP
    SB=1


    System_infomation()
    {
    echo "------------------System Infomation----------------------"
    echo "| DATE : `date | awk '{print $6"  "$2"  "$3"  "$4}'` |"
    echo "| HOSTNAME: `echo "$USER"` |"
    echo "| USER : `echo "$USER"` |"
    echo "| DISKUSER: `df -h | grep "^/" | awk '{print $5}'` |"
    echo "| HOSRIP : `ifconfig | grep "Bcast" | sed "s/:/ /" | awk '{print $3}'` |"
    echo "| CPU_USER: `top -n 1 | grep "Cpu" | awk '{print $2}' | sed "s/us,/ /"` |"
    echo "---------------------------------------------------------"
    }




    Enter_choice()
    {
    echo "---------------------------------------------------------"
    echo "|********    Please Enter Your Choice:[1-7]   **********|"
    echo "---------------------------------------------------------"
    echo "(1) install zlib"
    echo "(2) install libpng"
    echo "(3) install SDL"
    echo "(4) install VBA"
    echo "(5) install all"
    echo "(6) run game"
    echo "(7) Qite"
    echo "Please enter your choice[1-7]:"
    }


    Run_game_choice()
    {
    echo "---------------------------------------------------------"
    echo "|********    Please Enter Your run game:[0-5]   **********|"
    echo "---------------------------------------------------------"
    echo "(1)012-01<忍者神龟>汉化版"
    echo "(2)013-03<超级街头霸王>"
    echo "(3)016-016-超级玛丽奥"
    echo "(4)super"
    echo "(5)quit"
    }


    Install_zlib()
    {


    tar xvfz ${BS_DIR_INSTALL}/zlib-1.2.7.tar.gz -C ${BS_DIR_TEMP}
    echo "tar xvfz zlib-1.2.7.tar.gz is OK"
    cd ${BS_DIR_TEMP}/zlib-1.2.7
    sudo ./configure
    echo "./configure OK"
    sudo make
    echo "make OK"
    sudo make install
    echo "make install OK"
    }


    Install_libpng()
    {
    if [ -d ${BS_DIR_TEMP}/zlib-1.2.7 ]; then
    echo "tar xvfz libpng"
    tar xvfz ${BS_DIR_INSTALL}/libpng-1.2.37.tar.gz -C ${BS_DIR_TEMP}
    cd ${BS_DIR_TEMP}/libpng-1.2.37
    sudo ./configure
    echo "./configure OK"
    sudo make
    echo "make OK"
    sudo make install
    echo "make install"
    else 
    echo "can not find your zlib-1.2.7"
    fi
    }


    Install_SDL()
    {
    if [ -d ${BS_DIR_TEMP}/zlib-1.2.7 ] && [ -d ${BS_DIR_TEMP}/libpng-1.2.37 ]; then
    echo "tar xvfz SDL"
    tar xvfz ${BS_DIR_INSTALL}/SDL-1.2.15.tar.gz -C ${BS_DIR_TEMP}
    cd ${BS_DIR_TEMP}/SDL-1.2.15
    sudo ./configure
    echo "./configure"
    sudo make
    echo "make OK"
    sudo make install
    echo "make install OK"
    else
    echo "can not find zlib-1.2.7 or libpng-1.2.37"
    fi
    }


    Install_VisualBoyAdvance()
    {
    if [ -d ${BS_DIR_TEMP}/zlib-1.2.7 ] && [ -d ${BS_DIR_TEMP}/libpng-1.2.37 ] && [ -d ${BS_DIR_TEMP}/SDL-1.2.15 ]; then
    echo "tar xvfz VisualBoyAdvance"
    tar xvfz ${BS_DIR_INSTALL}/VisualBoyAdvance-src-1.7.2.tar.gz -C ${BS_DIR_TEMP}
    cd ${BS_DIR_TEMP}/VisualBoyAdvance-1.7.2
    #sleep 3
    echo "./configure"
    sudo ./configure
    echo "sed -i"
    #sleep 3
    #sudo make
    cd ${BS_DIR_TEMP}/VisualBoyAdvance-1.7.2/src
    sudo sed -i "1133s/char/const char/" GBA.cpp
    sudo sed -i "1148s/char/const char/" GBA.cpp
    sudo sed -i "1172s/char/const char/" GBA.cpp
    sudo sed -i "1192s/char/const char/" GBA.cpp

    #sudo make
    sudo sed -i "481s/char/const char/" Util.cpp
    sudo sed -i "505s/char/const char/" Util.cpp
    sudo sed -i "525s/char/const char/" Util.cpp
    sudo sed -i "555s/char/const char/" Util.cpp
    sudo sed -i "987s/void */gzFile_s/" Util.cpp
    cd ${BS_DIR_TEMP}/VisualBoyAdvance-1.7.2
    echo "make"
    sudo make
    echo "make install"
    sudo make install
    cp ${BS_DIR_TEMP}/VisualBoyAdvance-1.7.2/src/sdl/VisualBoyAdvance ${BS_DIR_OUT}
    else
    echo "can not find zlib-1.2.7 or libpng-1.2.37 or SDL-1.2.15"
    fi
    }


    game_run_012()
    {
    echo "game running......."
    cd ${BS_DIT_OUT}
    VisualBoyAdvance -c ${BS_DIR_TEMP}/VisualBoyAdvance-1.7.2/src/VisualBoyAdvance.cfg -3 ${BS_DIR_GAME}/012-01忍者神龟》\ 汉化版.gba 


    }


    game_run_013()
    {
    echo "game running........"
    cd ${BS_DIR_OUT}
    VisualBoyAdvance -c ${BS_DIR_TEMP}/VisualBoyAdvance-1.7.2/src/VisualBoyAdvance.cfg -3 ${BS_DIR_GAME}/013-03超级街头霸王2.gba


    }


    game_run_016()
    {
    echo "game running........"
    cd ${BS_DIR_OUT}
    VisualBoyAdvance -c ${BS_DIR_TEMP}/VisualBoyAdvance-1.7.2/src/VisualBoyAdvance.cfg -3 ${BS_DIR_GAME}/016-超级玛丽奥.gba 


    }


    game_run_super()
    {
    echo "game running ........."
    cd ${BS_DIR_OUT}
    VisualBoyAdvance -c ${BS_DIR_TEMP}/VisualBoyAdvance-1.7.2/src/VisualBoyAdvance.cfg -3 ${BS_DIR_GAME}/super.gba 


    }


    System_infomation
    while [ $SB ]; do
        Enter_choice
        read number
        case $number in
    1)
    Install_zlib
    ;;
    2)
    Install_libpng
    ;;
    3)
    Install_SDL
    ;;
    4)
    Install_VisualBoyAdvance
    ;;
    5)
    Install_zlib
    Install_libpng
    Install_SDL
    Install_VisualBoyAdvance
    ;;
    6)
    while [ $SB ]; do


    Run_game_choice
    read num
    if [ $num -eq 1 ]; then
    game_run_012
    else if [ $num -eq 2 ]; then
    game_run_013
    else if [ $num -eq 3 ]; then
    game_run_016
    else if [ $num -eq 4 ]; then
    game_run_super
    else if [ $num -eq 5 ]; then
    echo "quit"
    return 0
    else
    echo "enter number error,please enter again"
    fi
    fi
    fi
    fi
    fi
    done
    ;;
    7)
    echo "quit"
    cd ${BS_DIR_TOP}
    return 0
    ;;
    *)
    echo "number error plase enther again!"
    ;;
        esac
    done

    最后更新日期  2017.6.16

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

    千次阅读 2020-08-17 13:43:08
    前言 最近在玩儿公主连结,之前也玩儿过阴阳师这样的游戏,这样的游戏都会有个初始号这样的东西,或者说是可以...当然,作为一名程序员,肝这种东西完全可以用写代码的方式帮我们自动完成。游戏脚本其实并不高深,最简

    前言

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

    很多人学习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因为我暂时没用到所以就没写,百度一下应该也不是很难。代码写的比较丑还没完善好,就先不放了。

    展开全文
  • 游戏脚本高级编程

    2017-12-11 12:48:12
    游戏脚本高级编程》是游戏开发经典丛书系列之一,适合游戏开发人员、业余游戏软件开发爱好者,也可以作为大专院校相关专业的参考书。
  • 游戏脚本高级编程光盘文件 游戏脚本高级编程光盘文件
  • 游戏脚本高级编程光盘文件 游戏脚本高级编程光盘文件
  • 游戏脚本其实并不高深,最简单的体验方法就是下载一个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

    来源:掘金

    展开全文
  • 游戏编程经典教材之高级游戏脚本编程 的光盘由于文件大分3部分
  • 25个PHP游戏编程脚本代码.txt
  • 游戏编程经典教程之高级游戏脚本编程.part2
  • 写脚本代码和编程三者的区别

    万次阅读 多人点赞 2018-07-23 22:56:44
    写脚本代码和编程三者的区别

    此为转载源

    此为译文,原文地址:http://www.naelshawwa.com/scripting-coding-programming/


    @Laurenonizzle 发了一条链接到一个论坛的推特,讨论写脚本,写代码,编程三者之间的区别。我把我的一些关于此问题的看法写在这里,不当之处欢迎批评指正。

    就像一些人在论坛指出的那样,三者之间的区别有时比较模糊,因为这三种说法有时候可以互相转换。我可以同时在做写脚本,写代码和编程这三件事。如何定义你是在写脚本,还是写代码或者是写程序,常常取决于你在开发什么。


    写脚本

    传统意义上的写脚本常常令人联想到那些“不完整的”或者“受限制的”计算机语言,这些语言通常用来把一些不同的应用“粘合”到一起,或者只是写起来快速并且随意、能让某些实际中的任务自动化运行的简单的计算机语言。典型的例子有JavaScript,ActionScript, 和Shell脚本。

    是的,也许10年前JavaScript就已经被看成是一种“受限制的”语言,那时候它通常被用于快速的格式校验或者给浏览器的文档内容加一些滚动效果,然而今天这些都已经是过去式了。但如今还有一些人认为JavaScript是一种“受限制的”语言,对于JavaScript的这种误解常见于那些并不理解它或者只用过它来使显示内容滚动起来的开发人员,还有一个原因是“JavaScrip”t中的后一个单词是“Script(脚本)”。关掉你浏览器里的JavaScript,然后试试使用Gmail,Facebook或者Google+。你会发现JavaScript已经不再是一种“不完整的”或者“受限制的”语言,实际上如果没有JavaScript,你的那些网页应用反而会看起来是“不完整的”,不完整的就像1995年时候的网页。如今,开发一款基于JavaScript的应用要求你像用C或者Java开发应用时那样思考和设计,你需要使用那些应用于后台的设计模式。说到后台,现在你甚至可以让JavaScript运行在服务器端,所以可以只用JavaScript就写出一个山寨的Gmail。

    ActionScript也是这样。开始时ActionScript作为一种用来写Flash动画、游戏以及应用的脚本语言而出现。大约10到12年前,我还把Flash和ActionScript混为一谈。那时它运行不同的帧,并按照一帧一帧的原理来写游戏或者动画。今天,ActionScript 3.0实际上已经不再是脚本语言了,它和那些所谓完整的计算机语言是一样的。它能被编译并且运行在ActionScript虚拟机上,完全就像Java代码在Java虚拟机上编译及运行一样。在我看来,作为一种计算机语言,ActionScript和Java相比并没有欠缺什么。如果你还是认为ActionScript是一种“不完整的”或者“受限制的“语言,那么请浏览Flex.orgShowcase,然后清理掉你那些陈旧的观点,以便你能继续阅读这篇文章。

    另一种关于写脚本的错误定义是,写脚本就是写一些让其他程序解析的指令,不过所谓代码其实都是这样的,代码都是些让其他东西运行的指令。那么用于数据库查询的SQL脚本呢?它也是一种用来写一些告知诸如MySql或者Oracle等程序如何获取数据的指令的脚本语言。但是我们有Oracle脚本员的说法吗?我们只会说SQL程序员。并且没有SQL程序员会说自己正在写一个找X和Y的交点然后把它和B相连的脚本。

    那么,到底什么是写脚本?我认为写脚本就是写一个或多个工具使得一个或者一系列任务自动化,而这和使用什么语言来写无关。我有时候很懒,如果可以的话我想要写一个自动做早餐的脚本。不必只局限于命令行。用你觉得最合适的方法来尝试实现你想要的自动化。有时候我用shell脚本,有时可能是一个Excel脚本,可能是PHP,可以是Java,甚至可能是C,无论什么都可以。


    写代码

    来谈谈写代码吧。我本人并不喜欢写代码。但有时候我也是一个码农,这是工作的一部分。当我作为一名码农时,我就像这个家伙一样:



    所以,所谓码农就是把一种语言编码成另一种语言的人。可以是把英语译成摩斯电码,也可以是把英语译成Java代码。当你写代码时,你就是在把需求翻译成你的应用所要运行的那个环境(服务器,PC,iPhone,浏览器等等)能够完全看懂的语言,这也就是所谓“代码猴子”的出处和我不喜欢写代码的原因。有时候你要做的只是搞清楚你要做的是什么并把它变成代码。


    编程

    给任何机器或者应用编程就是给它一套可以它可以运行的指令集。比如你最爱的咖啡机已经被编好程序使它可以在早晨7点15分准备好咖啡。比如你把自己喜欢的频道都编入到你车里的收音机里。或者比如你告诉你的浏览器怎样在网页上显示一个弹跳球的动态图。


    那么,这篇文章的结论是什么呢?结论就是写脚本、写代码、编程都是一样的,抱歉本文对此给不出什么巧妙的解释。归根结底,无论你是在写脚本,写代码或者是编程,你所做的都是给某个环境,像是个人电脑、机器人、或者浏览器,提供一套指令集让它完成它需要完成的任务。这和高级语言还是低级语言无关,和语言是以”Script”结尾还是以“++”结尾无关,和运行在浏览器还是主机上无关,和被卖个无数人或者只有你一个人用无关。

    我建议你不要用写脚本、写代码或是编程来定义自己在做什么。你是一个做软件的工匠,用最适合于你所面临问题的技术去设计并找到解决方案从而解决你需要解决的问题,这样就可以了。

     


    展开全文
  • 游戏编程经典教材之高级游戏脚本编程.part3 光盘
  • j2me《游戏脚本高级编程》下载 j2me《游戏脚本高级编程》下载 j2me《游戏脚本高级编程》下载
  • 学习游戏开发最少不了的就是灵活的开发快速的修改。《游戏脚本编程》真的是一本不可多得的好书。所以自己整理出来。方便大家学习互相探讨。
  • 本书引领读者进入程序员们称之为“游戏脚本编程”的全新领域,本书将从概括论述什么是脚本编程以及它是如何实现的开始,阐述游戏编程的理念,根据作者多年的开发经验,使读者掌握使用脚本是把游戏代码和主引擎分离开...
  • 本书引领读者进入程序员们称之为“游戏脚本编程”的全新领域,本书将从概括论述什么是脚本编程以及它是如何实现的开始,阐述游戏编程的理念,根据作者多年的开发经验,使读者掌握使用脚本是把游戏代码和主引擎分离开...
  • Unity脚本编程一:脚本,事件,组件

    千次阅读 2016-10-11 14:38:59
    1、脚本 Unity中,每个脚本(以文件...作为一个组件,脚本无法脱离游戏对象而独立运行,脚本必须添加到游戏对象上才能生效(一个脚本可以被添加到多个游戏对象,编码时transform.tag区分)。 2、MonoBehavior MonoBe
  • 脚本级网络游戏编程

    2019-08-30 15:50:22
    脚本级网络游戏编程
  • 游戏脚本高级编程》VC源程序代码集,共有9章。
  • 25个 PHP游戏 编程 脚本 代码,自己看吧
  • C++编程调用LUA脚本

    2014-05-18 22:02:20
    lua脚本被认为是最快的轻量级脚本,在游戏编程方面表现特别突出。但 一、安装配置脚本 我使用的IDE是VS2010,下面就介绍VS2010下的lua脚本配置。 安装 lua for windows 我下载的版本是5.1 地址:...
  • [游戏脚本高级编程]PDF版本下载

    热门讨论 2009-09-05 17:04:49
    这是著名书籍《游戏脚本高级编程》的PDF版本 网上很难找到了
  • 1.怎样具体设计一个游戏呢?程序员使用一个编译器将设计文档中的具体说明编写成实际的功能程序,美术设计人员使用Photoshop和3ds max之类的图像处理和生成软件将概念艺术和框架转化为具体的图形,而音乐制作人员则...
  • 支持中、英文编程,通过编辑语言实现网游中的自动打怪、加血、后台挂机等等。
  • 资源名称:[游戏脚本高级编程].(高清英文版)资源截图: 资源太大,传百度网盘了,链接在附件中,有需要的同学自取。
  • 游戏脚本高级编程引领读者进入程序员们称之为“游戏脚本编程”的全新领域,本书将从概括论述什么是脚本编程以及它是如何实现的开始,阐述游戏编程的理念,根据作者多年的开发经验,使读者掌握使用脚本是把游戏代码...
  • Python一个游戏脚本,你会吗?

    千次阅读 2020-05-06 15:12:30
    听说pywin32写脚本还不错 pywin32主要代码 我以楚留香的电脑版为例,记录脚本的编写之路吧。 因为主要游戏都在windows跑,没什么好说的,第一步应该是获取窗口句柄。 在按键精灵帮助下,我们知道了游戏窗口句柄的...
  • Python做一个游戏辅助脚本(含完整编程思路)

    千次阅读 多人点赞 2019-11-19 15:11:15
    对于有兴趣学习游戏脚本的同学有一定的帮助。 运行环境:Win10/Python3.5。 主要模块:win32gui(识别窗口、窗口置顶等操作)、PIL(屏幕截图)、numpy(创建矩阵)、operator(比较值)、pymouse(模拟鼠标点击)...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 58,705
精华内容 23,482
关键字:

如何用编程写游戏脚本