小程序实现连连看(实现的qq连连看辅助)
前言
Python 实现的qq连连看辅助, 仅用于学习, 请在练习模式下使用, 请不要拿去伤害玩家们...
作者:Laziji
源自:
https://laboo.top/2018/11/07/lianliankan/
基本环境配置
版本:Python3.6
系统:Windows
相关模块:
importPIL.ImageGrab
importpyautogui
importwin32api
importwin32gui
importwin32con
importtime
importrandom
使用方法
开始游戏后运行就行了, 再次提示, 请在练习模式中使用, 否则可能会被其他玩家举报
效果图
代码实现
importPIL.ImageGrab
importpyautogui
importwin32api
importwin32gui
importwin32con
importtime
importrandom
'''
想要学习Python?Python学习交流群:452739833满足你的需求,资料都已经上传群文件流,可以自行下载!
'''
defcolor_hash(color):
value=""
foriinrange(5):
value ="%d,%d,%d,"%(color[0],color[1],color[2])
returnhash(value)
defimage_hash(img):
value=""
foriinrange(5):
c=img.getpixel((i*3,i*3))
value ="%d,%d,%d,"%(c[0],c[1],c[2])
returnhash(value)
defgame_area_image_to_matrix():
pos_to_image={}
forrowinrange(ROW_NUM):
pos_to_image[row]={}
forcolinrange(COL_NUM):
grid_left=col*grid_width
grid_top=row*grid_height
grid_right=grid_left grid_width
grid_bottom=grid_top grid_height
grid_image=game_area_image.crop((grid_left,grid_top,grid_right,grid_bottom))
pos_to_image[row][col]=grid_image
pos_to_type_id={}
image_map={}
empty_hash=color_hash((48,76,112))
forrowinrange(ROW_NUM):
pos_to_type_id[row]={}
forcolinrange(COL_NUM):
this_image=pos_to_image[row][col]
this_image_hash=image_hash(this_image)
ifthis_image_hash==empty_hash:
pos_to_type_id[row][col]=0
continue
image_map.setdefault(this_image_hash,len(image_map) 1)
pos_to_type_id[row][col]=image_map.get(this_image_hash)
returnpos_to_type_id
defsolve_matrix_one_step():
forkeyinmap:
arr=map[key]
arr_len=len(arr)
forindex1inrange(arr_len-1):
point1=arr[index1]
x1=point1[0]
y1=point1[1]
forindex2inrange(index1 1,arr_len):
point2=arr[index2]
x2=point2[0]
y2=point2[1]
ifverifying_connectivity(x1,y1,x2,y2):
arr.remove(point1)
arr.remove(point2)
matrix[y1][x1]=0
matrix[y2][x2]=0
ifarr_len==2:
map.pop(key)
returny1,x1,y2,x2
defverifying_connectivity(x1,y1,x2,y2):
max_y1=y1
whilemax_y1 1<ROW_NUMandmatrix[max_y1 1][x1]==0:
max_y1 =1
min_y1=y1
whilemin_y1-1>=0andmatrix[min_y1-1][x1]==0:
min_y1-=1
max_y2=y2
whilemax_y2 1<ROW_NUMandmatrix[max_y2 1][x2]==0:
max_y2 =1
min_y2=y2
whilemin_y2-1>=0andmatrix[min_y2-1][x2]==0:
min_y2-=1
rg_min_y=max(min_y1,min_y2)
rg_max_y=min(max_y1,max_y2)
ifrg_max_y>=rg_min_y:
forindex_yinrange(rg_min_y,rg_max_y 1):
min_x=min(x1,x2)
max_x=max(x1,x2)
flag=True
forindex_xinrange(min_x 1,max_x):
ifmatrix[index_y][index_x]!=0:
flag=False
break
ifflag:
returnTrue
max_x1=x1
whilemax_x1 1<COL_NUMandmatrix[y1][max_x1 1]==0:
max_x1 =1
min_x1=x1
whilemin_x1-1>=0andmatrix[y1][min_x1-1]==0:
min_x1-=1
max_x2=x2
whilemax_x2 1<COL_NUMandmatrix[y2][max_x2 1]==0:
max_x2 =1
min_x2=x2
whilemin_x2-1>=0andmatrix[y2][min_x2-1]==0:
min_x2-=1
rg_min_x=max(min_x1,min_x2)
rg_max_x=min(max_x1,max_x2)
ifrg_max_x>=rg_min_x:
forindex_xinrange(rg_min_x,rg_max_x 1):
min_y=min(y1,y2)
max_y=max(y1,y2)
flag=True
forindex_yinrange(min_y 1,max_y):
ifmatrix[index_y][index_x]!=0:
flag=False
break
ifflag:
returnTrue
returnFalse
defexecute_one_step(one_step):
from_row,from_col,to_row,to_col=one_step
from_x=game_area_left (from_col 0.5)*grid_width
from_y=game_area_top (from_row 0.5)*grid_height
to_x=game_area_left (to_col 0.5)*grid_width
to_y=game_area_top (to_row 0.5)*grid_height
pyautogui.moveTo(from_x,from_y)
pyautogui.click()
pyautogui.moveTo(to_x,to_y)
pyautogui.click()
if__name__=='__main__':
COL_NUM=19
ROW_NUM=11
screen_width=win32api.GetSystemMetrics(0)
screen_height=win32api.GetSystemMetrics(1)
hwnd=win32gui.FindWindow(win32con.NULL,'QQ游戏-连连看角色版')
ifhwnd==0:
exit(-1)
win32gui.ShowWindow(hwnd,win32con.SW_RESTORE)
win32gui.SetForegroundWindow(hwnd)
window_left,window_top,window_right,window_bottom=win32gui.GetWindowRect(hwnd)
ifmin(window_left,window_top)<0orwindow_right>screen_widthorwindow_bottom>screen_height:
exit(-1)
window_width=window_right-window_left
window_height=window_bottom-window_top
game_area_left=window_left 14.0/800.0*window_width
game_area_top=window_top 181.0/600.0*window_height
game_area_right=window_left 603/800.0*window_width
game_area_bottom=window_top 566/600.0*window_height
game_area_width=game_area_right-game_area_left
game_area_height=game_area_bottom-game_area_top
grid_width=game_area_width/COL_NUM
grid_height=game_area_height/ROW_NUM
game_area_image=PIL.ImageGrab.grab((game_area_left,game_area_top,game_area_right,game_area_bottom))
matrix=game_area_image_to_matrix()
map={}
foryinrange(ROW_NUM):
forxinrange(COL_NUM):
grid_id=matrix[y][x]
ifgrid_id==0:
continue
map.setdefault(grid_id,[])
arr=map[grid_id]
arr.append([x,y])
pyautogui.PAUSE=0
whileTrue:
one_step=solve_matrix_one_step()
ifnotone_step:
exit(0)
execute_one_step(one_step)
time.sleep(random.randint(0,0)/1000)
(左右滑动可查看完整代码)
主要思路就是利用pywin32获取连连看游戏句柄, 获取游戏界面的图片, 对方块进行切割, 对每个方块取几个点的颜色进行比对, 均相同则认为是同一个方块,
然后模拟鼠标去消就行了, 代码的最后一行是每次点击的间隔
这里小编是一个有着5年工作经验的Python工程师,关于Python有一个完整学习Python的路线,学习材料和工具。需要的伙伴可以私信我,发送“Python”就可以获取领取地址,免费送给大家。对于学习Python有任何问题(学习方法,学习效率,如何就业)都可以问我。希望你也能凭自己的努力,成为下一个优秀的程序员!
,免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com