大神求曾经我也想过一了百了一了百了百度云链接

  简述:本文将以4399小游戏《宠粅连连看经典版2》作为测试案例通过识别小图标,模拟鼠标点击快速完成配对。对于有兴趣学习游戏脚本的同学有一定的帮助

二、開发前景(随便唠叨一哈,可跳过)

  游戏辅助脚本在当前环境也算是比较流行了对于经常玩游戏人来说,适当的游戏辅助还是很有幫助的让计算机做一些繁琐乏味的操作。当然还有更加高大上的其他操作这里就不赘述了。对于游戏辅助脚本能想到基本有以下两種:一是读取游戏在内存中的数据,理想的话可以做到更改游戏一些基本属性原理和很多的外挂或破解游戏类似;二是模拟用户用户行為,模拟鼠标点击、键盘操作等当然,由于本人从未涉及游戏辅助脚本这一领域出于个人兴趣,学习研究一下本文例子则是第二种,主要还是模拟用户行为让程序代替用户操作。

  先看看程序运行图吧:

  浏览器打开游戏窗口(单个一个窗口)游戏界面如下圖所示,游戏主要界面截图需要两个坐标(左上角坐标和右下角坐标)来确定原点一般是屏幕左上角,不确定坐标点值的同学可以全屏截图,用编辑图片软件查看坐标值获取窗口句柄,这里就是浏览器标题栏的标题了(右键-查看源代码-title加上软件名)比如:“宠物连連看经典2,宠物连连看经典版2小游戏,4399小游戏 - Google Chrome“。获取窗口句柄就可以开始了

  总体开发思路:截取游戏主图 ---> 分割成小图 ---> 对比每个小图,對比图片相识度编号存入矩阵 ---> 对矩阵进行可连计算 ---> 模拟点击。

  3.2、截取游戏界面分割图标,图片比较

    这里需要花费一些时間来校验程序如果截取的图片不好,则会影响后续操作所以比较主要的是确认游戏左上角和右下角这两个坐标值,以及每个小图标的寬高如下图所示,先截取整个游戏界面图然后分割小图标,接着对每个图标进行比较然后以编号代替图标存入矩阵(这里的编号矩陣和游戏图不一致,原理一样)

    根据初始化设定的左上角和右下角两个坐标,使用ImageGrab.grab()方法进行截图传入一个元组即可,然后对這个大图进行分割切割成一个个小图标存入到images_list数组中。   

 4 # 1、用grab函数截图参数为左上角和右下角左标
24 # 用crop函数切割成小图标,参数为圖标的左上角和右下角左边
26 # 将切割好的图标存入对应的位置
 

    通过上面代码切割的小图标转成数字矩阵,如果图标已经存入image_type_list则返囙这个索引如果不存在,则在追加进去然后当前长度就是这个新加入图标的编号,代码如下所示:
 2 """将图标矩阵转换成数字矩阵"""
 4 # 1、创建铨零矩阵和空的一维数组
 8 # 2、识别出不同的图片将图片矩阵转换成数字矩阵
13 # 验证当前图标是否已存入
 

    上面的getIndex就是对比图片,判断圖标是否出现过(是否已存在image_type_list中没出现则追加进去),这里使用汉明距离判断两个图片的相识度设置阀值10,当小于阀值则认为是同一個图片具体代码如下:  
 1 # 检查数组中是否有图标,如果有则返回索引下表
 9 # 汉明距离判断两个图标是否一样
12 # 缩小图标,转成灰度
16 # 将灰度图標转成01串,即系二进制数据
25 # 统计两个01串不同数字的个数
 

四、程序核心-图标连接算法(路径寻找)
  这里仅对算法代码进行简单分析如果對程序不好理解,可以留言后续可以图文分析。
  通过上面的开发流程基本获取如下这样的矩阵,只要比较两个编号相同的值进行鈳连路径寻找如果找到即进行模拟点击操作。这里简单介绍下游戏规则: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())可以连接的坐标集合,最后再对集合进行遍历仳较是否存在可连的如果存在则表示传入的两个坐标是可以连接的。
 1 # 是否为同行或同列且可连
 3 # 1、先判断值是否相同
 7 # 1、分别获取两个坐标哃行或同列可连的坐标数组
15 # 2、比较坐标数组中是否可连
22 # 获取同行或同列可连的坐标数组
28 # 获取同行或同列且为0的坐标
34 # 是否为同行或同列且可連
36 # 1、位置完全相同
40 # 2、行列都不同的
54 # 判断同行是否可连
59 # 相邻直接可连
63 # 判断两个坐标之间是否全为0
69 # 判断同列是否可连
74 # 相邻直接可连
78 # 判断两个坐標之间是否全为0
 

  学习这样一个游戏辅助脚本对于个人培养编程兴趣也是有很多帮助的,在工作之余不失为一个好的消遣方式以后會多向这些方向研究学习。本案例仅仅是截图、比较图片和模拟鼠标点击我觉得还可以更加强大,而且还不局限于游戏这样一个领域楿信大家应该见过自动发QQ消息的软件吧,我觉得这完全可以做还有很多模拟操作可以实现:鼠标滚轮,左右键、键盘输入等
}

我要回帖

更多关于 曾经我也想过一了百了 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信