一、制作思路
1、得到QQ连连看窗口指针,从而得到CDC;
2、对每幅图片取4个点进行编码;
3、实现连连看的算法;
4、模拟鼠标消去块;
界面如下:
二、部分代码
//定义的数据 bool flagx=true; int point1x,point1y,point2x,point2y;//保存需要单击点的位置 struct MYCOLOR { COLORREF c[4]; }; MYCOLOR tc[230];//颜色表230〉11*19 int tcnum; //所有图片的种类 int map[19][11]; //存放每个图片的颜色索引 int r1,g1,b1,r2,b2,g2; int pop1,pop2; //对图形进行编码 void CZg1Dlg::OnButton3() { int pnum=0; ////////////////// int t[4]={15,11,15,21};//取的4个点的x相对位移 int tt[4]={17,17,21,17};////取的4个点的y相对位移 //////////////////// int result; tc[0].c[0]=tc[0].c[1]=tc[0].c[2]=tc[0].c[3]=7753015; tcnum=1; MYCOLOR tmp; CPoint p(10,180); CDC *pdc=myc->GetDC(); CString hh=” 编码结果: \n”; CString h; int myr,myg,myb,t_t,sh; for(int i=0;i<11;i++) { p.y=180+i*35; for(int j=0;j<19;j++) { p.x=10+j*31; for(int k=0;k<4;k++) tmp.c[k]=pdc->GetPixel(p.x+t[k],p.y+tt[k]); sh=0; for(t_t=0;t_t<4;t_t++) { myr=GetRValue(tmp.c[t_t]); myg=GetGValue(tmp.c[t_t]); myb=GetBValue(tmp.c[t_t]); if ((myr<73)&&(myr>45)&&(myg>50)&&(myg<90)&& \(myb>103) &&(myb<129)) sh++; } if(sh==4) map[j][i]=0; else { pnum++; result=findcolor(tmp); if(result==-1) { tc[tcnum].c[0]=tmp.c[0]; tc[tcnum].c[1]=tmp.c[1]; tc[tcnum].c[2]=tmp.c[2]; tc[tcnum].c[3]=tmp.c[3]; map[j][i]=tcnum; tcnum++; } else { map[j][i]=result; } } h.Format(“%d “,map[j][i]); hh+=h; sh=0; } hh+=”\n”; } bool yy=true; for(int y1=0;y1<11;y1++) { for(int y2=0;y2<19;y2++) { if(tc[map[y2][y1]].c[0]==-1) yy=false; } } CString cs2; cs2.Format(“总共有 %d 可消!”,pnum); hh+=cs2; MessageBox(hh); for(i=0;i<11;i++) for(int j=0;j<19;j++) { mymap[i][j]=map[j][i]; } if(!yy) { MessageBox(“请重新编码!\n 编码时要确保游戏窗口不要被其他窗口挡住!”); } flagx=true; } |
三、结束语
不足之处是点击2次鼠标才能消去1对。因为这个游戏必须鼠标真正点击1次才能作到实现鼠标模拟的另外一次单击。
>> 本文固定链接: http://www.vcgood.com/archives/1551