Python3 实现QQ游戏连连看游戏辅助
- 连连看(零)—— 前记
- 连连看(一)—— 你看,这是截图啊
- 连连看(二)—— 哦吼,PIL + CV2 + Numpy 假图像识别构建矩阵
- 连连看(三)—— 拐了拐了啊,卖拐啦(连线规则)
- 连连看(四)—— 你看我这鼠标比用户还真(Pymouse 的替身)
- 连连看(五)—— 后记 + 成果展示
目录
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]
return
except 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 * 35
left = 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!")
【完】
【下一篇:连连看(五)—— 后记 + 成果展示】