1、前言

Python实现的qq连连看辅助, 仅用于学习, 请在练习模式下使用, 请不要拿去伤害玩家们...

很多人学习python,不知道从何学起。
很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手。
很多已经做案例的人,却不知道如何去学习更加高深的知识。
那么针对这三类人,我给大家提供一个好的学习平台,免费领取视频教程,电子书籍,以及课程的源代码!
QQ群:1097524789

2、基本环境配置

版本:Python3.6

系统:Windows

3、相关模块:


1import PIL.ImageGrab
2import pyautogui
3import win32api
4import win32gui
5import win32con
6import time
7import random


1import PIL.ImageGrabimport pyautoguiimport win32apiimport win32guiimport win32conimport timeimport random

4、使用方法

开始游戏后运行就行了, 再次提示, 请在练习模式中使用, 否则可能会被其他玩家举报。

效果图

5、代码实现


1import PIL.ImageGrab
2import pyautogui
3import win32api
4import win32gui
5import win32con
6import time
7import random
8
9def color_hash(color):
10    value = ""
11    for i in range(5):
12        value += "%d,%d,%d," % (color[0], color[1], color[2])
13    return hash(value)
14
15
16def image_hash(img):
17    value = ""
18    for i in range(5):
19        c = img.getpixel((i * 3, i * 3))
20        value += "%d,%d,%d," % (c[0], c[1], c[2])
21    return hash(value)
22
23
24def game_area_image_to_matrix():
25    pos_to_image = {}
26
27    for row in range(ROW_NUM):
28        pos_to_image[row] = {}
29        for col in range(COL_NUM):
30            grid_left = col * grid_width
31            grid_top = row * grid_height
32            grid_right = grid_left + grid_width
33            grid_bottom = grid_top + grid_height
34
35            grid_image = game_area_image.crop((grid_left, grid_top, grid_right, grid_bottom))
36
37            pos_to_image[row][col] = grid_image
38
39    pos_to_type_id = {}
40    image_map = {}
41
42    empty_hash = color_hash((48, 76, 112))
43
44    for row in range(ROW_NUM):
45        pos_to_type_id[row] = {}
46        for col in range(COL_NUM):
47            this_image = pos_to_image[row][col]
48            this_image_hash = image_hash(this_image)
49            if this_image_hash == empty_hash:
50                pos_to_type_id[row][col] = 0
51                continue
52            image_map.setdefault(this_image_hash, len(image_map) + 1)
53            pos_to_type_id[row][col] = image_map.get(this_image_hash)
54
55    return pos_to_type_id
56
57
58def solve_matrix_one_step():
59    for key in map:
60        arr = map[key]
61        arr_len = len(arr)
62        for index1 in range(arr_len - 1):
63            point1 = arr[index1]
64            x1 = point1[0]
65            y1 = point1[1]
66            for index2 in range(index1 + 1, arr_len):
67                point2 = arr[index2]
68                x2 = point2[0]
69                y2 = point2[1]
70                if verifying_connectivity(x1, y1, x2, y2):
71                    arr.remove(point1)
72                    arr.remove(point2)
73                    matrix[y1][x1] = 0
74                    matrix[y2][x2] = 0
75                    if arr_len == 2:
76                        map.pop(key)
77                    return y1, x1, y2, x2
78
79
80def verifying_connectivity(x1, y1, x2, y2):
81    max_y1 = y1
82    while max_y1 + 1 < ROW_NUM and matrix[max_y1 + 1][x1] == 0:
83        max_y1 += 1
84    min_y1 = y1
85    while min_y1 - 1 >= 0 and matrix[min_y1 - 1][x1] == 0:
86        min_y1 -= 1
87
88    max_y2 = y2
89    while max_y2 + 1 < ROW_NUM and matrix[max_y2 + 1][x2] == 0:
90        max_y2 += 1
91    min_y2 = y2
92    while min_y2 - 1 >= 0 and matrix[min_y2 - 1][x2] == 0:
93        min_y2 -= 1
94
95    rg_min_y = max(min_y1, min_y2)
96    rg_max_y = min(max_y1, max_y2)
97    if rg_max_y >= rg_min_y:
98        for index_y in range(rg_min_y, rg_max_y + 1):
99            min_x = min(x1, x2)
100            max_x = max(x1, x2)
101            flag = True
102            for index_x in range(min_x + 1, max_x):
103                if matrix[index_y][index_x] != 0:
104                    flag = False
105                    break
106            if flag:
107                return True
108
109    max_x1 = x1
110    while max_x1 + 1 < COL_NUM and matrix[y1][max_x1 + 1] == 0:
111        max_x1 += 1
112    min_x1 = x1
113    while min_x1 - 1 >= 0 and matrix[y1][min_x1 - 1] == 0:
114        min_x1 -= 1
115
116    max_x2 = x2
117    while max_x2 + 1 < COL_NUM and matrix[y2][max_x2 + 1] == 0:
118        max_x2 += 1
119    min_x2 = x2
120    while min_x2 - 1 >= 0 and matrix[y2][min_x2 - 1] == 0:
121        min_x2 -= 1
122
123    rg_min_x = max(min_x1, min_x2)
124    rg_max_x = min(max_x1, max_x2)
125    if rg_max_x >= rg_min_x:
126        for index_x in range(rg_min_x, rg_max_x + 1):
127            min_y = min(y1, y2)
128            max_y = max(y1, y2)
129            flag = True
130            for index_y in range(min_y + 1, max_y):
131                if matrix[index_y][index_x] != 0:
132                    flag = False
133                    break
134            if flag:
135                return True
136
137    return False
138
139
140def execute_one_step(one_step):
141    from_row, from_col, to_row, to_col = one_step
142
143    from_x = game_area_left + (from_col + 0.5) * grid_width
144    from_y = game_area_top + (from_row + 0.5) * grid_height
145
146    to_x = game_area_left + (to_col + 0.5) * grid_width
147    to_y = game_area_top + (to_row + 0.5) * grid_height
148
149    pyautogui.moveTo(from_x, from_y)
150    pyautogui.click()
151
152    pyautogui.moveTo(to_x, to_y)
153    pyautogui.click()
154
155
156if __name__ == '__main__':
157
158    COL_NUM = 19
159    ROW_NUM = 11
160
161    screen_width = win32api.GetSystemMetrics(0)
162    screen_height = win32api.GetSystemMetrics(1)
163
164    hwnd = win32gui.FindWindow(win32con.NULL, 'QQ游戏 - 连连看角色版')
165    if hwnd == 0:
166        exit(-1)
167
168    win32gui.ShowWindow(hwnd, win32con.SW_RESTORE)
169    win32gui.SetForegroundWindow(hwnd)
170    window_left, window_top, window_right, window_bottom = win32gui.GetWindowRect(hwnd)
171    if min(window_left, window_top) < 0 or window_right > screen_width or window_bottom > screen_height:
172        exit(-1)
173    window_width = window_right - window_left
174    window_height = window_bottom - window_top
175
176    game_area_left = window_left + 14.0 / 800.0 * window_width
177    game_area_top = window_top + 181.0 / 600.0 * window_height
178    game_area_right = window_left + 603 / 800.0 * window_width
179    game_area_bottom = window_top + 566 / 600.0 * window_height
180
181    game_area_width = game_area_right - game_area_left
182    game_area_height = game_area_bottom - game_area_top
183    grid_width = game_area_width / COL_NUM
184    grid_height = game_area_height / ROW_NUM
185
186    game_area_image = PIL.ImageGrab.grab((game_area_left, game_area_top, game_area_right, game_area_bottom))
187
188    matrix = game_area_image_to_matrix()
189
190    map = {}
191
192    for y in range(ROW_NUM):
193        for x in range(COL_NUM):
194            grid_id = matrix[y][x]
195            if grid_id == 0:
196                continue
197            map.setdefault(grid_id, [])
198            arr = map[grid_id]
199            arr.append([x, y])
200
201    pyautogui.PAUSE = 0
202
203    while True:
204        one_step = solve_matrix_one_step()
205        if not one_step:
206            exit(0)
207        execute_one_step(one_step)
208        time.sleep(random.randint(0,0)/1000)

主要思路就是利用pywin32获取连连看游戏句柄, 获取游戏界面的图片, 对方块进行切割, 对每个方块取几个点的颜色进行比对, 均相同则认为是同一个方块,

然后模拟鼠标取消就行了, 代码的最后一行是每次点击的间隔。

用Python玩连连看是什么效果?的更多相关文章

  1. 程序员带你十天快速入门Python,玩转电脑软件开发(四)

    本系列文章立志于从一个已经习得一门编程语言的基础之上,全面介绍Python的相关开发过程和相关经验总结.本篇文章主要是基于上一篇的程序员带你十天快速入门Python,玩转电脑软件开发(三)的基础之上, ...

  2. 程序员带你十天快速入门Python,玩转电脑软件开发(二)

    关注今日头条-做全栈攻城狮,学代码也要读书,爱全栈,更爱生活.提供程序员技术及生活指导干货. 如果你真想学习,请评论学过的每篇文章,记录学习的痕迹. 请把所有教程文章中所提及的代码,最少敲写三遍,达到 ...

  3. 程序员带你十天快速入门Python,玩转电脑软件开发(一)

    关注今日头条-做全栈攻城狮,学代码也要读书,爱全栈,更爱生活.提供程序员技术及生活指导干货. 如果你真想学习,请评论学过的每篇文章,记录学习的痕迹. 请把所有教程文章中所提及的代码,最少敲写三遍,达到 ...

  4. 用Python玩转微信(一)

    欢迎大家访问我的个人网站<刘江的博客和教程>:www.liujiangblog.com 主要分享Python 及Django教程以及相关的博客 交流QQ群:453131687 今天偶然看见 ...

  5. 基于Python玩转人工智能最火框架 TensorFlow应用实践✍✍✍

    基于Python玩转人工智能最火框架  TensorFlow应用实践 随着 TensorFlow 在研究及产品中的应用日益广泛,很多开发者及研究者都希望能深入学习这一深度学习框架.而在昨天机器之心发起 ...

  6. 使用Python玩转WMI

    最近在网上搜索Python和WMI相关资料时,发现大部分文章都千篇一律,并且基本上只说了很基础的使用,并未深入说明如何使用WMI.本文打算更进一步,让我们使用Python玩转WMI. 1 什么是WMI ...

  7. 程序员带你十天快速入门Python,玩转电脑软件开发(三)

    声明:本次教程主要适用于已经习得一门编程语言的程序员.想要学习第二门语言.有梦想,立志做全栈攻城狮的你 . 如果是小白,也可以学习本教程.不过可能有些困难.如有问题在文章下方进行讨论.或者添加QQ群5 ...

  8. 基于Python玩转人工智能最火框架 TensorFlow应用实践

    慕K网-299元-基于Python玩转人工智能最火框架 TensorFlow应用实践 需要联系我,QQ:1844912514

  9. Python玩转Arduino——简单介绍

    关于Python语言的介绍安装请参考廖雪峰的Python教程 Python是一门解释型语言,虽然不能够像c语言一样编译上传到Arduino--什么你说MicroPython,我们再说Arduino呢- ...

随机推荐

  1. typeError:The value of a feed cannot be a tf.Tensor object.Acceptable feed values include Python scalars,strings,lists.numpy ndarrays,or TensorHandles.For reference.the tensor object was Tensor...

    如上贴出了:错误信息和错误代码. 这个问题困扰了自己两天,报错大概是说输入的数据和接受的格式不一样,不能作为tensor. 后来问了大神,原因出在tf.reshape(),因为网络训练时用placeh ...

  2. 重学c#系列——c# 托管和非托管资源(三)

    前言 c# 托管和非托管比较重要,因为这涉及到资源的释放. 现在只要在计算机上运行的,无论玩出什么花来,整个什么概念,逃不过输入数据修改数据输出数据(计算机本质),这里面有个数据的输入,那么我们的内存 ...

  3. bzoj3436小K的农场

    bzoj3436小K的农场 题意: n个数,知道m条关系:a-b≥c.a-b≤c或a==b.问是否存在满足所有关系的情况.n≤10000,m≤10000. 题解: 差分约束.因为只要求是否满足,因此最 ...

  4. bzoj2561最小生成树

    bzoj2561最小生成树 题意: 给定一个连通无向图,假设现在加入一条边权为L的边(u,v),求需要删掉最少多少条边,才能够使得这条边既可能出现在最小生成树上,也可能出现在最大生成树上. 题解: 最 ...

  5. 肝了两天IntelliJ IDEA 2020,解锁11种新姿势, 真香!!!

    IDEA2020版本正式发布已经有3个月了,当时由于各方面原因(太懒)也没有去尝试新功能.于是这个周末特意去在另一个电脑上下载了最新版的IDEA,并尝试了一下.总的来说呢,体验上明显的提升. 作为一个 ...

  6. 少儿编程:python趣味编程第二课,如何在pygame中写文字

    python趣味编程第二课:本文仅针对8-16岁的青少年,所以流程是按如何去教好中小学生走的,并不适合成人找工作学习,因为进度也是按照青少年走的 大家好,我是C大叔,上一篇文章已经跟大家介绍了一款开发 ...

  7. 如何看待HTTP/3

    前言 HTTP/2 相比于 HTTP/1.1,可以说是大幅度提高了网页的性能,只需要升级到该协议就可以减少很多之前需要做的性能优化工作,当然兼容问题以及如何优雅降级应该是国内还不普遍使用的原因之一. ...

  8. IntelliJ IDEA:文件的路径本该是”\“,却变成了”¥“

    修改字体导致的, 有些字体中是用¥替换掉\的,所以,修改到合适的字体就好了

  9. springboot(12)Redis作为SpringBoot项目数据缓存

    简介: 在项目中设计数据访问的时候往往都是采用直接访问数据库,采用数据库连接池来实现,但是如果我们的项目访问量过大或者访问过于频繁,将会对我们的数据库带来很大的压力.为了解决这个问题从而redis数据 ...

  10. Python灰帽子:黑客与逆向工程师的Python编程之道|百度网盘免费下载|新手黑客入门

    百度网盘免费下载:Python灰帽子:黑客与逆向工程师的Python编程之道 提取码:tgpg 目录  · · · · · · 第1章 搭建开发环境 11.1 操作系统要求 11.2 获取和安装Pyt ...