共计 2281 个字符,预计需要花费 6 分钟才能阅读完成。
一、阐明
简述:本文将以 4399 小游戏《宠物连连看经典版 2》作为测试案例,通过辨认小图标,模仿鼠标点击,疾速实现配对。对于有趣味学习游戏脚本的同学有肯定的帮忙。
运行环境:Win10/Python3.5。
次要模块:win32gui(辨认窗口、窗口置顶等操作)、PIL(屏幕截图)、numpy(创立矩阵)、operator(比拟值)、pymouse(模仿鼠标点击)。
留神点:
1、如果装置 pymouse 不胜利或者运行报错,能够思考先通过 whl 装置 pyHook、而后再通过 pip 装置 pyuserinput。
2、如果报错 [ImportError: No module named ‘windows’],能够批改__init__.py 相应的行 为 windows => pymouse.windows。
二、开发前景(轻易唠叨一哈,可跳过)
游戏辅助脚本在以后环境也算是比拟风行了,对于常常玩游戏人来说,适当的游戏辅助还是很有帮忙的,让计算机做一些繁琐乏味的操作。当然还有更加高大上的其余操作,这里就不赘述了。对于游戏辅助脚本,能想到根本有以下两种:一是读取游戏在内存中的数据,现实的话能够做到更改游戏一些根本属性,原理和很多的外挂或破解游戏相似;二是模仿用户用户行为,模仿鼠标点击、键盘操作等。当然,因为自己从未波及游戏辅助脚本这一畛域,出于个人兴趣,学习钻研一下,本文例子则是第二种,次要还是模仿用户行为,让程序代替用户操作。
三、开发流程
浏览器关上游戏窗口(单个一个窗口),游戏界面如下图所示,游戏次要界面截图须要两个坐标(左上角坐标和右下角坐标)来确定,原点个别是屏幕左上角,不确定坐标点值的同学,能够全屏截图,用编辑图片软件查看坐标值。获取窗口句柄,这里就是浏览器标题栏的题目了(右键 - 查看源代码 -title,加上软件名)比方:“宠物连连看经典 2, 宠物连连看经典版 2 小游戏,4399 小游戏 www.4399.com – Google Chrome“。获取窗口句柄就能够开始了。
总体开发思路:截取游戏主图 —> 宰割成小图 —> 比照每个小图,比照图片相识度,编号存入矩阵 —> 对矩阵进行可连计算 —> 模仿点击。
3.1 获取窗口句柄,把窗口置顶
python 能够应用 win32gui 模块调用 Windows API 实现对窗口的操作,应用 FindWindow() 办法能够获取窗口的句柄(handle),须要传入两个参数,第一个为父窗口句柄(这里填 0 即可),第二个参数是窗口的名称(标签 title – Google Chrome)。获取句柄之后而后通过 SetForegroundWindows() 设置窗口在后面,这里传入游戏窗口的举报即可,代码如下:
3. 2 截取游戏界面,宰割图标,图片比拟
这里须要破费一些工夫来校验程序,如果截取的图片不好,则会影响后续操作,所以比拟次要的是确认游戏左上角和右下角这两个坐标值,以及每个小图标的宽高。如下图所示,先截取整个游戏界面图,而后宰割小图标,接着对每个图标进行比拟,而后以编号代替图标存入矩阵(这里的编号矩阵和游戏图不统一,原理一样)。
依据初始化设定的左上角和右下角两个坐标,应用 ImageGrab.grab() 办法进行截图,传入一个元组即可,而后对这个大图进行宰割,切割成一个个小图标存入到 images_list 数组中。
通过下面代码切割的小图标,转成数字矩阵,如果图标曾经存入 image_type_list 则返回这个索引,如果不存在,则在追加进去,而后以后长度就是这个新退出图标的编号,代码如下所示:
下面的 getIndex 就是比照图片,判断图标是否呈现过(是否已存在 image_type_list 中,没呈现则追加进去),这里应用汉明间隔判断两个图片的相识度,设置阀值 10,当小于阀值则认为是同一个图片,具体代码如下:
四、程序外围 - 图标连贯算法(门路寻找)
这里仅对算法代码进行简略剖析,如果对程序不好了解,能够留言,后续能够图文剖析。
通过下面的开发流程,根本获取如下这样的矩阵,只有比拟两个编号雷同的值进行可连门路寻找,如果找到即进行模仿点击操作。这里简略介绍下游戏规则:8 行乘 12 列游戏图标区域,外围的 0 其实示意寻找门路的时候能够通过,例如坐标(1, 1)能够与(1,10)进行连贯、(7, 1)和(7,2)进行连贯。
算法的思路:门路的寻找首先是寻找一个坐标的横向竖向能够间接相连的坐标汇合,比方坐标 p1(1,1)这样的汇合有 [(0,1),(1,0)],另外一个坐标 p2(1,10)的可连汇合为 [(0,10)],而后再对 p1 和 p2 的可连坐标汇合进行比拟,如果汇合中坐标也有可连,则示意 p1 和 p2 可连,很显著,(0,1)和(0,10)为同一行且可连,这样就示意 p1 和 p2 两点存在可连门路了,代码如下所示:
简略剖析下代码实现过程:在 isReachable() 传入两个须要比拟的坐标值,而后别离获取两个点横竖向(isRowConnect()、isColConnect())能够连贯的坐标汇合,最初再对汇合进行遍历比拟是否存在可连的,如果存在则示意传入的两个坐标是能够连贯的。
五、开发总结
学习这样一个游戏辅助脚本,对于集体造就编程趣味也是有很多帮忙的,在工作之余不失为一个好的消遣形式,当前会多向这些方向钻研学习。本案例仅仅是截图、比拟图片和模仿鼠标点击,我感觉还能够更加弱小,而且还不局限于游戏这样一个畛域,置信大家应该见过主动发 QQ 音讯的软件吧,我感觉这齐全能够做。还有很多模仿操作能够实现:鼠标滚轮,左右键、键盘输入等。
六、附件 - 源码
源代码和更多好玩乏味的游戏源码分享私信我噢