Python3 实现QQ游戏连连看游戏辅助
- 连连看(零)—— 前记
- 连连看(一)—— 你看,这是截图啊
- 连连看(二)—— 哦吼,PIL + CV2 + Numpy 假图像识别构建矩阵
- 连连看(三)—— 拐了拐了啊,卖拐啦(连线规则)
- 连连看(四)—— 你看我这鼠标比用户还真(Pymouse 的替身)
- 连连看(五)—— 后记 + 成果展示
目录
Python3 实现QQ游戏连连看游戏辅助
1、消除
2、自动点击
1、消除
这两个函数应该非常简单易懂,就是根据矩阵中的数字来寻找与之相同的数字的位置并存储下来。(game数据结构请看第一篇文章)
简单介绍一下 np.where(matrix, item),它的返回值也是 np.array,res[0] 中是元素的 row,res[1] 中是元素的 col。
# 寻找一张相同图片位置def where_is_bros(self, num: int):res = np.where(self.game_map == num)for i in range(0, len(res[0])):self.bros.append((res[0][i], res[1][i]))return self.bros# 寻找所有相同图片def family(self):for i in range(1, self.total):self.fam[i] = self.where_is_bros(i)self.bros = []# for item in self.fam.keys():# print(item, self.fam[item])
接下来就是拿着这些点进行逐个尝试连接,可以连接的话记录在 self.step 并且将对应两个位置置为 -1。
注意:这里写的时候发现了一个bug,需要注意的是删除的顺序,画一个图给大家展示一下。
# 自动连接
def linking(self):for bro in self.fam.values():for i in range(0, len(bro)):for j in range(i + 1, len(bro)):try:if self.erasable(bro[i][0], bro[i][1], bro[j][0], bro[j][1]):self.steps.append((bro[i][0], bro[i][1], bro[j][0], bro[j][1]))self.boom(bro[i][0], bro[i][1], bro[j][0], bro[j][1])# 注意这里的删除顺序十分重要# 先删除了小坐标 i 的话 大坐标 j 立即发生改变 不指向原来的bro[j]del bro[j]del bro[i]returnexcept IndexError as err:# print("Ignore bro error.")continue
2、自动点击
由于 Python3 无法使用Pymouse,所以使用win32api,佐以 win32con 实现,用法比较固定,注释也比较详细,不再赘述。
# 自动点击
def auto_click(self):print("[step4]:Auto clicking...")l, t, r, b = find_window()# row: 19 * 31 col: 11 * 35left = l + 14 # 14px的左边界,连连看(一)中有图解top = t + 180 # 180px的上边界,连连看(一)中有图解for item in self.steps:# 第一次的 sleep 符合常规就好 当然设置为零有惊喜,详见连连看(结语)time.sleep(random.randint(2, 13) / 10)# 这里加的15是31//2,17是15//2# 目的是点击小方块的中间位置win32api.SetCursorPos((left + item[1] * 31 + 15, top + item[0] * 35 + 17))win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)# 第二次点击的 sleep 可以少一点,符合人的操作time.sleep(random.randint(0, 5) / 10)win32api.SetCursorPos((left + item[3] * 31 + 15, top + item[2] * 35 + 17))win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)print("(%s, %s)(%s, %s)" % (item[0], item[1], item[2], item[3]))print("Finished!")
【完】
【下一篇:连连看(五)—— 后记 + 成果展示】