Linux编程点击右侧关注,免费入门到精通!

作者丨Laziji

https://laboo.top/2018/11/07/lianliankan/

前言

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

基本环境配置

版本:Python3.6

系统:Windows

相关模块:

import PIL.ImageGrabimport pyautoguiimport win32apiimport win32guiimport win32conimport timeimport random

使用方法

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

效果图

代码实现

import PIL.ImageGrabimport pyautoguiimport win32apiimport win32guiimport win32conimport timeimport 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 < ROW_NUM and matrix[max_y1 + 1][x1] == 0:        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 < ROW_NUM and matrix[max_y2 + 1][x2] == 0:        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 < COL_NUM and matrix[y1][max_x1 + 1] == 0:        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 < COL_NUM and matrix[y2][max_x2 + 1] == 0:        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) < 0 or window_right > 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获取连连看游戏句柄, 获取游戏界面的图片, 对方块进行切割, 对每个方块取几个点的颜色进行比对, 均相同则认为是同一个方块

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

 推荐↓↓↓ 

?16个技术公众号】都在这里!

涵盖:程序员大咖、源码共读、程序员共读、数据结构与算法、黑客技术和网络安全、大数据科技、编程前端、Java、Python、Web编程开发、Android、iOS开发、Linux、数据库研发、幽默程序员等。

万水千山总是情,点个 “好看” 行不行

200行Python 实现的qq连连看辅助, 用于学习, 请不要拿去伤害玩家们相关推荐

  1. 详解200行Python代码实现控制台版2048【总有一款坑适合你】【超详细】

    跟着实验楼学习了2048的Python实现,先丢个地址 200行Python代码实现2048 我接触Python时间不长,只了解一些基本的语法和容器,在学习的过程中遇到不少问题,这里做一个记录. cu ...

  2. python换脸教程_教你如何用200行Python代码“换脸”教程

    原标题:教你如何用200行Python代码"换脸"教程 本文将介绍如何编写一个只有200行的Python脚本,为两张肖像照上人物的"换脸". 这个过程可分为四步 ...

  3. Python实战2 - 200行Python代码实现2048(控制台)

    Python实战系列用于记录实战项目中的思路,代码实现,出现的问题与解决方案以及可行的改进方向 本文为第2篇–200行Python代码实现2048 一.分析与函数设计 1.1 游戏玩法 2048这款游 ...

  4. 用 200 行 Python 代码掌握基本音乐理论

    本文作者是一位多年自学成才的吉他手,但对西方乐理一无所知,因此决定编写一些代码来搞懂它. 本文用了大约200行Python代码来帮助我们理解西方音乐理论的基础知识. 我们将首先查看西方音乐理论中的音符 ...

  5. python换脸完整程序_小 200 行 Python 代码做了一个换脸程序

    原标题:小 200 行 Python 代码做了一个换脸程序 简介 在这篇文章中我将介绍如何写一个简短(200行)的 Python 脚本,来自动地将一幅图片的脸替换为另一幅图片的脸. 这个过程分四步: ...

  6. 炫酷!200 行 Python 代码实现马赛克拼图!

    在一图胜千言的时代,没有什么比一张图片更有冲击力的了,那如果一千张图片拼接起来是什么效果呢? 别问,问就是两字 -- 炫酷! 你有没有想过上面的图片是怎么实现的,难道这是用 ps 一张张拼起来的?当然 ...

  7. 200行Python实现效果逆天的连连看外挂

    本文内容转自我本人的知乎回答:你看过/写过哪些有意思的代码? - 三级狗的回答 - 知乎 https://www.zhihu.com/question/275611095/answer/4079841 ...

  8. 20行python代码的入门级小游戏-200行Python代码实现的2048小游戏

    2048这个小游戏大家都不陌生,应该都玩过,之前已经在网上见过各个版本的2048实现了,有JAVA.HTML5等,今天我就给大家来一个我自己在 实验楼 学到的python版2048.所有代码加起来才2 ...

  9. python200行代码_如何用200行Python代码“换脸”

    本文将介绍如何编写一个只有200行的Python脚本,为两张肖像照上人物的"换脸". 这个过程可分为四步: 检测面部标记. 旋转.缩放和转换第二张图像,使之与第一张图像相适应. 调 ...

最新文章

  1. 深度学习--感知机讲解
  2. ITSM五大趋势助力企业数字化转型
  3. [Arduino] 学习总结小合集(更新ING)
  4. hive 配置参数说明
  5. NYOJ 620 真实的谎言
  6. https网站引用http路径的js和css失效解决办法
  7. 聊一聊双十一背后的技术 - 不一样的秒杀技术, 裸秒
  8. spring注解开发:容器中注册组件方式
  9. Vue 响应式原理(双向数据绑定) 怎样实现 响应式原理?
  10. 查询ecshop网站代码排查方法_提升网站访问速度,提升网站访问速度,提升网站访问速度的个人经验分享...
  11. SAP License:SAP消息
  12. selenide UI自动化进阶二 pageObject实现页面管理
  13. Kafka——性能逆天的存在
  14. R中ggplot2绘图学习笔记
  15. Struts2的常见的配置文件介绍
  16. 金士顿服务器内存条怎么看型号,Win10怎么查看内存条型号?
  17. 网络唤醒 php,php 远程唤醒电脑 php源码远程唤醒电脑 远程开机
  18. 思科光交MDS9710绑定WWN并激活新的wwn
  19. git 提交代码某个文件夹一直提交不上去
  20. 如何搭建“业务化”的指标体系?

热门文章

  1. 计算机学院新生入学讲座,安全意识,铭记我心 --计算机学院开展新生入学安全教育讲座...
  2. unity关节(joint)讲解
  3. 计算机毕业设计Java高校招生管理系统(源码+系统+mysql数据库+Lw文档)
  4. STM32CubeIDE用Flash模拟Eeprom
  5. 字符串版本号比较(Java)
  6. 【UE 从零开始制作坦克】3-履带移动效果
  7. PacketiX ××× 3.0 免费试用
  8. 计算机毕业设计Java信贷管理系统(源码+系统+mysql数据库+lw文档
  9. Maven 从入门到上瘾!
  10. Mac安装HomeBrew及update报错Error: Fetching /opt/homebrew/Library/Taps/homebrew/homebrew-cask failed