精华内容
下载资源
问答
  • blog文章链接:http://www.godebug.org/index.php/archives/130/很早之前就知道了有tcc...可是没想到这个小玩意给了我不少的惊讶,之前闲着么事逛陈皓的blog发现它能把C当脚本使,感觉有点惊讶,不过觉得C比起bash...

    blog文章链接:http://www.godebug.org/index.php/archives/130/

    很早之前就知道了有tcc这么个玩意,不过当时对这玩意兴趣不大,因为他官网上主要是在说tcc的编译速度很快甩GCC好几条街之类的,当时觉得似乎意义不是很大就没再关心过,可是没想到这个小玩意给了我不少的惊讶,之前闲着么事逛陈皓的blog发现它能把C当脚本使,感觉有点惊讶,不过觉得C比起bash或者python什么的毫无优势可言,于是还是只当是个玩具。再后来因为项目需要用脚本来实现一些逻辑经常需要改动的地方,就一直在用lua+luabridge来搞的,不过习惯了类C语言的语法,总觉得lua的语法很别扭,于是想换一个,思来想去的,考虑过python,考虑过V8搞js,可惜python和V8,要么比较大,一堆没用的库;要么编译麻烦,还没什么基础库。正烦艹中想到了tcc,记得当时用了下他是可以调用C的标准库,也可以调用系统API,而且还是C语言的,正合我意。

    当时还想是要自己改tcc的源码,搞出来接口供我的程序调用,没想到又仔细看了下tcc发现人家本来就提供了个libtcc,是可以直接拿来用的,这下可把我乐坏了,于是就开始学习这玩意怎么用。到现在用libtcc当脚本引擎也快半年了,感觉相当不错,于是写一篇文章来介绍下。

    其实想想C++和脚本的交互,无非就是个C++代码能调用脚本的函数,脚本能调用C++的函数,这就够了,既然脚本是C,而且几乎没有什么语言不支持C的接口,于是libtcc的接口相当的简单粗暴,就tcc_add_symbol和tcc_get_symbol两个函数,add是把宿主语言中的symbol“导出”给脚本用,get是从脚本中获取symbol。这个symbol可以是变量,也可以是函数指针(函数指针本来就是一个指针类型的变量)。不过如果是变量的话可能会涉及到生命周期或者变量的size是不是比sizeof(void*)大什么的,比较麻烦,所以我一直都是导出的函数,要导出变量也是弄一个get或者set函数,然后导出函数。

    交互的话,就是这么简单,具体使用方式请参考以下代码:

    https://github.com/avdbg/libtcc_example

    里面两个项目,一个是直接用了libtcc自带的的一个example,一个是把hello_win当成脚本来用,然后中间显示的字改成了从宿主语言中获取。

    可以看出来使用方法相当简单,tcc_new创建一个TCCState,然后根据这个state添加代码字符串(tcc_compile_string),添加代码文件或者库文件(tcc_add_file),添加希望在脚本中访问到的函数(tcc_add_symbol),然后获取要执行的脚本中的函数(先tcc_relocate然后tcc_get_symbol),完事后清理现场(tcc_delete),就是这么简单。

    至于执行速度,虽然没跟V8、luajit或者pypy这些专门jit优化过的引擎相比,但是libtcc也是jit执行的,而且tcc作者打破圆周率世界记录的程序就是这玩意编译的,这玩意还能“在15秒内从源代码编译并启动Linux系统”,想必不会慢到哪去..

    不过C做脚本的话有很多时候还是会觉得缺少许多脚本语言应该有的特性,没有lambda、静态类型还不支持泛型什么的不过相比起来上面的优点这些都瑕不掩瑜。

    之前为了研究tcc,还把他的源码加了个VS的工程,也好方便调试和学习。本来是想自己改造下libtcc加上lambda支持和动态类型,可惜自己对编译原理了解太少,完全不会搞,就再没动过..源码在这里。

    另外闲着没事看了一下作者的简介,也是个闪瞎我双眼的大牛:法布里斯 贝拉

    展开全文
  • 立即注册xDNF远古时期流行的一款名为“萝卜”的辅助相信很多人都知道的,功能强大到让无数玩家获益,那各位有没有想过用自己的双手敲出这样一个程序,来辅助自己的游戏呢?来看看什么是游戏脚本游戏脚本是一个工具,...

    马上注册,结交更多易友,享用更多功能,让你轻松玩转觅风论坛。

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    6ec6ef9f1d8639b2b55b77d5a99bd8c7.gif

    x

    DNF远古时期流行的一款名为“萝卜”的辅助相信很多人都知道的,功能强大到让无数玩家获益,那各位有没有想过用自己的双手敲出这样一个程序,来辅助自己的游戏呢?来看看

    什么是游戏脚本

    游戏脚本是一个工具,这个工具可以实现的功能是模拟人手的行为来自动进行游戏。说到这你可能还有些不懂,但是没关系,接下来的剖析会让你毛瑟顿开。

    制作游戏脚本的工具有哪些

    1.编程工具:制作游戏脚本是一个由浅入深的过程,但是首先你需要一些工具来完成你进步的目的。制作脚本的载体包括按键精灵、易语言、C语言等,这也是比较流行和主体的编程工具,其中最为普遍使用的还是大家比较熟悉的按键精灵和易语言,我这里将用易语言来做简单的案例演示。

    2.抓图工具:所谓抓图就是将游戏中的图色等信息体现成“文本型”的过程,类似的工具有很多,这里用“抓图工具A”代替。抓图工具A可以代替人的眼睛,把你看到的颜色等更加细节的展现出来,例如:“ffffff-000000”代表的就是白色,这是人眼无法确认的,有了抓图工具A才能精准地确认“色图”。

    3.DLL、模块:使用过易语言的人都会对模块很熟悉,通俗地说:模块就是预先编辑好的一些命令,可以以易语言为载体使用和调用。而DLL是计算机里最为普遍的存在,和模块有相似之处,都可以随时调用里面编辑好的命令。也正如此,使用模块和DLL可以方便脚本的写作,省时间的同时更能省空间。想要制作一个好的脚本,模块和DLL的运用是不可或缺的。

    工欲善其事,必先利其器。上面是写脚本最基本的工具,下面则是写脚本入门时需要掌握的知识。

    举例说明脚本的自动化操作是如何实现的

    记得自己在学习易语言制作游戏脚本的时候所进行的第一个学习案例就是用易语言编写“你好,易语言”。这也是入门易语言所必须进行的一次学习,虽然仅仅是简单的几行代码吧。在这之后也不要着急去制作脚本,因为你还有很多关于易语言的知识没有了解,其中包括:逻辑命令的使用、与或非门的使用、循环命令的使用、子程序的调用以及如何编译成工具。这里不多赘述关于易语言使用的知识,因为无论是书刊还是视频里都有相当详细的介绍。

    用过DNF脚本的人都知道,当游戏登录后的第一件事就是把游戏窗口移到屏幕左上角的位置,这里就用这个操作来进行一个代码的演示,以便大家更直观地了解制作脚本其实并不难。

    当上面的代码运行的时候就会产生这样的现象:当DNF界面出现在电脑屏幕上时就会被瞬间移动到屏幕左上角的位置,这个位置就是DNF的界面左上角和屏幕界面左上角重合,即坐标(0,0)。

    其实脚本的写作过程中没有什么太难的地方,其中最多且枯燥的就是它的编码过程,假设你需要一个角色进入到游戏中,然后等到60秒的安全时间,然后打开背包并扔掉自己背包里的白色装备。这些操作对于人手来讲可能就是一瞬间思考,几秒钟完成的事情,但是对于脚本来讲却不同,因为脚本需要根据代码的顺序去进行,它首先会按一下打开背包的快捷键,然后通过识别找字的方式确认背包已经打开了,然后把鼠标移动到指定的位置,这时候会出现一个装备的介绍,脚本需要根据装备名字的颜色来判断这是不是白色装备,如果是的话就会点一下装备,然后把鼠标移动到地面上,弹起鼠标后,寻找相关的确认按钮执行丢弃命令。

    说到这大家应该懂了,整个纯脚本写作的过程其实就是根据游戏的特征来进行,而需要用到的往往就是屈指可数的几个命令,例如:找字、找图、鼠标点击、键盘按键。这些也正是人们需要做的,现在只不过是通过脚本来实现自动化。

    再举个例子:如果游戏中途闪退了怎么办

    如果是一个真实的人在操作游戏的话,游戏闪退了无非就是重新上号,这一切对于脚本来说也是稀松平常的,因为每一个脚本中都会涉及到一个或者多个检测线程,线程对于一个脚本来说是十分重要的,拿游戏闪退这里来讲的话,线程中的命令会无限循环判断“任务管理器”中的“DNF.exe”进程是否存在,如果不存在就证明游戏消失了,这时候线程就会反馈一个结果给主程序,主程序根据相关的命令进行处理。

    说真的,上面这两个例子就已经囊括了一个脚本写作时候需要用到的一半以上的技能,至于其他的就仅仅是照葫芦画瓢的事情,还是那句话:入门脚本最重要的还是耐心,只要有足够的耐心和必备的工具,相信写出一个属于自己的脚本并不是难事。写脚本是一个漫长的过程,不能一蹴而就,这里所表达的也只是对于入门者的一块垫脚石,能否成功就看你的学习能力和是否有足够的耐心了,这两者中,后者更为主要。

    展开全文
  • 自动化脚本

    千次阅读 2021-02-27 08:49:55
    本文将介绍一个Java+TestNG+Maven+Selenium的web自动化测试脚本环境下selenium简单线性脚本的编写,并提供全部代码。文中将看到,使用selenium编写一个能操作浏览器的脚本是非常容易的。而简单线性脚本的编写是下...

    本文将介绍一个Java+TestNG+Maven+Selenium的web自动化测试脚本环境下selenium简单线性脚本的编写,并提供全部代码。

    文中将看到,使用selenium编写一个能操作浏览器的脚本是非常容易的。而简单线性脚本的编写是下一步编写页面对象脚本的基础。

    1.在开始之前,我想明确一下,自动化测试的基本原理。

    有的测试人员认为自动化测试很神秘,很神奇。恰恰相反, 自动化测试很简单。

    自动化测试,一般分三个步骤:

    1)取预期结果;

    2)取实际结果;

    3)断言:比较1)和2)来判断测试是否通过;

    从历史角度来看,自动化测试的出现早于专职测试人员的出现。也就是说在开始有我们这些专门做软件测试的测试人员之前,自动化测试已经存在了。

    原因就是他 简单。

    selenium自动化测试,在自动化测试里也是属于超级 简单的一类。但前提是必须理解上面说的自动化测试原理,以及其他一些自动化测试设计原则。否则,我们将会看到, 简单的项目也会失败 。有很多由初、中级开发人员或会一点点代码的测试人员编写的selenium自动化测试项目,因此失败。

    2.简单的selenium测试脚本编写,一般也是分三个步骤:

    1)定位一个元素

    2)操作一个元素

    3)断言

    好,这里用百度首页的搜索做一个例子:

    3b42e56952b7e42d58065e179239c059.png

    1 package simplewebtest.test;

    2

    3 import java.util.concurrent.TimeUnit;

    4

    5 import org.openqa.selenium.By;

    6 import org.openqa.selenium.WebDriver;

    7 import org.openqa.selenium.firefox.FirefoxDriver;

    8 import org.testng.annotations.Test;

    9

    10 public classTestBaiduHome {

    11

    12 @Test

    13 public void searchSomething(){

    14

    15 WebDriver driver=new FirefoxDriver();//打开Firefox; open firefox

    16 driver.get("http://www.baidu.com");//打开百度open the url

    17 driver.findElement(By.id("kw1")).sendKeys("GitHub");//输入搜索关键字“GitHub";input search keyword

    18 driver.findElement(By.id("su1")).click();//点击搜索按钮click the search button

    19 driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);//等页面加载,10秒内不加载成功即报超时。waiting for 10 seconds

    20 String aResult=driver.findElement(By.xpath(".//*[@id='4']/h3/a")).getText();//取第四条搜索结果的标题。 get the text of 4th search result

    21 assert aResult.contains("GitHub");//做断言 assertion

    22 driver.findElement(By.xpath(".//*[@id='4']/h3/a")).click();//打开第四个搜索结果。Open the 4th search result on baidu

    23 driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);//等页面加载,10秒内不加载成功即报超时。waiting for 10 seconds

    24

    25 //获取所有窗口的handle,然后逐个切换,直到切换到最新窗口 switch to the new window

    26 for(String winHandle : driver.getWindowHandles()){

    27 driver.switchTo().window(winHandle);

    28 }

    29

    30 String aTitle=driver.getTitle();//取新窗口的title

    31 System.out.println("current widnow title is:"+aTitle);//打出来看看

    32 assert aTitle.contains("GitHub");//断言

    33

    34 }

    35 }

    View Code

    本系列所有代码https://github.com/zhangting85/simpleWebtest,

    这个例子存放在src/test/java/simplewebtest/test/TestBaiduHome.java

    下面逐行解释:

    WebDriver driver=new FirefoxDriver();

    这里是声明了一个 WebDriver 类型的对象引用,我给他起名叫driver;

    然后让这个driver指向WebDriver的一个子类(FirefoxDriver)的对象;

    我们知道FirefoxDriver继承自WebDriver,IEDriver也继承自WebDriver;

    就像苹果继承自水果,橘子也继承自水果;

    这里用了Java的向上转型,使用子类的对象来初始化父类的引用。(注:实际上Webdriver是一个接口。)

    这将产生什么效果呢?

    我们在driver上调用方法的时候,都是先查找WebDriver里的方法定义,然后jvm去他的子类比如FirfoxDriver中找到其在子类中的实现,再执行的。比如FirefoxDriver的get方法和IEDriver的get方法,他们具体执行的代码内容明显是不一样的。但我们的脚本,只要改变driver引用的子类,而不用改变我后面的方法调用。

    也就是说,我们用firefox和用ie,除了第一句话新建对象时不一样,后面的方法调用都是一样的。

    java会自动根据我们上面这句话里创建的对象,去选择他应该执行的实际代码。

    这也就是JAVA里的多态,一句话记住多态:用子类对象初始化父类引用,方法调用时自动执行子类代码,成员变量调用时自动调用父类成员变量。

    以上,题外话略多,是希望测试人员不要自我放弃,写个程序不会有多难,Java的基础必须要掌握。

    driver.get("http://www.baidu.com");

    调用Webdriver的get方法,跳转到制定的URL;

    凡是这里跳转不过去的,十有八九是因为webdriver版本太低,浏览器版本太高,请改上一节讲的pom.xml里配置的webdriver版本号至最新版。

    driver.findElement(By.id("kw1")).sendKeys("GitHub");//输入搜索关键字“GitHub";input search keyword

    driver.findElement(By.id("su1")).click();//点击搜索按钮click the search button

    这里调用Webdriver的findElement方法来查找页面元素。然后在找到的页面元素WebElement对象上调用sendKeys方法来打字和click方法来点击。

    如果你问我这个id的值是怎么来的,那么你可以去看一下FireBug这个插件,他会替你找到每一个元素的一切属性。

    如果你要定位的元素没有id,你还可以用className,Xpath,css,等等来定位。

    另一个插件FirePath可以帮你产生任意元素的xpath表达式。

    findElement方法需要一个By类型的参数。

    但是代码里我们使用了By.id("kw1") 这里的id是一个静态方法,他的声明是:

    public static By id(java.lang.String id)

    所以我们调用By.id的时候,他会返回一个By类型的对象给我们。

    至于下面findElement是怎样用这个对象来查找页面元素的,暂时不讲。简单来说,就是把我们传入的id传给对应的Driver,由driver去查找元素,再返回给我们。

    driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

    很常用的一个等待页面加载的语句。这个implicityWait是会对driver的下一个findElement调用起作用的。

    百度这个搜索结果页面很有意思,虽然我们感觉不出来,但搜索结果其实是异步显示上去的,所以不加等待他就会找不到元素。

    而后面点击搜索结果打开一个窗口的时候我们再次用了等待。

    另外,这个方法并不是对所有网页都有效,有时我们要用一些别的等待。还有尽量不要用Thread.sleep

    String aResult=driver.findElement(By.xpath(".//*[@id='4']/h3/a")).getText();//取第四条搜索结果的标题。 get the text of 4th search result

    assert aResult.contains("GitHub");//做断言 assertion

    这两句,首先去取实际结果,也就是根据某个xpath表达式找到的搜索结果元素上的Text

    然后,再判断他是否符合预期结果,即包含有“GitHub”这个字符串。

    assert是TestNG提供的,这里不要用if else去判断这个字符串。TestNG的assert结果会反映在测试报告里。

    也不要自己去抛出一个代表断言失败的异常,TestNG会替你完成这件事。

    以上两个错误是中低级开发人员编写测试框架时常犯的。

    我们既然用了TestNG,请至少尝试去用TestNG的功能。

    for(String winHandle : driver.getWindowHandles()){

    driver.switchTo().window(winHandle);

    }

    这段代码表示切换窗口。有意思的是,他是在窗口打开后,先取出所有窗口的hanles,然后一个一个切过去。

    因为新窗口必定在最后,所以不论你有几个窗口,这段代码总能找到最新一个窗口。如果你还需要操作老窗口,

    可以事先把老窗口的Handle保存起来,以后再切回来。

    以上一个简单的线性测试脚本编写完毕。基本的元素定位、元素操作、窗口切换、断言都有了,你可以查看官网的文档,了解各个api的更多方法。

    熟练地编写线性脚本大概需要个把月,有编程基础的更快,这一篇介绍的内容基本没有难度。下一篇介绍进阶的线性脚本,包括frame,actions,关闭浏览器,运行javascript,WebDriverWait。

    觉得不错的可关注微信公众号在手机上观看,让你用手机边玩边看

    展开全文
  • 引言这段时间迷上了玩点点点的小游戏,但是某些重复的环节着实无聊,就想着能不能用PYTHON一个游戏脚本,不过为了熟悉需要做脚本的各个模块,于是打算在4399上找一个比较像的游戏脚本练练手,后来发现打地鼠这...

    引言

    这段时间迷上了玩点点点的小游戏,但是某些重复的环节着实无聊,就想着能不能用PYTHON做一个游戏脚本,不过为了熟悉需要做脚本的各个模块,于是打算在4399上找一个比较像的游戏做个脚本练练手,后来发现打地鼠这个游戏不就很适合练手吗~

    这篇文章就以4399的一款叫做(玩命打地鼠)的游戏作为案例,实现自动打地鼠的功能~

    系统结构

    使用的核心模块有:pymouse(模拟鼠标点击),PIL(进行识别,哪里有地鼠打哪里)

    其他一些模块有:selenium(web测试模块),time(用于在游戏时间之后终止程序)

    流程图:

    流程图也很直白~

    效果如下:

    代码实现

    一、打开游戏

    实现这一步的时候在网上找了很多资料,有些用win32gui进行窗口操作的,有些用webbrowser模块的,尝试了了之后感觉非常麻烦,而且效果并不理想,最后发现PYTHON里面selenium的webdriver模块很适合这一步,比较麻烦的是需要去下载浏览器驱动。

    具体的安装流程可以参考:https://www.jianshu.com/p/1b63c5f3c98e

    需要注意的是你要了解你用的浏览器的版本,谷歌浏览器可以通过右上角三个点——帮助——关于google chrome查看版本,其他浏览器大致相同

    完成安装之后,代码就很简单了,只需要调用webdriver.Chorme()方法调用谷歌浏览器的驱动,然后用get()方法打开网页就可以了,具体代码如下:

    from selenium import webdriver

    url = "http://www.4399.com/flash/178030_3.htm"

    class GameScript:

    def __init__(self):

    chrome = webdriver.Chrome('D:/googledriver/chromedriver.exe')

    chrome.maximize_window()

    chrome.get(url)

    chrome.implicitly_wait(30)

    webdriver.Chorme()方法传入的参数为你下载的驱动的地址

    maximize_window()方法使打开的浏览器最大化

    get()方法传入url打开网页

    implicitly_wait()方法用于等待页面加载完成,最大等待时间为30秒

    二、开始游戏

    进行这一步的时候遇到了点问题,就是谷歌浏览器开始慢慢禁用FLASH,而用驱动打开的网页是默认禁用的,所以需要我们启用FLASH。

    这一步需要用pymouse模块来模拟鼠标进行点击。

    奇怪的是我用微信截图获得的坐标跟我用click()方法点击的位置不一样, 经过一番查找后发现是显示器缩放倍数的问题,于是写了一个函数解决这个问题,代码如下:

    from pymouse import PyMouse

    m = PyMouse()

    def touch(x,y,mouse=1):

    n = 1/1.5

    a = x*n

    b = y*n

    m.click(int(a),int(b),mouse)

    这样就解决了缩放的问题,其中n为你缩放倍数的倒数,我电脑缩放倍数为1.5,所以n为1/1.5。

    click()方法传入的参数为(横坐标,纵坐标,左键or右键)mouse=1代表左键,mouse=2代表右键

    接下来要做的就很简单了,点击对应的位置并开启游戏游戏就行了,代码如下:

    def FlashOpen(self):

    touch(1660,80)

    touch(1400,217)

    #等网页加载出来,点击允许

    sleep(3)

    touch(1482,469)

    #关闭页面

    sleep(1)

    touch(707,25)

    #授权FLASH

    sleep(1)

    touch(723,700)

    sleep(1)

    touch(476,290)

    #关闭游戏声音

    touch(168,26,2)

    sleep(1)

    touch(282,258)

    def start(self):

    #点击开始游戏按钮

    touch(750,800)

    touch(1075,322)

    sleep(1)

    三、自动打地鼠

    实现自动打地鼠的思路就是检测游戏内的9个洞有没有地鼠,有就打。我的方法是先截取一张有地鼠的图保存为样板,然后不断的获得9个坑的图片并与样板进行相似度对比,大于一定的数值就判断为有地鼠,鼠标就就行点击。

    3.1获取九个坑的图

    首先通过微信截图获得九个坑大概的矩形范围,取左上和右下的点的坐标保存起来

    #9个坑所在的矩形图的坐标

    coordinate = (395,530,1065,930)

    然后通过PIL的ImageGrab类中的grab()方法获取一张九个坑一起的大图

    image = ImageGrab.grab(coordinate)

    接下来要做的就是把这张大图分切为九张小图,每张图中都包含一个坑,Image类中crop()方法可以在一张大图中截取一张小图,我们只需要把这个过程重复9次,便可以得到九张小图了,代码如下:

    from PIL import Image,ImageGrab

    #9个坑所在的矩形图的坐标

    coordinate = (395,530,1065,930)

    def CutImage(self):

    image = ImageGrab.grab(coordinate)

    width,height = image.size

    #用于存放九张小图的左上和右下坐标

    box_list = []

    #小图的宽

    cut_width = int(width/3)

    #小图的高

    cut_height = int(height/3)

    #分切9图,先获得9组crop函数需要的坐标,再用crop函数截出来

    for i in range(0,3):

    for j in range(0,3):

    box = (j*cut_width, i*cut_height, (j+1)*cut_width, (i+1)*cut_height)

    box_list.append(box)

    image_list = [image.crop(box) for box in box_list]

    #返回的列表里面为图片

    return image_list

    这样我们就可以得到一个包含九张图片的列表了,然后样板只要事先在游戏截一次图就可以得到了

    3.2比较图片,获得相似度

    比较图片获得相似度有很多方法,这里我使用了最入门的方法——直方图比较,但是对于我们这个简单的程序而言已经够了

    为了提高准确率,我们首先需要把九张小图和样板的格式统一,具体代码如下:

    def Get_Same_Image(image):

    size = (256,256)

    return image.resize(size).convert('RGB')

    resize()方法用于将图片转化为指定的宽和高

    convert()方法用于将图片转化为指定格式,返回一个转变好的图片

    接下来要进行图片的直方图比较,基本公式为:

    Sim(G,S)=1N∑i=1N(1−∣gi−si∣Max(gi,si))Sim(G,S) =\frac{1}{N}\sum_{i=1}^N(1-\frac{\left\vert g_i -s_i \right\vert}{Max(g_i,s_i)})Sim(G,S)=N1​i=1∑N​(1−Max(gi​,si​)∣gi​−si​∣​)

    具体代码如下:

    #比较两张图片的直方图,以获得相似度

    def Difference(list1,list2):

    sum1 = 0

    for i in range(len(list1)):

    if(list1[i] == list2[i]):

    sum1 += 1

    else:

    #依照公式可获得

    sum1 += 1-(abs(list1[i] - list2[i]) / max(list1[i],list2[i]) )

    return sum1 / len(list1)

    然后只需要把两张图片统一格式,获取直方图,把直方图进行对比即可,代码如下:

    def Get_Similarity(image1,image2):

    #统一格式

    img1 = Get_Same_Image(image1)

    img2 = Get_Same_Image(image2)

    #获得直方图

    list1 = img1.histogram()

    list2 = img2.histogram()

    return Difference(list1, list2)

    其中image类中的histogram()方法用于获得图片的直方图

    3.3自动打地鼠

    要实现自动打地鼠,还有最后一项准备工作没做完,那就是你要打地鼠的位置,也就是九个坑的位置啦,这个位置我是通过微信截图功能获得,然后存放为一个列表的,方法比较简单粗暴~

    #9个打地鼠的坐标

    loc1 = (488,562)

    loc2 = (721,581)

    loc3 = (969,578)

    loc4 = (466,732)

    loc5 = (725,706)

    loc6 = (1000,707)

    loc7 = (469,878)

    loc8 = (716,869)

    loc9 = (975,877)

    Loc_list = [(488,562)]

    Loc_list.append(loc2)

    Loc_list.append(loc3)

    Loc_list.append(loc4)

    Loc_list.append(loc5)

    Loc_list.append(loc6)

    Loc_list.append(loc7)

    Loc_list.append(loc8)

    Loc_list.append(loc9)

    工作进行到这里,最后实现自动点击就很简单啦,话不多说,上代码~

    def AutoPlay(image_list):

    Timage = Image.open("C:/Users/Fatzj/Desktop/game script/yangping.png")

    for n in range(len(image_list)):

    #相似度大于0.45就拍一下

    if(Get_Similarity(image_list[n], Timage) >= 0.45):

    #从Loc_list获得要点击的坐标

    x = Loc_list[n][0]

    y = Loc_list[n][1]

    touch(x,y)

    #移开锤子,避免干扰对比

    touch(1075,322)

    总结

    这次花了点时间做完了这个基本的脚本还是让人感受到了PYTHON的魅力啊,总的来说遇到的问题都不是很困难,不过对于我来说,我自己的很不满意的就是我的写法很不简洁,又懒得想办法精简,希望大家不要在意哈~

    本文地址:https://blog.csdn.net/weixin_44425213/article/details/107140601

    展开全文
  • 例如启动是自动调用触摸屏校准程序:【1】创建脚本system\core\rootdir\ts-Calibrate.sh,填入需要运行的内容:#!/system/bin/sh/android-I2C-Calibrate-V1.0【2】修改system\core\rootdir\Android.mk,复制ts-...
  • 自己编写油猴脚本时踩得坑

    万次阅读 2021-03-11 15:14:13
    最近上手写了自己的第一个油猴脚本(不知道这样说准不准确),严格意义上来将是,借助于油猴这个脚本平台,写了自己的第一个脚本,并成功运行测试       当然,这篇文章不讲我究竟了啥,而是说在...
  • 之前我们的教程讲过如何使用命令行运行Airtest脚本,实际上.bat文件里面的命令也是靠cmd.exe解析执行的,所以我们可以在.bat文件中编写运行airtest脚本的命令,以此来执行airtest脚本。1.用bat文件执行单个Airtest...
  • oracle脚本编写

    2021-05-06 01:45:48
    这些脚本若不会使用,不知道是否添加参数,就先打开脚本,查看页头的说明,就明白是否需要执行时写入参数。 1. @?/rdbms/admin/catlog.sql 执行这个脚本后,创建数据库的统计视图,审计视图......同时文章还介绍了 8 个...
  • 如何将自己自定义的脚本文件设置为开机自启动 举个例子,一般来说,电脑端只能运行一个微信,如果我们需要同时登陆多个微信账号,我们需要自己写一段小脚本用来执行微信双开或者多开,如果我们想让这个脚本能够开机...
  • 下一步,利用 Firebase 打包脚本,依次点击:Firebase - 打包多个脚本 - 选择目标脚本,等待本地生成一个 apk 文件。 使用 adb 命令将 apk 安装到手机上,接着通过instrument开启自动化操作。# 开启自动化任务 adb...
  • 1、python脚本的格式是什么 举个例子来说明:hello.py中hello是脚本名,py脚本格式 2、脚本的结构 #coding:utf-8 //脚本头 一个空行分割 import os //引用部分 两个空行的分割 print(‘欢迎大家’)//业务...
  • 现如今想从事和游戏相关的工作,例如游戏开发或游戏脚本策划的伙伴越来越多。 很多想从事脚本开发的伙伴有如下3点质疑: 1、学会Python就可以从事游戏脚本的工作吗? 2、脚本开发只需要学习Python这一门语言吗? 3、...
  • 为了提高测试脚本的可维护性和可复用性,必须在执行测试脚本之前对它们进行构建。那么你对测试脚本了解多少呢?以下是由学习啦小编整理关于什么是测试脚本的内容,希望大家喜欢!测试脚本的介绍Testing script(测试...
  • shell脚本

    千次阅读 2021-02-02 19:26:00
    一、shell简介 shell是Linux系统的用户界面,它提供用户与内核的一种交互方式。它接收用户输入的命令,并把它送入内核去执行,是一个命令解释器。 shell脚本就是将命令写入文本中,文本可以被执行。...用户自己的家
  • 按键精灵连击脚本(奇迹MU战士用)

    千次阅读 2020-12-20 11:54:31
    按键精灵连击脚本1、123键的按法所谓按法实际上就是各种代码方式常见的有以下几种(time为延时,自己修改)KeyPress 49,1(按一次1)Delay timeKeyPress 50,1(按一次2)Delay timeKeyPress 51,1(按一次3)Delay ...
  • 对于有兴趣学习游戏脚本的同学有一定的帮助。 运行环境:Win10/Python3.5。 主要模块:win32gui(识别窗口、窗口置顶等操作)、PIL(屏幕截图)、numpy(创建矩阵)、operator(比较值)、pymouse(模拟鼠标点击)。...
  • 域用户登陆脚本

    千次阅读 2021-01-17 16:41:12
    -脚本应该放在何处?-还有没有其它要注意的问题?”回答:1、bat可以作为登陆脚本执行,确切说一切可以在windows平台执行的东西都可以作为登陆脚本来用。2、应该指定以\\server\……这样格式开头的路径。因为client...
  • 地址:https://hamibot.com/referrals/nwym 1、点开始使用,按步骤走就好 2、手机扫码安装、打开APP 3、控制台添加机器人,将配对码填到APP上就可以了。 4、脚本市场 安装脚本、运行脚本 THE END
  • python脚本编写与执行

    千次阅读 2020-12-29 03:42:24
    Python不使用括号来表示代码的类和函数定义块或流程控制...Python中命名规则Python脚本与其它语言的脚本的基本格式完全一样,本身都是纯文字文件,而在文件头要以#!指定直译程序(解释器)的位置:[root@importer1~]#...
  • 我们在平时的运维中会用到各种脚本来处理问题,但是每次使用的时候都需要去找一下自己脚本然后复制粘贴过来执行。你可能会想如果能跳过这些繁琐的步骤,直接在数据库中找到这些脚本一键执行就好了。 推荐一个小...
  • Unity3D 全局脚本

    2021-01-17 16:31:48
    游戏场景之间属于同等级的关系,为了让游戏场景之前交互我们需要有一个凌驾所有场景之上的脚本,我称之为“全局脚本”。如下图所示,所有场景都能与这个唯一的全局脚本进行交互。当场景切换时可将临时逻辑数据写入...
  • python开发的时候,随着日积月累,工程目录下会有很多py脚本,而在部署的时候只需要用到其中一小部分,无关的脚本很多,感觉很不清爽,人为一个一个去筛吧,又很麻烦,有没有工具可以自动把相关的py脚本抽出来呢...
  • Redis使用Lua脚本

    2021-03-16 04:10:56
    脚本的安全性 如生成随机数这一命令,如果在master上执行完后,再在slave上执行会不一样,这就破坏了主从节点的一致性 为了解决这个问题, Redis 对 Lua 环境所能执行的脚本做了一个严格的限制 —— 所有脚本都必须...
  • 脚本程序与Javascript1.脚本脚本语言教育脚本是使用特定描述性语言以特定格式编写的一系列指令。脚本通过使用应用程序或工具的规则和语法来表达指令,以控制应用程序中各种元素的反应,也可以由简单的控制结构(如...
  • 脚本录制方式

    千次阅读 2021-02-24 14:49:01
    Jmeter脚本录制方式 哲学三连问: 什么是Jmeter的“脚本”? 脚本是对网页的一系列请求。 为什么要录制脚本? 录制脚本便于使用Jmeter进行重复的测试。 怎么录制脚本? 简单一句话:不管什么工具,只要能录制成功,...
  • MySql的自动化安装Shell脚本

    千次阅读 2021-05-21 10:33:42
    对于运维来说,可能会每天都有安装MySql的请求,因此,编写一个能重复运行的脚本是节省自己时间,保护键盘手的一个重要能力,现在我们来赏析一段脚本吧。 1.shell脚本 #!/bin/bash set -e echo '此脚本目的为一键安装...
  • 展开全部1,首2113先打开自己的unity3d场景。2,接着在5261场景中创建一4102...5,打开Add_script在里面通过AddComponent给物体Capsule自己添加Force脚本,通过Destroy删除脚本组件,并分别设置space与delete按键。...
  • 编写service启动脚本

    2021-05-11 10:35:49
    ## service脚本的编写>[success] service管理的服务需要将其脚本文件放在/etc/init.d目录中~~~#!/bin/bash## Comments to support chkconfig# chkconfig: - 98 02# description: 服务名称 service script## ...
  • MATLAB脚本和功能

    2021-04-20 01:43:39
    示例可以将MATLAB代码保存在m文件中以进行重用。...脚本不接受输入,脚本也不返回输出。在功能上,脚本等效于直接在MATLAB命令窗口中键入命令并能够重播命令。脚本示例:length=10;width=3;area=length*width;...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,049,396
精华内容 419,758
关键字:

怎么自己做脚本