首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

200行Python 代码实现的连连看辅助脚本!

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

基本环境配置

版本:Python3.6

系统:Windows

相关模块:

importPIL.ImageGrab

importpyautogui

importwin32api

importwin32gui

importwin32con

importtime

importrandom

使用方法

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

效果图

代码实现

import PIL.ImageGrab

import pyautogui

import win32api

import win32gui

import win32con

import time

import random

'''

想要学习Python?Python学习交流群:452739833满足你的需求,资料都已经上传群文件流,可以自行下载!

'''

def 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):

pos_to_image[row] = {}

for col in range(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))

for row in range(ROW_NUM):

pos_to_type_id[row] = {}

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:

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)

return pos_to_type_id

def 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)

matrix[y1][x1] = 0

matrix[y2][x2] = 0

if arr_len == 2:

map.pop(key)

return y1, x1, y2, x2

def verifying_connectivity(x1, y1, x2, y2):

max_y1 = y1

while max_y1 + 1

max_y1 += 1

min_y1 = y1

while min_y1 - 1 >= 0 and matrix[min_y1 - 1][x1] == 0:

min_y1 -= 1

max_y2 = y2

while max_y2 + 1

max_y2 += 1

min_y2 = y2

while min_y2 - 1 >= 0 and matrix[min_y2 - 1][x2] == 0:

min_y2 -= 1

rg_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 = True

for index_x in range(min_x + 1, max_x):

if matrix[index_y][index_x] != 0:

flag = False

break

if flag:

return True

max_x1 = x1

while max_x1 + 1

max_x1 += 1

min_x1 = x1

while min_x1 - 1 >= 0 and matrix[y1][min_x1 - 1] == 0:

min_x1 -= 1

max_x2 = x2

while max_x2 + 1

max_x2 += 1

min_x2 = x2

while min_x2 - 1 >= 0 and matrix[y2][min_x2 - 1] == 0:

min_x2 -= 1

rg_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 = True

for index_y in range(min_y + 1, max_y):

if matrix[index_y][index_x] != 0:

flag = False

break

if flag:

return True

return False

def execute_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游戏 - 连连看角色版')

if hwnd == 0:

exit(-1)

win32gui.ShowWindow(hwnd, win32con.SW_RESTORE)

win32gui.SetForegroundWindow(hwnd)

window_left, window_top, window_right, window_bottom = win32gui.GetWindowRect(hwnd)

if min(window_left, window_top)screen_width or window_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 = {}

for y in range(ROW_NUM):

for x in range(COL_NUM):

grid_id = matrix[y][x]

if grid_id == 0:

continue

map.setdefault(grid_id, [])

arr = map[grid_id]

arr.append([x, y])

pyautogui.PAUSE = 0

while 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获取连连看游戏句柄, 获取游戏界面的图片, 对方块进行切割, 对每个方块取几个点的颜色进行比对, 均相同则认为是同一个方块,

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

转载声明:本文选自「 辣子鸡的博客」

学习Python就关注:datanami

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190213B0IGLS00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券