基于像素分析的连连看辅助程序学习

xiaoxiao2021-02-28  107

大学期间一直想写游戏辅助来着,很惭愧,一直很懒,也感觉不太简单,终于有时间了,就从连连看开始吧.

一.需要的基础知识

1.C或者C++基本语法

2.winAPI知道怎么去查如何使用

3.相信自己的思路具有可行性,不去想目前条件不够而不去做

二.程序构建的思路

1.郁金香教程比较给力,但本人没有及时获取资源,写了一半才看到,它提供了用CE在内存中查找棋盘信息的方法。此处不表,算作以后要学习的能力。

2.自己的小程序是基于屏幕像素的分析,基本也分析出来了,通过窗口截图,获取棋盘信息和两个棋子是否相同。

3.得到截图后,开始对每一个棋子分析,通过8种路径(只写了三根线的,因为发现这样也能在几次消除后完全消除,所以把两根线和一根线的删除了)找到许许多多块,判断是否和当前块相同,相同则发送鼠标消息,同时修改棋盘信息。

三.下面是分步骤详细说明:

1.窗口截图的保存

函数:FindWindow、GetWindowRect、GetDC、CreatCompatibleDC、CreatCompatibleBitmap

            SelectObject、BitBlt

结构体: RECT 、HDC、HBITMAP 、HWND

2.DDB转DIB

函数:GetDIBits

结构体: BITMAPINFO 

3.发送消息

函数:SendMessage

四.程序说明以及其他

游戏开始后,按任意键获取棋盘,0为命令输入,待特效消失后,再次输入命令0,直到完成游戏。

使用过的辅助软件:spy++,fireworks,VC++6.0

#include <windows.h> #include <Winuser.h> #include <iostream> #include "stdio.h" using namespace std; int appwidth=0; int appheight=0; int i,j=0; unsigned int **mypic;//整个窗口像素 bool iscube[11][19]={0};//棋盘该位置是否有方块 void getnet(HWND hwndapp) { RECT parentrect;// 目标窗体方框 HDC screendc = NULL;//屏幕DC HDC cutdc = NULL;//截图DC HBITMAP hbitmap = NULL; //待传入的图 //把窗口图像保存,对bitmap做处理 GetWindowRect(hwndapp, &parentrect);//得到窗口坐标 appwidth=parentrect.right-parentrect.left;//窗口宽 appheight=parentrect.bottom-parentrect.top;//窗口高 screendc = GetDC(NULL);//屏幕DC cutdc = CreateCompatibleDC(screendc);//截图DC hbitmap = CreateCompatibleBitmap(screendc,appwidth,appheight);//截图DC的位图 SelectObject(cutdc,hbitmap);//关连DC和位图 BitBlt(cutdc,0,0,appwidth,appheight,screendc,parentrect.left,parentrect.top,SRCCOPY);//DC间互传,即给位图赋值 //DDB转DIB BITMAPINFO bitmapinfo={0};//代码要抄全,结构体要初始化,指针要初始化。!!!!!!!!!!!!! bitmapinfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); GetDIBits(cutdc,hbitmap,0,appheight,NULL,&bitmapinfo,DIB_RGB_COLORS); //第一次调用获得信息 unsigned char *bitmap_use = new unsigned char[bitmapinfo.bmiHeader.biSizeImage];//大小为 长乘宽*4字节 memset(bitmap_use, 0, bitmapinfo.bmiHeader.biSizeImage); GetDIBits(cutdc, hbitmap, 0, appheight, bitmap_use, &bitmapinfo, DIB_RGB_COLORS);//第二次调用获得DIB性质的 bitmap_use, 每四个数为一个像素的信心 mypic = (unsigned int **)malloc(appheight*sizeof(unsigned int *)); for(i=0;i<appheight;i++){ mypic[i]=(unsigned int *)malloc(appwidth*sizeof(unsigned int));//申请内存 } int red_value; int green_value; int blue_value; int maskcode; //每四个数组合一下 for(i=0;i<appheight;i++){ for(j=0;j<appwidth;j++){ red_value=bitmap_use[i*appwidth*4+j*4]; green_value=bitmap_use[i*appwidth*4+j*4+1]; blue_value=bitmap_use[i*appwidth*4+j*4+2]; maskcode=bitmap_use[i*appwidth*4+j*4+3]; mypic[i][j] = (red_value<<24)+(green_value<<16)+(blue_value<<8)+maskcode;//括号不能忘 } } //判断方块某个像素是否为底色来确定有无,此处使用左下角的像素 for(i=0;i<11;i++){ for(j=0;j<19;j++){ iscube[i][j]=1; if(mypic[35+(10-i)*35][15+j*31]==1884041216){//DIB存储有点特别,从下往上,从左到右。最左边第二列为0列,第一列消失,最后一列 iscube[i][j]=0; //不是最后一列,自己再添加一列。。。。。。很愁! } } } DeleteObject(hbitmap); DeleteDC(cutdc); } void tellandclick12(HWND hwndapp, int i1,int j1, int i2, int j2) { bool flag=TRUE; for(int it=0;it<20;it++){ if(mypic[35+(10-i1)*35+2+it][15+j1*31+12]!=mypic[35+(10-i2)*35+2+it][15+j2*31+12]){//根据存储位置,判断两个方块的20个像素是否相同 flag=FALSE; } } if(flag==TRUE){ printf("%d %d %d %d\n",i1,j1,i2,j2);//发送信息,修改棋盘 SendMessage(hwndapp,WM_LBUTTONDOWN,MK_LBUTTON,MAKELONG(15+j1*31+12,600-(35+(10-i1)*35)-12)); SendMessage(hwndapp,WM_LBUTTONDOWN,MK_LBUTTON,MAKELONG(15+j2*31+12,600-(35+(10-i2)*35)-12)); iscube[i1][j1]=0; iscube[i2][j2]=0; } } int main() { HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); // 获取标准输出设备句柄 SMALL_RECT rc = {10,10, 40-1, 25-1};// 重置窗口位置和大小 SetConsoleWindowInfo(hOut,true ,&rc); getchar(); HWND hwndapp; hwndapp= FindWindow(0, "QQ游戏 - 连连看角色版");// 目标窗口句柄 int command=0; cout<<"intputcommand:"<<endl; cin>>command; getnet(hwndapp); while(command!=-1){ if(command==0){ //1,三条线的共有八种路径,自己需要在纸上画。 for(i=0;i<11;i++){ for(j=0;j<19;j++){ if(iscube[i][j]==1){ int ifirst,jfirst; for(ifirst=i,jfirst=j+1;jfirst<19;jfirst++){// if(iscube[ifirst][jfirst]==1)break; if(iscube[ifirst][jfirst]==0){ int isecond,jsecond; for(isecond=ifirst-1,jsecond=jfirst;isecond>=0;isecond--){ // if(iscube[isecond][jsecond]==1)break; if(iscube[isecond][jsecond]==0){ int ithird,jthird; for(jthird=jsecond-1,ithird=isecond;jthird>=0;jthird--){// if(iscube[ithird][jthird]==1){ tellandclick12(hwndapp, i, j, ithird, jthird); break; } } } } } } } } } //2 for(i=0;i<11;i++){ for(j=0;j<19;j++){ if(iscube[i][j]==1){ int ifirst,jfirst; for(ifirst=i,jfirst=j-1;jfirst>=0;jfirst--){// if(iscube[ifirst][jfirst]==1)break; if(iscube[ifirst][jfirst]==0){ int isecond,jsecond; for(isecond=ifirst-1,jsecond=jfirst;isecond>=0;isecond--){ // if(iscube[isecond][jsecond]==1)break; if(iscube[isecond][jsecond]==0){ int ithird,jthird; for(jthird=jsecond+1,ithird=isecond;jthird<19;jthird++){// if(iscube[ithird][jthird]==1){ tellandclick12(hwndapp, i, j, ithird, jthird); break; } } } } } } } } } //3 for(i=0;i<11;i++){ for(j=0;j<19;j++){ if(iscube[i][j]==1){ int ifirst,jfirst; for(ifirst=i+1,jfirst=j;ifirst<11;ifirst++){// if(iscube[ifirst][jfirst]==1)break; if(iscube[ifirst][jfirst]==0){ int isecond,jsecond; for(jsecond=jfirst-1,isecond=ifirst;jsecond>=0;jsecond--){// if(iscube[isecond][jsecond]==1)break; if(iscube[isecond][jsecond]==0){ int ithird,jthird; for(ithird=isecond-1,jthird=jsecond;ithird>=0;ithird--){// if(iscube[ithird][jthird]==1){ tellandclick12(hwndapp, i, j, ithird, jthird); break; } } } } } } } } } //4 for(i=0;i<11;i++){ for(j=0;j<19;j++){ if(iscube[i][j]==1){ int ifirst,jfirst; for(ifirst=i-1,jfirst=j;ifirst>=0;ifirst--){// if(iscube[ifirst][jfirst]==1)break; if(iscube[ifirst][jfirst]==0){ int isecond,jsecond; for(jsecond=jfirst-1,isecond=ifirst;jsecond>=0;jsecond--){// if(iscube[isecond][jsecond]==1)break; if(iscube[isecond][jsecond]==0){ int ithird,jthird; for(ithird=isecond+1,jthird=jsecond;ithird<11;ithird++){// if(iscube[ithird][jthird]==1){ tellandclick12(hwndapp, i, j, ithird, jthird); break; } } } } } } } } } //5 for(i=0;i<11;i++){ for(j=0;j<19;j++){ if(iscube[i][j]==1){ int ifirst,jfirst; for(ifirst=i,jfirst=j+1;jfirst<19;jfirst++){// if(iscube[ifirst][jfirst]==1)break; if(iscube[ifirst][jfirst]==0){ int isecond,jsecond; for(isecond=ifirst-1,jsecond=jfirst;isecond>=0;isecond--){// if(iscube[isecond][jsecond]==1)break; if(iscube[isecond][jsecond]==0){ int ithird,jthird; for(jthird=jsecond+1,ithird=isecond;jthird<19;jthird++){// if(iscube[ithird][jthird]==1){ tellandclick12(hwndapp, i, j, ithird, jthird); break; } } } } } } } } } //6 for(i=0;i<11;i++){ for(j=0;j<19;j++){ if(iscube[i][j]==1){ int ifirst,jfirst; for(ifirst=i,jfirst=j+1;jfirst<19;jfirst++){// if(iscube[ifirst][jfirst]==1)break; if(iscube[ifirst][jfirst]==0){ int isecond,jsecond; for(isecond=ifirst+1,jsecond=jfirst;isecond<11;isecond++){// if(iscube[isecond][jsecond]==1)break; if(iscube[isecond][jsecond]==0){ int ithird,jthird; for(jthird=jsecond+1,ithird=isecond;jthird<19;jthird++){// if(iscube[ithird][jthird]==1){ tellandclick12(hwndapp, i, j, ithird, jthird); break; } } } } } } } } } //7 for(i=0;i<11;i++){ for(j=0;j<19;j++){ if(iscube[i][j]==1){ int ifirst,jfirst; for(ifirst=i+1,jfirst=j;ifirst<11;ifirst++){// if(iscube[ifirst][jfirst]==1)break; if(iscube[ifirst][jfirst]==0){ int isecond,jsecond; for(jsecond=jfirst-1,isecond=ifirst;jsecond>=0;jsecond--){// if(iscube[isecond][jsecond]==1)break; if(iscube[isecond][jsecond]==0){ int ithird,jthird; for(ithird=isecond+1,jthird=jsecond;ithird<11;ithird++){// if(iscube[ithird][jthird]==1){ tellandclick12(hwndapp, i, j, ithird, jthird); break; } } } } } } } } } //8 for(i=0;i<11;i++){ for(j=0;j<19;j++){ if(iscube[i][j]==1){ int ifirst,jfirst; for(ifirst=i-1,jfirst=j;ifirst>=0;ifirst--){// if(iscube[ifirst][jfirst]==1)break; if(iscube[ifirst][jfirst]==0){ int isecond,jsecond; for(jsecond=jfirst-1,isecond=ifirst;jsecond>=0;jsecond--){// if(iscube[isecond][jsecond]==1)break; if(iscube[isecond][jsecond]==0){ int ithird,jthird; for(ithird=isecond-1,jthird=jsecond;ithird>=0;ithird--){// if(iscube[ithird][jthird]==1){ tellandclick12(hwndapp, i, j, ithird, jthird); break; } } } } } } } } } cout<<"intputcommand:"<<endl; cin>>command; getnet(hwndapp); } } cout<<"done!"<<endl; return 0; }

转载请注明原文地址: https://www.6miu.com/read-64103.html

最新回复(0)