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

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

一.需要的基础知识

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;	
}



1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值