当前位置: 首页 > 后端技术 > Python

使用Python制作一个连连看游戏辅助脚本,分享完整的编程思路

时间:2023-03-26 13:14:41 Python

1.简介:本文将以4399小游戏《 宠物连连看经典版2 》为测试用例,通过识别小图标和模拟快速完成配对鼠标点击。对于有兴趣学习游戏脚本的同学很有帮助。运行环境:Win10/Python3.5。主要模块:win32gui(识别窗口、置顶窗口等)、PIL(截屏)、numpy(创建矩阵)、operator(比较值)、pymouse(模拟鼠标点击)。注意事项:1、如果pymouse安装不成功或者运行报错,可以考虑先通过whl安装pyHook,再通过pip安装pyuserinput。2.如果报错[ImportError:Nomodulenamed'windows'],可以修改__init__.pywindows=>pymouse.windows对应的行为。2、发展前景(闲聊,可以略过)游戏辅助脚本在当前环境下比较流行。对于经常玩游戏的人来说,适当的游戏辅助还是很有帮助的,让电脑做一些繁琐的工作繁琐的操作。当然还有其他更高级的操作,这里不再赘述。至于游戏辅助脚本,基本上可以想到的有两种:一种是读取内存中游戏的数据,理想情况下可以改变游戏的一些基本属性。原理和很多外挂或者破解的游戏类似;另一个是模拟用户userBehaviors,模拟鼠标点击,键盘操作等。当然,由于本人没有涉足过游戏辅助脚本领域,出于个人兴趣,我会学习研究。本文的例子是第二种,主要是模拟用户行为,让程序代替用户操作。3、开发过程浏览器打开游戏窗口(单窗口),游戏界面如下图所示。游戏主界面截图需要两个坐标(左上角坐标和右下角坐标)来确定。原点一般是屏幕的左上角。确定坐标点值的同学可以全屏截图,使用图片编辑软件查看坐标值。获取窗口句柄,这里是浏览器标题栏的标题(右键-查看源代码-标题,添加软件名称)例如:《宠物连连看经典2,宠物连连看经典2小游戏,4399小游戏www.4399.com-谷歌浏览器”。获取窗口句柄,您就可以开始了。总体开发思路:截取游戏主图--->分成小图--->比较每张小图,比较图片的熟悉程度,将数字存入矩阵--->执行在矩阵上连续计算-??-->模拟点击。3.1获取窗口句柄,将窗口置顶。Python可以使用win32gui模块调用WindowsAPI实现窗口操作。使用FindWindow()方法获取窗口句柄(handle)。需要传入两个参数,第一个是父窗口句柄(这里填0即可),第二个参数是窗口的名称(labeltitle-GoogleChrome)。获取句柄后,通过SetForegroundWindows()将窗口设置到最前面。这里可以传入游戏窗口的报告。代码如下:3.2截取游戏界面,拆分图标,对比图片。验证程序需要一些时间。如果截取的图片不好的话,会影响后续的操作,所以主要是确认一下游戏左上角和右下角的两个坐标值,以及每个小图标的宽度和高度。如下图,先截取整个游戏界面图,然后划分小图标,然后比较每个图标,然后将数字存入矩阵而不是图标(这里的数字矩阵与游戏图不一致,原理是一样的)。根据初始化设置的左上角和右下角两个坐标,使用ImageGrab.grab()方法进行截图,传入一个元组,然后将大图分割成小图标存储在images_list数组中。将上面代码切割出来的小图标转换成数字矩阵。如果图标已存储在image_type_list中,则返回索引。如果它不存在,它将被添加。那么当前长度就是新增图标的个数。代码如下:上面的getIndex是比较图片,判断图标是否出现过(image_type_list中是否存在,没有出现则添加)。这里使用汉明距离来判断两张图片相识程度,阈值设置为10,当小于阈值时,则认为是同一张图片,具体代码如下:4.程序核心-图标连接算法(寻路)这里只对算法代码进行简单分析,对程序有不懂的可以留言,后续可以图文分析。通过以上开发过程,基本得到如下矩阵。只需比较两个相同编号的值,搜索可连接的路径,如果找到,则进行模拟点击操作。这里简单介绍一下游戏规则: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分别对两个点进行()),最后遍历集合比较是否有可连通的,如果有则说明传入的两个坐标是可以连通的。5.开发总结学习这样的游戏辅助脚本,对于个人培养编程兴趣也是很有帮助的。这是下班后消遣的好方法。以后我会在这些方向上多学习多学习。本案例只是截图、对比图片和模拟鼠标点击。我认为它可以更强大,而且不仅仅局限于游戏领域。相信大家应该都见过自动发送QQ消息的软件吧。我认为这是可以做到的。可以实现很多模拟操作:鼠标滚轮,左右键,键盘输入等。6.附件-源码源码和更多好玩有趣的游戏源码分享私信我