QQ头像连连看总结_第1页
QQ头像连连看总结_第2页
QQ头像连连看总结_第3页
QQ头像连连看总结_第4页
QQ头像连连看总结_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、QQ头像连连看一、程序说明本程序名为QQ头像连连看,采用 QQ头像为图片,利用 MFC对话框程序完成连连看 游戏。二、设计要求及实现功能1、 分级别的连连看。程序中分低、中、高三级模式,每一个级别响应的图片数目不同。2、提示功能。当游戏者找不到可以消去的图片对时,可以从程序中得到提示,从而继 续进行游戏。3、重新排列功能。当程序中图片已经没有可以消去的图片对时,提示游戏者可以点击重新排列”进行图片重排,从而可以继续进行图片。4、程序具有计时功能。游戏者完成游戏应在规定时间范围内,否则应算为失败。不同 级别的游戏时间应不同。三、概要设计1、游戏设计思路所谓连连看游戏,它就是在一个背景下有若干的图

2、片,如果连续点击相同的图片,并且可以用 最多两折的线段连接,之间还没有其他障碍物,就可以消掉这一对图片, 如 果所有的图片都被消掉, 就可取得胜利。倘若在规定的时间内没有消完所有图片, 则游 戏失败。2、图片显示设计显示的图片必须要实现点击功能。因此本设计中把图片设计为一个由CBitmapButton派生出的自定义的按钮数组。可以实现显示图片及点击功能。使每个自定义的按钮都有自己的 ID号,用来存储图片类型, 还应该有一个CPoint 类型的成员变量,用来存储每个 Butt on的位置信息,最后在创建时,将和 ID号对应 的图片贴到相应的位置上即可。保证每种图片都是成对出现的:首先定位到第一个

3、按钮的位置,随机选择一种图片, 生成这个按钮,然后随机选择一个位置,仍然放置这种图片, 再定位到第二个按钮的位置,随机选择一种图片, 生成这个按钮,然后再随机选择一个位置,如果这个位置已经 有按钮了,则重新随机选择一个位置,直到选到一个空的位置,放置相同的图片,以此类推,将整个地图布完。3、消去算法如果连续点击相同的图片, 并且可以用最多两折的线段连接,之间还没有其他障碍物,就可以消掉这一对图片。根据此设计思路,可以分为三种情况来实现消去算法:(1)两个图片在同行或同列4、流程图总流程图游戏过程流程四、详细设计 1、数据结构主窗口类CMyLLKDIgclassCMyLLKDIg : publi

4、c CDialog private:int MAXX ;int MAXY ;int meft;显示图片时,左上、右下的坐标int m_top;int m_right;int m_bottom;bool m_flag;标记是否按开始游戏int m_NUM;int m_index;CPoi nt m_ptCross1;CPoi nt m_ptCross2CPoi nt m_ptCross3CPoi nt m_ptCross4public:int m_remainBtn;int m_time;记录倒计时时间int m_typeNum; /图片种类数int map2020; /地图数组,存储图片类型

5、int m_BtnCIkNum;CPtrArray m_btnGroup; /Button 组CPoint m_firstBtnPoint ;CPoint m_secondBtnPoint;void Init(void);void InitMap (int map20);void ShowMap(int map20);void ProcessGame(void);bool FindHelp(void);bool FindLine(CPoint p1, CPoint p2);bool FindSide(CPoint p1, CPoint p2);bool FindOneConner(CPoint

6、 p1, CPoint p2);bool FindTwoConner(CPoint p1, CPoint p2); afx_msg void OnTimer(UINT_PTR nIDEvent); afx_msg void OnHelp();afx_msg void OnRerange(); afx_msg void OnStartLow(); afx_msg void OnStartMid(); afx_msg void OnStartHig();afx_msg void OnExit ();afx_msg void OnInstruc();afx_msg void OnOpenmusic(

7、);(2) CMyLLKApp 类(3) 连连看按钮类 CLLKButton classCLLKButton : public CBitmapButton DECLARE_DYNAMIC (CLLKButton )public:CLLKButton (int id,CPoint p); virtual CLLKButton ();CPoint m_clkPoint;/ 保存点击的点位置CPoint m_virPoint ;int mD;标记每张图片的ID int BitmapID;/位图的 IDBOOL IsClick ; /判断是否被按下protected:DECLARE_MESSAGE_M

8、AP ()public:afx_msgvoid OnLButtonDown(UINT nFlags, CPointpoint); ;(4) 游戏介绍窗口类 CInstrcDlg(5) 关于窗口类 CAboutDlg2、主要函数(1)CLLKButton :CLLKButton (int id,CPoint p) CLLKButton :CLLKButton (int id,CPoint p) this-m_clkPoint.x=p.x;this-m_clkPoint.y=p.y;this-m_ID=id;BitmapID=m_ID+IDB_BITMAP1 -1;/IDB_BITMAP1=130

9、 m_virPoint .x=0;m_virPoint .y=0;IsClick=FALSE; (2)CLLKButton 类成员函数 :void OnLButtonDown (UINT nFlags, CPoint point) void CLLKButton :OnLButtonDown ( UINT nFlags, CPoint point) CMyLLKDlg * parent=(CMyLLKDlg *) GetParent();m_virPoint .x=m_clkPoint .x;m_virPoint .y=m_clkPoint .y;/this-ShowWindow(SW_HID

10、E);IsClick=TRUE;parent-m_BtnClkNum +;if (parent-m_BtnClkNum =1) parent-m_firstBtnPoint.x=m_virPoint.x; parent-m_firstBtnPoint.y=m_virPoint.y; elseif (parent-m_BtnClkNum =2) parent- m_secondBtnPoint.x=m_virPoint .x ; parent-m_secondBtnPoint.y=m_virPoint.y; if(parent- FindLine(parent-m_firstBtnPoint ,

11、parent-m_secondBtnPoint)= TRUE |parent-FindOneConner(parent-m_firstBtnPoint ,parent-m_secondBtnPoint)|parent-FindTwoConner(parent-m_firstBtnPoint,parent-m_secondBtnPoint)& &(parent-mapparent-m_firstBtnPoint.xparent-m_firstBtnPoint.y= parent-mapparent-m_secondBtnPoint.xparent-m_secondBtnPoint.y) pare

12、nt-map parent-m_firstBtnPoint .x parent-m_firstBtnPoint .y=0;parent-mapparent-m_secondBtnPoint.xparent-m_secondBtnPoint.y=0; parent-m_remainBtn-=2; parent-ProcessGame();parent- m_BtnClkNum =0;parent-m_firstBtnPoint=0; parent-m_secondBtnPoint=0;else parent- m_BtnClkNum =1; parent-m_firstBtnPoint.x=pa

13、rent-m_secondBtnPoint.x;parent-m_firstBtnPoint.y=parent-m_secondBtnPoint.y; parent-m_secondBtnPoint=0; CBitmapButton:OnLButtonDown(nFlags, point); (3)主窗口构造函数CMyLLKDlg :CMyLLKDlg (CWnd* pParent/*=NULL*/ ): CDialog(CMyLLKDlg :IDD , pParent), m_ptCross1(0) m_hIcon = AfxGetApp ()-LoadIcon(IDI_LLK );m_in

14、dex=0;m_BtnClkNum =0;m_firstBtnPoint=0; m_secondBtnPoint=0;m_time=0;m_flag=0;m_NUM =10; (4) CMyLLKDlg :OnPaint()void CMyLLKDIg :OnPaint()/修改显示画面 CPaintDC dc(this);CPen * pRed Pen= newCPen;pRedPen-CreatePen(PS_SOLID, 2, RGB (255,0,0);/设置字体颜色CGdiObject *pOIdPen = dc.SelectObjec(pRedPer); 选择画笔 CFontfon

15、t;CStringstr; strFormat(”剩余时间:%d秒”,m_time);/m_time中存储剩余时间信息 fon t.CreatePoi ntFo n(150,宋体);/ 设置字体 dc.SelectObject(&font);dcSetTextColor(RGB(255,0,0);/ 设置字体颜色为红色 dcSetBkColor(RGB(0,0,0); 设背景为黑色/设置背景为透明,本例中即为黑色 TRANSPARENT dc.TextOut(500,10,str); /显示倒计时 (5) CMyLLKDlg :InitMap(int map20)void CMyLLKDlg

16、:InitMap(int map20) /初始化图片 int i,j;int x,y;int type;srand(unsignedint)time(NULL ) ) ; /随机数种子 for(i=0;iMAXX ;i+)初始化,全部置零for(j=0;jMAXY ;j+)mapij=0;for(i=1;iMAXX -1;i+)/设置各图片的类型,最外一圈不放图片 for(j=1;jMAXY -1;j+)if(mapij!=0)continue;else type=rand()%m_typeNum;/ 图片种类 mapi j=type+1;do /随机产生x、y,放置相同图片 x = rand

17、()%(MAXX -2)+1;y = rand()%(MAXY -2)+1;while (map x y ); mapxy=type+1; (6) CMyLLKDlg :ShowMap(int map20) void CMyLLKDlg :ShowMap(int map20) /显示图片 int i, j;CPoint p;CString str;for(i=0;im_bt nGroup.GetSize();i+)/ 每次开始时清除原有按钮 delete (CLLKButton *)m_btnGroup.GetAt(i);m_btnGroup.RemoveAll () ; for(i=1;i=

18、MAXX -2; i +) /添加新按钮 *12 for(j=1; j=MAXY-2; j+) p.x = i;p.y = j; m_btnGroup.Add(newCLLKButton (mapij, p);for(i=0;iCreate(str, WS_CHILD|BS_BITMAP, CRect(m_left+(i%(MAXY -2)*40, m_top+(i/(MAXY-2)*40, m_right+(i%(MAXY-2)*40, m_bottom+(i/(MAXY -2)*40),this, IDC_BLOCK +i);if (bt n-mD)如果为则不显示 str.Format(r

19、es%d.bmp, btn-m_ID);HBITMAP m_fkBmp = (HBITMAP ):LoadImage (AfxGetInstanceHandle(), str, IMAGE_BITMAP , 0, 0, LR_CREATEDIBSECTION |LR_LOADFROMFILE );/加载图片 if(m_fkBmp = NULL ) if (MessageBox ( 缺 少 图 片 资 源 !, 错 误,MB_ICONERROR|MB_OK)=IDOK)return; btn-SetBitmap(m_fkBmp ) ; btn-ShowWindow(SW_SHOW); else

20、btn-ShowWindow(SW_HIDE );(7) CMyLLKDlg :Init (void )void CMyLLKDlg : Init (void )/开始按钮点击初始化 switch(m_index)case1:MAXX =10;MAXY =15; m_left =90; m_top=90; m_right=130; m_bottom=130; m_typeNum=52; m_time=300; break;case2:MAXX =12;MAXY =17; m_left =90; m_top=90; m_right=130; m_bottom=130; m_typeNum=75;

21、 m_time=400; break;case3:MAXX =14;MAXY =19; m_left =50; m_top=50; m_right=90; m_bottom=90; m_typeNum=102; m_time=520; break;default:break; m_flag=1; m_NUM =10;m_remainBtn=(MAXX -2)*( MAXY -2);/剩余的图片数目(8) 开始按钮中三个不同等级函数void CMyLLKDIg :OnStartLow()初级 m_index=1;Init();InitMap(map);ShowMap(map);SetTimer(

22、1,1000,NULL );/开始计时void CMyLLKDIg :OnStartMid()中级 m_index=2;Init();InitMap(map);ShowMap(map);SetTimer(1,1000,NULL );/开始计时 void CMyLLKDIg :OnStartHig()高级 m_index=3;Init();InitMap(map);ShowMap(map);SetTimer(1,1000,NULL );/开始计时(9) 主流程函数void CMyLLKDIg :ProcessGam(evoid) for (int i=1;iMAXX -1;i+)for (int

23、 j=1;jShowWindow(SW_HIDE);if (m_remainBtn=0)MessageBof恭喜您完成游戏!);KiIITimer (1);(10) 查找可消去图片算法 bool CMyLLKDlg : FindLine(CPointp1, CPoint p2)判断是否可以直连 int max,min;int i;if(p1.x!=p2.x|p1.y!=p2.y)判断点击的是不是同一个点 if (p1.x=p2.x)如果是同一个同一列上的max=(p1.yp2.y)?p1.y:p2.y;min=(p1.yp2.y)?p1.y:p2.y;if (max=min+1 )/判断是否是

24、相邻的return TRUE ;for (i=mi n+1;ip2.x)?p1.x:p2.x;m i n = (p 1 .x p2.x )?p 1 .x: p2.x ;if (max=min+1) return TRUE ;for (i=min+1;ip2.y)?p1.y:p2.y;min = (p1.yp2.y)?p1.y:p2.y; for(i=min; i=max; i+) /上侧if(mapp1.x-1i!=0) line=FALSE; break;if(line) m_ptCross1.x = p1.x-1;m_ptCross1.y = p1.y;m_ptCross2.x = p1.

25、x-1;m_ptCross2.y = p2.y;returnTRUE;elsel i ne=TRUE ;for(i=min;ip2.x)?p1.x:p2.x;min = (p1.xp2.x)?p1.x:p2.x;for (i =min; i=max; i+) if(mapip1.y-1!=0) /左侧 col=FALSE;break; if (col)m_ptCross1.x = p1.x;m_ptCross1.y = p1.y-1; m_ptCross2.x = p2.x; m_ptCross2.y = p2.y-1; return TRUE; else col=TRUE;for (i =m

26、in; ip2.x)?p1.x:p2.x;minx=(p1.xp2.y)?p1.y:p2.y;miny=(p1.yp2.y)?p1.y:p2.y;CPoint m_ptCross;if(p1.x!=p2.x& p1.y!=p2.y)不同行也不同列 if (mapmi nxmaxy=O) 如果角点被消去了 m_ptCross.x=minx; m_ptCross.y=maxy;if (FindLine(p1,m_ptCross)&( FindLine(m_ptCross,p2) return TRUE;else if (mapmaxxminy=O) m_ptCross.x=maxx; m_ptCr

27、oss.y=miny;if (FindLine(p1,m_ptCross)&( FindLine(m_ptCross,p2) return TRUE; else if (mapminxminy=O) m_ptCross.x=minx; m_ptCross.y=miny;if (FindLine(p1,m_ptCross)&( FindLine(m_ptCross,p2) return TRUE;else if (mapmaxxmaxy=O) m_ptCross.x=maxx; m_ptCross.y=maxy;if (FindLine(p1,m_ptCross)&( FindLine(m_pt

28、Cross,p2) return TRUE; return false; bool CMyLLKDIg : FindTwoConner(CPoint pl, CPoint p2) int i;CPointtempPoint1=O;CPointtempPoint2=O;for (i=O;iMAXY ;i+) if (i=p1.y|i=p2.y) continue;tempPoint1.x=p1.x;tempPoint1.y=i;if (maptempPoint1.xtempPoint1.y=O) if (FindLine(tempPoint1,p1) tempPoint2.x=p2.x;temp

29、Point2.y=tempPoint1.y;if (maptempPoint2.xtempPoint2.y=O)if(FindLine(tempPoint2,tempPoint1)& FindLine (tempPoint2,p2) return TRUE;for (i=0;iMAXX ;i+) if (i = p1.x |i =p2.x)continue;tempPoint1.x=i;tempPoint1.y=p1.y;if (map tempPoint1.x tempPoint1.y=0) if (FindLine (tempPoint1,p1) tempPoint2.x =tempPoi

30、nt1.x ;tempPoint2.y=p2.y;if (map tempPoint2.x tempPoint2.y=0) if(FindLine(tempPoint2,tempPoint1)& FindLine (tempPoint2,p2) return TRUE;return FALSE; (11) 定时器函数void CMyLLKDlg :OnTimer(UINT_PTR nIDEvent)m_time-;if (m_time=0) KillTimer (1);MessageBof时间到了,游戏失败!请重新开始!);m_flag =0;for (int i=1;iMAXX -1;i+) for (intj=1;jMAXY -1;j+)mapi j=0 ;ProcessGame();InvalidateRect(CRect(450,5,750,60);CDialog:OnTimer(nIDEvent);(12) 点击提示一下 按钮响应函数void CMyLLKDIg :OnHelp() if (m_flag) if (m_NUM )m_NUM -;if(FindHeIp()ProcessGame();eIseMessageBof

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论