Python开发连连看,PC也可以玩啦!
作者:Laziji
源自:https://laboo.top/2018/11/07/lianliankan/
1、前言
Python 实现的qq连连看辅助, 仅用于学习, 请在练习模式下使用, 请不要拿去伤害玩家们...
2、基本环境配置
版本:Python3.6
系统:Windows
3、相关模块:
import PIL.ImageGrabimport pyautoguiimport win32apiimport win32guiimport win32conimport timeimport random
4、使用方法
开始游戏后运行就行了, 再次提示, 请在练习模式中使用, 否则可能会被其他玩家举报。

效果图

5、代码实现
import PIL.ImageGrabimport pyautoguiimport win32apiimport win32guiimport win32conimport timeimport randomdef color_hash(color):value = ""for i in range(5):value += "%d,%d,%d," % (color[0], color[1], color[2])return hash(value)def image_hash(img):value = ""for i in range(5):c = img.getpixel((i * 3, i * 3))value += "%d,%d,%d," % (c[0], c[1], c[2])return hash(value)def game_area_image_to_matrix():pos_to_image = {}for row in range(ROW_NUM):= {}for col in range(COL_NUM):grid_left = col * grid_widthgrid_top = row * grid_heightgrid_right = grid_left + grid_widthgrid_bottom = grid_top + grid_heightgrid_image = game_area_image.crop((grid_left, grid_top, grid_right, grid_bottom))= grid_imagepos_to_type_id = {}image_map = {}empty_hash = color_hash((48, 76, 112))for row in range(ROW_NUM):= {}for col in range(COL_NUM):this_image = pos_to_image[row][col]this_image_hash = image_hash(this_image)if this_image_hash == empty_hash:= 0continuelen(image_map) + 1)= image_map.get(this_image_hash)return pos_to_type_iddef solve_matrix_one_step():for key in map:arr = map[key]arr_len = len(arr)for index1 in range(arr_len - 1):point1 = arr[index1]x1 = point1[0]y1 = point1[1]for index2 in range(index1 + 1, arr_len):point2 = arr[index2]x2 = point2[0]y2 = point2[1]if verifying_connectivity(x1, y1, x2, y2):arr.remove(point1)arr.remove(point2)= 0= 0if arr_len == 2:map.pop(key)return y1, x1, y2, x2def verifying_connectivity(x1, y1, x2, y2):max_y1 = y1while max_y1 + 1 < ROW_NUM and matrix[max_y1 + 1][x1] == 0:max_y1 += 1min_y1 = y1while min_y1 - 1 >= 0 and matrix[min_y1 - 1][x1] == 0:min_y1 -= 1max_y2 = y2while max_y2 + 1 < ROW_NUM and matrix[max_y2 + 1][x2] == 0:max_y2 += 1min_y2 = y2while min_y2 - 1 >= 0 and matrix[min_y2 - 1][x2] == 0:min_y2 -= 1rg_min_y = max(min_y1, min_y2)rg_max_y = min(max_y1, max_y2)if rg_max_y >= rg_min_y:for index_y in range(rg_min_y, rg_max_y + 1):min_x = min(x1, x2)max_x = max(x1, x2)flag = Truefor index_x in range(min_x + 1, max_x):if matrix[index_y][index_x] != 0:flag = Falsebreakif flag:return Truemax_x1 = x1while max_x1 + 1 < COL_NUM and matrix[y1][max_x1 + 1] == 0:max_x1 += 1min_x1 = x1while min_x1 - 1 >= 0 and matrix[y1][min_x1 - 1] == 0:min_x1 -= 1max_x2 = x2while max_x2 + 1 < COL_NUM and matrix[y2][max_x2 + 1] == 0:max_x2 += 1min_x2 = x2while min_x2 - 1 >= 0 and matrix[y2][min_x2 - 1] == 0:min_x2 -= 1rg_min_x = max(min_x1, min_x2)rg_max_x = min(max_x1, max_x2)if rg_max_x >= rg_min_x:for index_x in range(rg_min_x, rg_max_x + 1):min_y = min(y1, y2)max_y = max(y1, y2)flag = Truefor index_y in range(min_y + 1, max_y):if matrix[index_y][index_x] != 0:flag = Falsebreakif flag:return Truereturn Falsedef execute_one_step(one_step):from_col, to_row, to_col = one_stepfrom_x = game_area_left + (from_col + 0.5) * grid_widthfrom_y = game_area_top + (from_row + 0.5) * grid_heightto_x = game_area_left + (to_col + 0.5) * grid_widthto_y = game_area_top + (to_row + 0.5) * grid_heightfrom_y)pyautogui.click()to_y)pyautogui.click()if __name__ == '__main__':COL_NUM = 19ROW_NUM = 11screen_width = win32api.GetSystemMetrics(0)screen_height = win32api.GetSystemMetrics(1)hwnd = win32gui.FindWindow(win32con.NULL, 'QQ游戏 - 连连看角色版')if hwnd == 0:exit(-1)win32con.SW_RESTORE)win32gui.SetForegroundWindow(hwnd)window_top, window_right, window_bottom = win32gui.GetWindowRect(hwnd)if min(window_left, window_top) < 0 or window_right > screen_width or window_bottom > screen_height:exit(-1)window_width = window_right - window_leftwindow_height = window_bottom - window_topgame_area_left = window_left + 14.0 / 800.0 * window_widthgame_area_top = window_top + 181.0 / 600.0 * window_heightgame_area_right = window_left + 603 / 800.0 * window_widthgame_area_bottom = window_top + 566 / 600.0 * window_heightgame_area_width = game_area_right - game_area_leftgame_area_height = game_area_bottom - game_area_topgrid_width = game_area_width / COL_NUMgrid_height = game_area_height / ROW_NUMgame_area_image = PIL.ImageGrab.grab((game_area_left, game_area_top, game_area_right, game_area_bottom))matrix = game_area_image_to_matrix()map = {}for y in range(ROW_NUM):for x in range(COL_NUM):grid_id = matrix[y][x]if grid_id == 0:continue[])arr = map[grid_id]y])= 0while True:one_step = solve_matrix_one_step()if not one_step:exit(0)execute_one_step(one_step)time.sleep(random.randint(0,0)/1000)
主要思路就是利用pywin32获取连连看游戏句柄, 获取游戏界面的图片, 对方块进行切割, 对每个方块取几个点的颜色进行比对, 均相同则认为是同一个方块,
然后模拟鼠标去消就行了, 代码的最后一行是每次点击的间隔。
