图像处理第一课
连连看秒杀辅助

项目效果

直接使用C语言,实现【连连看】最强辅助

  1. 项目分析

项目的技术核心

不是逆向,而是图像处理。

图像处理,更高维度的技术手段。

电影中的图像处理应用

无人机战争-电影-完整版视频在线观看-爱奇艺

现实中的图像处理应用

美军无人机斩首伊朗2号人物卡西姆·苏莱马尼少将

国内的图像处理应用

贵州天网抓捕犯人-仅需7分钟

项目原理:

1)截图游戏画面

2)图形处理

3)路径分析,找到可消除的方块

4)控制鼠标进行点击

项目实现

项目开发模板:

  1. 创建项目

使用任意版本的VS, 创建一个空项目。

  1. 配置OpenCV开发环境
  1. 安装opencv

安装后的目录类似如下:

  1. 配置项目的头文件包含目录

D:\opencv\build\include

D:\opencv\build\include\opencv

D:\opencv\build\include\opencv2

  1. 配置项目的库文件包含目录

D:\opencv\build\x86\vc12\lib

注意选择x86或者x64

  1. 配置项目的附加依赖项(静态库文件)

opencv_core249d.lib

opencv_highgui249d.lib

opencv_imgproc249d.lib

  1. 拷贝opencv的动态链接库到可执行文件目录

opencv_core249d.dll

opencv_highgui249d.dll

opencv_imgproc249d.dll

  1. 截图
  1. 截图准备

找到游戏窗口,将游戏放在左上角

使用spy++工具确定连连看游戏窗口的“窗口标题”

代码实现:

#include <stdio.h>

#include <Windows.h>

int main(void) {

printf("are you ready?\n");

system("pause");

//找到游戏窗口,将游戏放在左上角方便定位,然后截图

HWND hq = FindWindow(NULL, L"QQ游戏 - 连连看角色版");

RECT rect;

GetWindowRect(hq, &rect);

int w = rect.right - rect.left;

int h = rect.bottom - rect.top;

MoveWindow(hq, 0, 0, w, h, false);

Sleep(2000);

return 0;

}

  1. 截图

导入工具库tools.h 和 tools.cpp项目目录下:

使用工具库 中的getScreen()函数,来实现截屏功能。

Mat src = getScreen();

// 测试截图是否正确

namedWindow("Test", CV_WINDOW_AUTOSIZE);//创建窗口

imshow("Test", src);

waitKey(0); //显示图片窗口,直到有按键按下

测试成功后,把以上三行测试代码删除。

  1. 图像识别处理

定义全局变量 int  flagMap[11][19],把游戏区域的各个图片“数字化”。

int  flagMap[11][19] = { 0, };

自定义函数,实现图像数字化

准备好空白位置的图片:

//图片左上角坐标

#define left_x 13

#define left_y 180

//每个小方块长宽

#define block_x 31

#define block_y 35

void picture_process(Mat src)

{

Mat vec[11][19];

memset(flagMap, 0, sizeof(flagMap));

int x_pos = left_x;

int y_pos = left_y;

// 切割各个小方块图片

for (int i = 0; i < 11; i++) {

for (int j = 0; j < 19; j++) {

Mat pic = src(Rect(x_pos, y_pos, block_x, block_y));

vec[i][j] = pic(Rect(5, 5, block_x - 7, block_y - 7));

// 测试截取后的小图片是否正确

//char name[32];

//sprintf_s(name, sizeof(name), "%d-%d.png", i, j);

//imwrite(name, vec[i][j]);

x_pos += block_x;

}

x_pos = left_x;

y_pos += block_y;

}

// 把图片数组转换为数字数组,相同的图片对应为一个最早出现这个图片的数组下标(下标加1)

for (int i = 0; i < 11; i++) {

for (int j = 0; j < 19; j++) {

if (flagMap[i][j] != 0) continue;

for (int m = 0; m < 11; m++) {

for (int n = 0; n < 19; n++) {

if (i == m && j == n) continue;

if (flagMap[m][n] == 0 && imgSame(vec[i][j], vec[m][n])){

flagMap[i][j] = i*19+j+1;

flagMap[m][n] = i*19+j+1;

}

}

}

}

}

// 去除空白方块

Mat blankImg = imread("empty.png");

for (int i = 0; i < 11; i++) {

for (int j = 0; j < 19; j++) {

if (imgSame(vec[i][j], blankImg)) {

int val = flagMap[i][j];

for (int m = 0; m < 11; m++) {

for (int n = 0; n < 19; n++) {

if (flagMap[m][n] == val) {

flagMap[m][n] = 0;

}

}

}

return;

}

}

}

}

打印数字化结果,用作调试用

void printMap() {

for (int i = 0; i < 11; i++) {

for (int j = 0; j < 19; j++) {

if (flagMap[i][j] == 0)

printf("    ");

else

printf("%4d", flagMap[i][j]);

}

printf("\n");

}

printf("\n\n\n");

}

调用刚定义的函数,对游戏截图进行处理

Mat src = getScreen();

picture_process(src);

printMap();

  1. 判断两个点是否可以消除

分析连连看的消除规则

使用工具库中的接口,提高开发效率:

tools.h

自定义函数,判断两点是否可以连接

// 判断是否能够连通

bool checkConnect(int row1, int col1, int row2, int col2) {

if (flagMap[row1][col1] == 0 ||  flagMap[row2][col2] == 0 || // 1. 起点和终点都不能是空白点

row1 == row2 && col1 == col2 ||  // 2. 起点和终点不能是同一个点

flagMap[row1][col1] != flagMap[row2][col2]) {            // 3. 起点和终点必须是相同的图块

return false;

}

if (shuiPingConnect((int*)flagMap, 19, row1, col1, row2, col2) ||  // Redmi

chuiZhiConnect((int*)flagMap, 19, row1, col1, row2, col2) ||

oneTurnConnect((int*)flagMap, 19, row1, col1, row2, col2) ||

twoTurnConnect((int*)flagMap, 11, 19, row1, col1, row2, col2)) {

return true;

}

return false;

}

  1. 匹配可连通的点,并自动点击消除

定义自动点击的时间间隔(速度)

#define DELAY_TIME  2

int match()

{

int ret = 0; //统计这次遍历消除的对数

for (int i = 0; i < 11; i++) {

for (int j = 0; j < 19; j++) {

if (flagMap[i][j] == 0) continue;

for (int m = 0; m < 11; m++) { //for (int m = i; m < 11; m++)

for (int n = 0; n < 19; n++) {

if (flagMap[m][n] == 0) continue;

if (m == i && n == j) continue;

if (flagMap[i][j] == flagMap[m][n]) {

if (checkConnect(i, j, m, n)) {

printf("消除:[%d][%d] - [%d][%d]\n", i, j, m, n);

printMap();

//system("pause");

ret++;

//鼠标操作 移动光标->暂停->单击左键->暂停->左键抬起->暂停

SetCursorPos((left_x + j * block_x) + 10,
                                   (left_y + i * block_y) + 10);

Sleep(DELAY_TIME + rand() % DELAY_TIME);

mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);

Sleep(DELAY_TIME + rand() % DELAY_TIME);

mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);

Sleep(DELAY_TIME + rand() % DELAY_TIME);

SetCursorPos((left_x + n * block_x) + 10,
                                    (left_y + m * block_y) + 10);

Sleep(DELAY_TIME + rand() % DELAY_TIME);

mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);

Sleep(DELAY_TIME + rand() % DELAY_TIME);

mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);

Sleep(DELAY_TIME + rand() % DELAY_TIME);

//更新数据

flagMap[i][j] = 0;

flagMap[m][n] = 0;

}

}

}

}

}

}

return ret;

}

  1. 自动开玩

判断是否已经消除完毕

bool allKilled() {  // 方块是否已经全部消除

for (int i = 0; i < 11; i++) {

for (int j = 0; j < 19; j++) {

if (flagMap[i][j])

return false;

}

}

return true;

}

自动开玩

int  main(void) {

......

while (1) {

int killCount = match();

if (allKilled()) {

break;

}

}

}

  1. 使用道具

某些情况可能又死局,此时就可以使用道具。

int chongPai = 2;

while (1) {

int killCount = match();

if (allKilled()) {

break;

}

if (killCount == 0 && chongPai > 0) {

SetCursorPos(653, 199);  //移动到变形道具位置

mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0); //使用道具

Sleep(3000);

src = getScreen();

picture_process(src);

chongPai--;

}

}

  1. 项目拓展
  1. 全自动连连看辅佐,自动加入游戏,自动开玩。
  2. 绕开腾讯检测的QQ机器人
  3. 图像处理的高级应用:自动驾驶

C++和Python的纠结?

Python也能做图像处理(底层使用C++)

那到底该如何选择?

C/C++  &  算法  &  框架  &  产品级项目 => 大厂

C++为什么被黑?

因为很多人学不会,因为开发难度相对较大

90%的C/C++的自学者,死在指针上!

C++的缺点:

开发效率没有Java, Python高

很多都需要自己设计组件

C++的优点:

  1. 效率高(越来也不明显了)
  2. C++程序员的不可替代性高!!!

今天的分享就到这里了,大家要好好学C语言/C++哟~
写在最后:对于准备学习C/C++编程的小伙伴,如果你想更好的提升你的编程核心能力(内功)不妨从现在开始!

C语言C++编程学习交流圈子,QQ群:763855696【点击进入】

C语言从入门到精通(C语言入门C语言教程C语言零基础C语言基础C语言学习C

整理分享(多年学习的源码、项目实战视频、项目笔记,基础入门教程)
欢迎转行和学习编程的伙伴,利用更多的资料学习成长比自己琢磨更快哦!
编程学习视频分享:

C语言连连看秒杀辅助相关推荐

  1. android脚本实现自动捉妖,一起来捉妖自动秒杀脚本下载-一起来捉妖自动秒杀辅助 最新版_爱下手机站...

    很多一起来捉妖的新手玩家发现这款游戏因为节奏太快的缘故对新进入游戏的玩家不是很友好~那么今天小编为大家带来的这款辅助软件就能够轻松的解决大家这个问题哦!一起来捉妖自动秒杀辅助为大家带来的强大辅助也是能 ...

  2. C语言五子棋禁手算法的编写,基于C语言的五子棋辅助软件的设计与实现.doc

    基于C语言的五子棋辅助软件的设计与实现 广东工业大学 本科毕业设计(论文) 基于C语言的五子棋辅助软件的设计与实现 系 部 专 业 年 级 班级名称 学 号 学生姓名 指导教师 2012 年 5 月 ...

  3. python跟易语言那个写辅助_易语言写练练看辅助

    .版本 2 .支持库 BmpOperate .支持库 shellEx .支持库 dp1 .程序集 窗口程序集1 .程序集变量 方块数据, 方块数据, , "19,11" .程序集变 ...

  4. 511遇见易语言大漠脚本辅助从入门到提高

    511遇见为了让教程系统化,特意录制易语言大漠插件脚本辅助从入门到提高100课: 教程加入了大漠驱动的配置加载调用,内存找图,圆形.椭圆.矩形.方向.中心渐开线和鼠标特征码的结合扫怪,把游戏窗口嵌入脚 ...

  5. 天野第四期易语言半内存辅助培训课程

    第一章 易语言基础 共4课时 1:易语言核心支持库命令讲解之一 2:易语言核心支持库命令讲解之二 3:易语言常用组件讲解.数组操作详解 4:易语言调试功能讲解.线程的了解.自定义数据类型的了解与应用 ...

  6. c语言连连看实验报告,连连看C语言课程设计报告.doc

    连连看C语言课程设计报告 连连看 问题描述 连连看是一款简单有趣的小游戏,曾经风靡一时,玩家要将相同的两张牌用三根以内的直线连在一起就可以消除,规则简单容易上手,游戏速度节奏快,画面清晰可爱,适合细心 ...

  7. 天野第五期易语言半内存辅助培训班教程

    第一章 易语言基础及大漠插件基础 共8课时 1:易语言核心支持库命令讲解 2:易语言常用组件讲解 4:易语言模块.DLL制作及调试功能讲解.线程的了解.自定义数据类型的了解 4:大漠插件注册.写脚本常 ...

  8. c语言连连看实验报告,连连看C语言课程设计报告

    连连看C语言课程设计报告 目录 问题描述 连连看是一款简单有趣的小游戏,曾经风靡一时,玩家要将相同的两张牌用三根以内的直线连在一起就可以消除,规则简单容易上手,游戏速度节奏快,画面清晰可爱,适合细心的 ...

  9. java怎么写dnf辅助_易语言地下城与勇士辅助自动刷图类源码

    DNF辅助自动刷图类 仅供学习参考,禁止商业用途 .版本 2 .支持库 EThread .支持库 spec .程序集 自动 .子程序 自动刷图 .判断开始 (全局_总开关.自动刷图开关 = 假) 全局 ...

  10. 易语言大漠实现辅助一键启动游戏

    我们要实现一键登录游戏, 首先要通过易语言启动您系统里的游戏,这里主要使用易语言的 运行()和 执行()命令,但直接使用是无法启动游戏的,所有我们可以采用创建进程,运行,执行,API封装等等. 易语言 ...

最新文章

  1. 2021年4月27日 华为Cloud AI 通用软件开发实习面试(一面)
  2. ML之SVM:利用SVM算法对手写数字图片识别数据集(PCA降维处理)进行预测并评估模型(两种算法)性能
  3. ?线程池为什么可以复用,我是蒙圈了。。。
  4. java的本地文件操作
  5. php删除垃圾文件,Python删除windows垃圾文件的方法
  6. 一份关于jvm内存调优及原理的学习笔记
  7. 字符串的展开(洛谷P1098题题解,Java语言描述)
  8. Linq to sql并发与事务
  9. python pdfplumber 打开文件失败_喜大普奔 | 如何在Win10下利用Python打开grib文件
  10. python正确方法_下列定义函数的方法,在Python中正确的是()。
  11. SystemExit: 2
  12. pre和code的区别
  13. 《软件工程导论》知识点期末复习整理
  14. 使用软碟通安装win7
  15. 迅捷PDF转Word转换器
  16. Python|报错解决|os.symlink: FileExistsError
  17. antd的联级选择器异步调用编辑回显_react-uplod-img 是一个基于 React antd组件的图片上传组件...
  18. JVM调优总结(1)
  19. faceswap的正确安装步骤
  20. 学习python[:,:]

热门文章

  1. 14个UI精美功能强大的Android应用设计模板
  2. abb机器人写字程序实例_【干货】ABB机器人编程实例一
  3. 各省研究与试验发展(R&D)人员全时当量(1998-2018年)
  4. 土建中级工程师考试用书电子版_对没错!2020年湖南土建中级职称考试教材只是指导用书...
  5. 什么情况下使用10分钟邮箱?8个临时邮箱推荐
  6. MATALB 卷积神经网络 图片二分类
  7. 华为novia3i鸿蒙,华为nova3i一马当先:值得年轻人购买的智能手机推荐
  8. python自动排版公众号_GitHub - qfwc258/maxpress: MaxPress:MarkDown+Python实现微信公众号一键排版...
  9. 杭州SEO:独家揭秘网站首页排版布局的详细方法!
  10. CSS之内联、内部、外部样式