【python】python制作 连连看 游戏脚本(二)

news/2024/11/30 11:29:10/

【python】python制作 连连看 游戏脚本(一)_sunriver2000的博客-CSDN博客

【python】python制作 连连看 游戏脚本(二)_sunriver2000的博客-CSDN博客

【python】python制作 连连看 游戏脚本(三)_sunriver2000的博客-CSDN博客

【python】python制作 连连看 游戏脚本(四)_sunriver2000的博客-CSDN博客

代码下载:GitHub - sunriver2000/LinkGameAss

第四步、 image_type_list列表形成的同时,self.im2num_arr矩阵也识别完成。

矩阵如下图所示。

[[ 0  0  0  0  0  0  0  0  0  0  0  0  0  0][ 0  1  2  3  4  4  5  5  3  1  1  6  7  0][ 0  2  8  9  3  5  1  4  2  8 10  8  5  0][ 0 11  5  2  9 12 10  7  8  9 12  3 11  0][ 0 11  6  6  4  7 11  6 10 11 12  1  3  0][ 0 10  2 11 10  7 12 11  3  9 12 12 10  0][ 0 12  8  7  2  6  8  1 10  7  6  5  8  0][ 0  1  9  9  9  4  4  6  7 11  4  1 10  0][ 0  5  3  5  6  4 12  7  2  9  8  2  3  0][ 0  0  0  0  0  0  0  0  0  0  0  0  0  0]]

4、消除图标算法

4.1、直连的概念

直连的概念:同行或者同列,可以不相邻但中间没有其他非零元素。

    # 是否为同行或同列且可连def isDirectConnect(self, x1, y1, x2, y2):# 1、位置完全相同if x1 == x2 and y1 == y2:return False# 2、行列都不同的if x1 != x2 and y1 != y2:return False# 3、同行if x1 == x2 and self.isRowConnect(x1, y1, y2):return True# 4、同列if y1 == y2 and self.isColConnect(y1, x1, x2):return Truereturn False# 判断同行是否可连def isRowConnect(self, x, y1, y2):minY = min(y1, y2)maxY = max(y1, y2)# 相邻直接可连if maxY - minY == 1:return True# 判断两个坐标之间是否全为0for y0 in range(minY + 1, maxY):if self.im2num_arr[x][y0] != 0:return Falsereturn True# 判断同列是否可连def isColConnect(self, y, x1, x2):minX = min(x1, x2)maxX = max(x1, x2)# 相邻直接可连if maxX - minX == 1:return True# 判断两个坐标之间是否全为0for x0 in range(minX + 1, maxX):if self.im2num_arr[x0][y] != 0:return Falsereturn True

4.2、获取辐射通道集合

获取核心矩阵(12*8矩阵)元素能够直连的值为零元素的集合。

# 获取同行或同列可连的坐标数组def getDirectConnectList(self, x, y):plist = []for px in range(0, 10):for py in range(0, 14):# 获取同行或同列且为0的坐标if self.im2num_arr[px][py] == 0 and self.isDirectConnect(x, y, px, py):plist.append([px, py])return plist

4.3、判断能否相连

算法:两个集合内存在两个元素在同行或者同列。

    # 是否为同行或同列且相连def isReachable(self, x1, y1, x2, y2):#1、先判断值是否相同if self.im2num_arr[x1][y1] != self.im2num_arr[x2][y2]:return False# 2、分别获取两个坐标同行或同列可连的坐标数组list1 = self.getDirectConnectList(x1, y1)list2 = self.getDirectConnectList(x2, y2)# 3、比较坐标数组中是否可连for x1, y1 in list1:for x2, y2 in list2:if self.isDirectConnect(x1, y1, x2, y2):return Truereturn False

5、控制鼠标消除

5.1、消除并置为零

    # 点击事件并设置数组为0def clickAndSetZero(self, x1, y1, x2, y2):# print("click", x1, y1, x2, y2)# (299, 251, 768, 564)# 原理:左上角图标中点 + 偏移量p1_x = int(self.screen_left_and_right_point[0] + (y1 - 1)*self.im_width + (self.im_width / 2))p1_y = int(self.screen_left_and_right_point[1] + (x1 - 1)*self.im_width + (self.im_width / 2))p2_x = int(self.screen_left_and_right_point[0] + (y2 - 1)*self.im_width + (self.im_width / 2))p2_y = int(self.screen_left_and_right_point[1] + (x2 - 1)*self.im_width + (self.im_width / 2))time.sleep(0.2)self.mouse.click(p1_x, p1_y)time.sleep(0.2)self.mouse.click(p2_x, p2_y)# 设置矩阵值为0self.im2num_arr[x1][y1] = 0self.im2num_arr[x2][y2] = 0print("消除:(%d, %d) (%d, %d)" % (x1, y1, x2, y2))# exit()

5.2、GameAssist类主要控制函数

先生成self.im2num_arr矩阵,然后使用穷举消除图标。

    # 程序入口、控制中心def start(self):# 1、先截取游戏区域大图,然后分切每个小图image_list = self.screenshot()# 2、识别小图标,收集编号self.image2num(image_list)print(self.im2num_arr)# 3、遍历查找可以相连的坐标while not self.isAllZero(self.im2num_arr):for x1 in range(1, 9):for y1 in range(1, 13):if self.im2num_arr[x1][y1] == 0:continuefor x2 in range(1, 9):for y2 in range(1, 13):# 跳过为0 或者同一个if self.im2num_arr[x2][y2] == 0 or (x1 == x2 and y1 == y2):continueif self.isReachable(x1, y1, x2, y2):self.clickAndSetZero(x1, y1, x2, y2)

6、主函数

if __name__ == "__main__":wdname = u'宠物连连看经典版2小游戏,在线玩,4399小游戏 - 360极速浏览器 13.5'demo = GameAssist(wdname)demo.start()

7、总结

存在的问题:

1、如果一次未消除完,需要手动重新执行程序。

2、图像识别算法还需要优化。

3、图标矩阵定位需要人工校准。


http://www.ppmy.cn/news/622060.html

相关文章

【python】python制作 连连看 游戏脚本(一)

【python】python制作 连连看 游戏脚本(一)_sunriver2000的博客-CSDN博客 【python】python制作 连连看 游戏脚本(二)_sunriver2000的博客-CSDN博客 【python】python制作 连连看 游戏脚本(三)_sunriver2…

Vuforia专题:设置AR摄像头自动对焦

Vuforia专题:设置AR摄像头自动对焦 一,前言 在之前使用的时候,如果没有设置自动对焦可以发现,摄像头画面极其模糊。并导致识别的结果不是很理想 加上自动对焦后的效果如下: 二、具体步骤 1、ARCamera添加脚本Cam…

100种思维模型之断裂点理论思维模型-85

如工程学上:电路系统中的保险丝,压力系统中的爆破片,都是断裂点理论的应用,即用小的损失去防止大的损失的一种保护机制。 而生活中的“忍痛割爱”、“弃車保帅”,则是断裂点理论思维模型的运用。 断裂点理论思维模型一…

金融基础知识(二):金融衍生品

金融衍生品是一类金融工具,其价值基于另一种资产或指标的变化。由于其衍生自其他资产或指标,因此称之为金融衍生品。其种类非常多,包括期货、期权、利率掉期、掉期、外汇掉期、外汇期权、股票掉期、信用衍生品等。 1.远期和期货合约 远期合…

gitlab集成kubernetes

gitlab集成kubernetes 1. 管理员通过服务模板添加Kubernetes集群,是生效所有项目 2. 群组中也可以添加Kubernetes集群,优先于管理员添加的全局集群 3. 链接现有集群 4. 配置集群信息 http://178.119.31.180/help/user/project/clusters/add_existing_cl…

windows输入法输入英文字母中间有空格

平时生活中,偶尔会遇到windows输入法输入英文字母中间有空格 解决方法:将输入法全角修改成半角即可 1.在电脑右下角输入法中英文上,鼠标右键 2.右键后会出现如下图所示弹框。将全角修改成半角 经过如上操作后,在输入英文&#x…

Windows10自带输入法中文模式下,总是输出英文标点符号怎么回事呢?

第一步,输入法右击; 第二步,点击设置; 第三步,点击按键; 第四步,在按键窗口,进行如下图所示设置,中/英文标点切换项目下,点击选择“ Ctrl . ”&#xff0…

Win11删除英文输入法的方法教程

不少小伙伴问升级了Win11如何删除英文输入法。小伙伴们都知道,ENG英文输入法是强制默认的,每次都要切换应用打字其实非常不方便,那么win11怎么删除英文键盘?下面系统之家小编给你带来详细的删除教程,快跟着小编一起来看…