1. 程式人生 > 實用技巧 >用Python玩連連看是什麼效果?

用Python玩連連看是什麼效果?

1、前言

Python實現的qq連連看輔助, 僅用於學習, 請在練習模式下使用, 請不要拿去傷害玩家們...

很多人學習python,不知道從何學起。
很多人學習python,掌握了基本語法過後,不知道在哪裡尋找案例上手。
很多已經做案例的人,卻不知道如何去學習更加高深的知識。
那麼針對這三類人,我給大家提供一個好的學習平臺,免費領取視訊教程,電子書籍,以及課程的原始碼!
QQ群:1097524789

2、基本環境配置

版本:Python3.6

系統:Windows

3、相關模組:


1importPIL.ImageGrab
2importpyautogui
3importwin32api
4importwin32gui

5importwin32con
6importtime
7importrandom


1importPIL.ImageGrabimportpyautoguiimportwin32apiimportwin32guiimportwin32conimporttimeimportrandom

4、使用方法

開始遊戲後執行就行了, 再次提示,請在練習模式中使用, 否則可能會被其他玩家舉報。

效果圖

5、程式碼實現


1importPIL.ImageGrab
2importpyautogui
3importwin32api
4importwin32gui
5importwin32con
6importtime

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

主要思路就是利用pywin32獲取連連看遊戲控制代碼, 獲取遊戲介面的圖片, 對方塊進行切割, 對每個方塊取幾個點的顏色進行比對, 均相同則認為是同一個方塊,

然後模擬滑鼠取消就行了, 程式碼的最後一行是每次點選的間隔。