当前位置:   article > 正文

【python】python制作 连连看 游戏脚本(二)_python连连看源代码

python连连看源代码

【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矩阵也识别完成。

矩阵如下图所示。

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

4、消除图标算法

4.1、直连的概念

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

  1. # 是否为同行或同列且可连
  2. def isDirectConnect(self, x1, y1, x2, y2):
  3. # 1、位置完全相同
  4. if x1 == x2 and y1 == y2:
  5. return False
  6. # 2、行列都不同的
  7. if x1 != x2 and y1 != y2:
  8. return False
  9. # 3、同行
  10. if x1 == x2 and self.isRowConnect(x1, y1, y2):
  11. return True
  12. # 4、同列
  13. if y1 == y2 and self.isColConnect(y1, x1, x2):
  14. return True
  15. return False
  16. # 判断同行是否可连
  17. def isRowConnect(self, x, y1, y2):
  18. minY = min(y1, y2)
  19. maxY = max(y1, y2)
  20. # 相邻直接可连
  21. if maxY - minY == 1:
  22. return True
  23. # 判断两个坐标之间是否全为0
  24. for y0 in range(minY + 1, maxY):
  25. if self.im2num_arr[x][y0] != 0:
  26. return False
  27. return True
  28. # 判断同列是否可连
  29. def isColConnect(self, y, x1, x2):
  30. minX = min(x1, x2)
  31. maxX = max(x1, x2)
  32. # 相邻直接可连
  33. if maxX - minX == 1:
  34. return True
  35. # 判断两个坐标之间是否全为0
  36. for x0 in range(minX + 1, maxX):
  37. if self.im2num_arr[x0][y] != 0:
  38. return False
  39. return True

4.2、获取辐射通道集合

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

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

4.3、判断能否相连

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

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

5、控制鼠标消除

5.1、消除并置为零

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

5.2、GameAssist类主要控制函数

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

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

6、主函数

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

7、总结

存在的问题:

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

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

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

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号