Chinaunix首页 | 论坛 | 博客
  • 博客访问: 8184874
  • 博文数量: 1227
  • 博客积分: 10026
  • 博客等级: 上将
  • 技术积分: 20273
  • 用 户 组: 普通用户
  • 注册时间: 2008-01-16 12:40
文章分类

全部博文(1227)

文章存档

2010年(1)

2008年(1226)

我的朋友

分类: C/C++

2008-03-14 15:04:24

下载本文示例代码
图一 界面描述

一、制作思路
  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次才能作到实现鼠标模拟的另外一次单击。
 
下载本文示例代码
阅读(1225) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~