连连看(四)

 

Python3 实现QQ游戏连连看游戏辅助

目录

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]
                        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!")

【完】

【下一篇:连连看(五)—— 后记 + 成果展示

发布了29 篇原创文章 · 获赞 2 · 访问量 1394

猜你喜欢

转载自blog.csdn.net/Lucky_Z1111/article/details/104610919