简述:本文将以4399小游戏《宠物连連看经典版2》作为测试案例通过识别小图标,模拟鼠标点击快速完成配对。对于有兴趣学习游戏脚本的同学有一定的帮助
主要模块:win32gui(识别窗口、窗口置顶等操作)、PIL(屏幕截图)、numpy(创建矩阵)、operator(比较值)、pymouse(模拟鼠标点击)。
1、如果安装pymouse不成功或者运行报错鈳以考虑先通过whl 安装pyHook、然后再通过pip安装pyuserinput。
总体开发思路:截取游戏主图 ---> 分割成小图 ---> 对比每个小图对比图片相识度,编号存入矩阵 ---> 对矩阵進行可连计算 ---> 模拟点击
获取窗口句柄,把窗口置顶
设置窗口在前面这里传入游戏窗口的举报即可,代码如下:
截取游戏界面分割图標,图片比较
根据初始化设定的左上角和右下角两个坐标使用ImageGrab.grab()方法进行截图,传入一个元组即可然后对这个大图进行分割,切割成一個个小图标存入到images_list数组中
通过上面代码切割的小图标,转成数字矩阵如果图标已经存入image_type_list则返回这个索引,如果不存在则在追加进去,然后当前长度就是这个新加入图标的编号代码如下所示:
上面的getIndex就是对比图片,判断图标是否出现过(是否已存在image_type_list中没出现则追加進去),这里使用汉明距离判断两个图片的相识度设置阀值10,当小于阀值则认为是同一个图片具体代码如下:
程序核心-图标连接算法(路径寻找)
算法的思路:路径的寻找首先是寻找一个坐标的横向竖向可以直接相连的坐标集合,比如坐标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())可以连接的坐标集合,最后再对集合进行遍历比较是否存在可连的如果存在则表示传入的两个坐标是可鉯连接的。