还剩35页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
课程设计报告课程名称面向对象程序设计C++设计题目连连看游戏专业计算机科学与技术姓名学号指导教师李晓虹2016年1月1日系统需求分析本程序是一款连连看游戏,该程序应该具备以下功能该游戏界面为黑色背景加方格图片类型,不同的图片上有不同的图案,位置为随机打乱游戏规则为将相同图案的图片进行连接,但需满足只能至少单边无阻呈直线连接,否则无效一旦成功连接两个相同的图案,则这两个图案消失,如此反复直到所有的图片消失,游戏通关图片的位置具有随机性,但要求都是必须成对出现
1.1功能需求
(1)主界面需求显示玩家当前关卡数及得分数提供“新游戏”按钮,单击后可以重新开始游戏提供“退出”按钮,单击后可以退出程序提供“帮助”按钮,单击后可以弹出制作人信息,联系方式等
(2)消除需求玩家点击图案,图案会变色以提示被选中;此时再点击另一个图案,如果图案相同,则这两个图案消失;此外,两个图案中间必须无其他图片阻碍才有效,消除规则如下直线相连图1-1两条直线相连图1-2三条直线相连图1-3
(3)新游戏需求当玩家点击新游戏按钮时,游戏将重新生成新的图案并重排,且重排的方式是随机的
(4)帮助当玩家点击帮助时,将弹出制作者信息以及秘籍
(5)退出点击退出按钮,将退出程序
1.2时间性能需求响应速度3秒以内客户端可执行文件,点开即可运行,方便快捷
1.3界面友好需求系统提供统一的界面操作方式要求界面操作方式美观大方,布局合理,功能完善,整个操作简单,对于初级用户容易上手良好的操作界面可以给游戏玩家带来更好地游戏体验和愉悦的心情复杂的游戏界面会造成玩家的负担,所以在设计程序时,功能以及各种操作都应当尽量简单明了
1.4系统可用性需求系统操作快捷,内容完整是保证用户进行使用的基础因此,应准确而详细的理解各用户区的特征,任务和使用环境,在“有效性”、“效率”等各个方面满足各类用户对系统的需要系统总体设计
2.1总体系统图此系统是运用VC++
6.0中MFC框架的多文档视图开发的,文档--视图结构提供的应用程序接口有利于进行窗口操作编程此游戏引擎包含在视图类中有时引擎和视图是一体的,并且可能无可避免,因为视图需要为引擎处理用户输入和绘图游戏程序设计一般都采用面向对象的设计模式,WindowsAPI提供了一个简单的图像显示接口,利用MFC的多文档视图结构的面向对象设计模式此系统的总体系统图如下连连看游戏游戏玩家界面显示菜单功能模块图像处理模块鼠标操作命令Windows操作系统Vc++
6.0平台API接口和c++图2-1 系统功能图
2.2功能模块总体设计1鼠标操作模块 玩家在玩游戏时需要运用鼠标与游戏系统进行交互实现是运用MFC中的鼠标事件触发的.鼠标进行交互的事件主要有两个,一个是用户点击游戏场景中的图片时触发的事件另外一种是用户点击菜单栏上的菜单按钮时说触发的鼠标事件 当用户点击游戏场景中的图像块时就会响应鼠标的OnLButtonDown事件当用户点击菜单栏上的菜单命令时就会触发相应的菜单命令对应的相应的事件 2图像处理模块 程序运行后,用户通过游戏菜单的新游戏命令开始进入游戏,在这个模块里要把资源文件中的图片进行处理然后加载到游戏场景中程序中是通过DrawMap方法实现的其中用到的API函数主要是是BitBlt,他的主要功能是将某一内存块的数据传送到另一内存块3 菜单模块 玩家在游戏游戏过程中随时可以通过选择不同的菜单命令来进行相应的操作,菜单的制作是通过MFC框架中多文档程序的菜单栏来添加的,菜单包含一下几个部分:1游戏菜单中的新游戏和退出命令2帮助菜单里面的关于连连看命令 4界面显示模块 游戏场景中界面的显示包括以下部分游戏的关卡数、目前的分数、游戏主场景这些显示信息会随着游戏的进行而动态改变整个连连看游戏的系统是在VC++
6.0开发环境中进行开发的,开发过程中大量的使用了微软提供的API接口方法,减少了程序代码的编写量、提高了编程效率
3.系统详细设计
3.1各个功能实现菜单系统游戏帮助退出新游戏图3-1 菜单系统
3.2连连看消去算法实现 在检验两个方块能否消掉的时候,我们要让两个方块同时满足两个条件才行,就是两者配对并且连线成功 分3种情况从下面的这三种情况,我们可以知道,需要三个检测,这三个检测分别检测一条直路经这样就会有三条路经若这三条路经上都是空按钮,那么就刚好是三种直线(两个转弯点)把两个按钮连接起来了 *
1.相邻 *
2. 若不相邻的先在第一个按钮的同行找一个空按钮
1.找到后看第二个按钮横向到这个空按钮所在的列是否有按钮
2.没有的话再看第一个按钮到与它同行的那个空按钮之间是否有按钮
3.没有的话,再从与第一个按钮同行的那个空按钮竖向到与第二个按钮的同行看是否有按钮没有的话路经就通了可以消了. *
3.若2失败后,再在第一个按钮的同列找一个空按钮
1.找到后看第二个按钮竖向到这个空按钮所在的行是否有按钮
2.没有的话,再看第一个按钮到与它同列的那个空按钮之间是否有按钮
3.没有的话,再从与第一个按钮同列的那个空按钮横向到与第二个按钮同列看是否有按钮没有的话路经就通了,可以消了 * 若以上三步都失败,说明这两个按钮不可以消去系统调试和测试
4.1系统调试本系统调试过程中遇到问题,原因和解决方法如下
4.
1.1信息显示错误在整个游戏界面上方是游戏过程总的必要信息的显示,比如关卡,积分等在这些数据更新时出现的模糊问题是因为没有写入必要的刷新函数造成的,其实在这样的图形编程问题的刷新函数是必不可少的,在适当的位置加入刷新函数即可保持图形图像的正确显示
4.
1.2音乐音效不能正常播放这样的问题是容易遇到的,总结原因有两点
(1)资源文件的ID以及资源文件的文件名问题由于资源文件很多,很容易将这些文件混淆,当资源文件引入工程之后就不可再改动了
(2)文件格式的问题不同的音乐文件有不同的播放格式
4.
1.3游戏程序不能再其他机器上运行编写完成的程序要进行推广,这个问题是一定要解决的制作好的游戏程序必须要附有必要的软件以及详细的使用方法由于VC++
6.0环境文件体积比较大,拷贝不容易,所以拷贝过程中必须要附带必要的库文件或者直接编译程Release版本在拷贝给其他的玩家
4.2系统测试测试过程如下首先运行程序,可以测试游戏的初始化是否有问题包括界面的显示问题,位置是否正确,是否表达到了自己所预想的目的然后再初级,中级,高级之间来回切换,用测试游戏的随机性小方块的分布有没有存在问题然后对于提示和重排进行连续使用,观察上方信息的显示基本无误,必要的提示也及时弹出游戏的每一个功能都要进行检查,而且要进行反复使用才可能发现潜在的问题至此,以上,对于图形的现实问题基本检查完毕之后自己进行游戏若干次,每一级的所有小方块都能完全消除,这说明小方块是成对出现的,随机性也是没有错误的,在游戏结束后弹出提示输入姓名,输入姓名后将此次游戏的得分自动保存到积分榜,查看积分榜,对应以前的分数也能够大小顺序排列测试过程表明此游戏程序功能基本正常,运行过程基本没有问题结果分析
1.游戏主界面图5-1游戏主界面图点击游戏程序图标,可以正常启动游戏,出现以上的主界面菜单栏有两个菜单选项,点击可以触发相应的功能开始游戏界面图5-2游戏开始界面图点击游戏菜单项,选择新游戏按钮,即可开始游戏界面将出现当前游戏的级别、关重列剩余次数以及提示剩余次数等相关游戏信息图5-3游戏中界面图
4.游戏成功界面总结通过此次c++课程设计,我更加扎实的掌握了有关c++开发软件的知识,虽然在设计过程中遇到了一些问题,但正是这些问题让我学会了如何思考,如何通过利用身边的网络资源以及书籍来解决也暴露出了前期我在这方面的知识欠缺和经验不足,但也学会在问题中不断完善自己的专业知识能力,弥补不足同时让我明白一个道理,实践出真知,只有通过自己的亲自动手制作,才能真正的掌握已学到的知识此次课程设计,从理论到实践,可以说得是苦多于甜,但是可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力在设计的过程中遇到问题,可以说得是困难重重,但可喜的是最终都得到了解决这也让我对自己的能力有了更大的肯定,让我以后无论是生活还是学习中都有更大的信心和干劲附录 主要程序代码linkView.cpp//linkView.cpp:implementationoftheCLinkViewclass//#includestdafx.h#includelink.h#includelinkDoc.h#includelinkView.h#includewindows.h#ifdef_DEBUG#definenewDEBUG_NEW#undefTHIS_FILEstaticcharTHIS_FILE[]=__FILE__;#endif///////////////////////////////////////////////////////////////////////////////CLinkViewIMPLEMENT_DYNCREATECLinkViewCViewBEGIN_MESSAGE_MAPCLinkViewCView//{{AFX_MSG_MAPCLinkViewON_WM_LBUTTONDOWNON_WM_PAINTON_WM_ERASEBKGNDON_WM_MOUSEMOVEON_WM_CHARON_WM_CANCELMODE//}}AFX_MSG_MAPEND_MESSAGE_MAP///////////////////////////////////////////////////////////////////////////////CLinkViewconstruction/destructionCLinkView::CLinkView{//TODO:addconstructioncodehere}CLinkView::~CLinkView{}BOOLCLinkView::PreCreateWindowCREATESTRUCTcs{//TODO:ModifytheWindowclassorstylesherebymodifying//theCREATESTRUCTcsreturnCView::PreCreateWindowcs;}///////////////////////////////////////////////////////////////////////////////CLinkViewdrawingvoidCLinkView::OnDrawCDC*pDC{CLinkDoc*pDoc=GetDocument;ASSERT_VALIDpDoc;//TODO:adddrawcodefornativedatahere}///////////////////////////////////////////////////////////////////////////////CLinkViewdiagnostics#ifdef_DEBUGvoidCLinkView::AssertValidconst{CView::AssertValid;}voidCLinkView::DumpCDumpContextdcconst{CView::Dumpdc;}CLinkDoc*CLinkView::GetDocument//non-debugversionisinline{ASSERTm_pDocument-IsKindOfRUNTIME_CLASSCLinkDoc;returnCLinkDoc*m_pDocument;}#endif//_DEBUG//声明外部变量theAppexternCLinkApptheApp;//进入新的关卡voidNewStageCDC*pDC{srandtime0;intij;fori=0;ileny;++iforj=0;jlenx;++jtheApp.PicArray[i][j].visible=false;intxy;//每关出现lenx种图形,每种图形各有leny个,本程序中lenx=10,leny=8fori=0;ilenx-1;++i{forj=0;jleny;++j{boolre=true;whilere{y=rand%leny;x=rand%lenx;iftheApp.PicArray[y][x].visible==false{theApp.PicArray[y][x].type=i;theApp.PicArray[y][x].visible=true;theApp.PicArray[y][x].x=x;theApp.PicArray[y][x].y=y;re=false;}}}}fori=0;ileny;++i//剩下最后一种图片就不用随机了forj=0;jlenx;++jiftheApp.PicArray[i][j].visible==false{theApp.PicArray[i][j].type=lenx-1;theApp.PicArray[i][j].visible=true;theApp.PicArray[i][j].x=j;//千万注意对应关系!!theApp.PicArray[i][j].y=i;}CStringstr;str.Format您的得分是%u共%d关,现在是第%d关theApp.scoretotalStagetheApp.stage;pDC-TextOut15015str;theApp.PaintPicturepDC;}/*在图片a与图片b间画线*CClientDCdc为当前的dc*/voiddraw_linepictureapicturebCClientDCdc//CClientDC类不能作按值传递参数{CPointp1theApp.margin+a.x*64+64/2theApp.margin+a.y*64+64/2;CPointp2theApp.margin+b.x*64+64/2theApp.margin+b.y*64+64/2;dc.MoveTop1;dc.LineTop2;}//将图片a从当前窗口中抹去voidpaint_blackpictureaCDC*pDC{CBrushbackBrushRGB000;CBrush*pOldBrush=pDC-SelectObjectbackBrush;CRectrect;pDC-GetClipBoxrect;pDC-PatBlttheApp.margin+width*a.xtheApp.margin+width*a.ywidthwidthPATCOPY;pDC-SelectObjectpOldBrush;}//判断图片a与图片b能否直接相连(a、b间连线的转角数为0)boolmatch_directpictureapicturebCClientDCdc{//a、b的x或y坐标必须有且只有一个相同才能直接相连if!a.x==b.x||a.y==b.yreturnfalse;//判断a、b间是否有其他图片阻隔inti;boolmatch_x=false;ifa.x==b.x{match_x=true;ifa.yb.yfori=a.y-1;ib.y;--iiftheApp.PicArray[i][a.x].visible==truematch_x=false;ifb.ya.yfori=b.y-1;ia.y;--iiftheApp.PicArray[i][a.x].visible==truematch_x=false;}boolmatch_y=false;ifa.y==b.y{match_y=true;ifa.xb.xfori=a.x-1;ib.x;--iiftheApp.PicArray[a.y][i].visible==truematch_y=false;ifb.xa.xfori=b.x-1;ia.x;--iiftheApp.PicArray[a.y][i].visible==truematch_y=false;}ifmatch_x||match_y{//draw_lineabdc;//不能写在这里,否则match_one_corner会不正常returntrue;}returnfalse;}//判断a、b间能否通过只有一个转角的折线相连boolmatch_one_cornerpictureapicturebCClientDCdc{iftheApp.PicArray[b.y][a.x].visible==false\match_directatheApp.PicArray[b.y][a.x]dc\match_directbtheApp.PicArray[b.y][a.x]dc{draw_lineatheApp.PicArray[b.y][a.x]dc;draw_linebtheApp.PicArray[b.y][a.x]dc;returntrue;}iftheApp.PicArray[a.y][b.x].visible==false\match_directatheApp.PicArray[a.y][b.x]dc\match_directbtheApp.PicArray[a.y][b.x]dc{draw_lineatheApp.PicArray[a.y][b.x]dc;draw_linebtheApp.PicArray[a.y][b.x]dc;returntrue;}returnfalse;}//判断a、b能否通过有2个转角的折线相连boolmatch_two_cornerpictureapicturebCClientDCdc{inti;//转化为a与c能直接相连,而c与b可以通过有一个转角的折线相连的情况fori=a.x-1;i=0;--iiftheApp.PicArray[a.y][i].visible==truebreak;elseifmatch_one_cornertheApp.PicArray[a.y][i]bdc{draw_lineatheApp.PicArray[a.y][i]dc;returntrue;}fori=a.x+1;ilenx;++iiftheApp.PicArray[a.y][i].visible==truebreak;elseifmatch_one_cornertheApp.PicArray[a.y][i]bdc{draw_lineatheApp.PicArray[a.y][i]dc;returntrue;}fori=a.y-1;i=0;--iiftheApp.PicArray[i][a.x].visible==truebreak;elseifmatch_one_cornertheApp.PicArray[i][a.x]bdc{draw_lineatheApp.PicArray[i][a.x]dc;returntrue;}fori=a.y+1;ileny;++iiftheApp.PicArray[i][a.x].visible==truebreak;elseifmatch_one_cornertheApp.PicArray[i][a.x]bdc{draw_lineatheApp.PicArray[i][a.x]dc;returntrue;}returnfalse;}//判断a与b能否相连(条件a与b类型相同,且能用转角不超过3个的折线相连boolmatchpictureapicturebCClientDCdc{ifa.type!=b.typereturnfalse;//直接相连ifmatch_directabdc{draw_lineabdc;Sleep500;//连线在窗口中显示
0.5s后消失forinti=0;ileny;++iforintj=0;jlenx;++jiftheApp.PicArray[i][j].visible==falsepaint_blacktheApp.PicArray[i][j]dc;returntrue;}//通过一个或两个转角相连的情况ifmatch_one_cornerabdc||match_two_cornerabdc{Sleep500;forinti=0;ileny;++iforintj=0;jlenx;++jiftheApp.PicArray[i][j].visible==falsepaint_blacktheApp.PicArray[i][j]dc;returntrue;}returnfalse;}//点击左键时判断前后点击的图片能否消去voidCLinkView::OnLButtonDownUINTnFlagsCPointpoint{ifpoint.x=theApp.margin||point.y=theApp.margin||\point.x=theApp.margin+lenx*width||point.y=theApp.margin+leny*widthreturn;intx=point.x-theApp.margin/width;inty=point.y-theApp.margin/width;intPx=theApp.PreClick.x-theApp.margin/width;intPy=theApp.PreClick.y-theApp.margin/width;//设置画笔的属性,并关联到dcCClientDCdcthis;intpenWidth=5;CPenpenPS_SOLIDpenWidthRGB25500;dc.SelectObjectpen;ifx==Pxy==Py//前后两次点击的是同一张图片return;elseifPx0||Py0//这是第一次点击的情况return;elseiftheApp.PicArray[y][x].visible==true\theApp.PicArray[Py][Px].visible==true\theApp.PicArray[y][x].type==theApp.PicArray[Py][Px].type\matchtheApp.PicArray[y][x]theApp.PicArray[Py][Px]dc{theApp.PicArray[y][x].visible=false;theApp.PicArray[Py][Px].visible=false;CDC*pDC=GetDC;paint_blacktheApp.PicArray[y][x]pDC;paint_blacktheApp.PicArray[Py][Px]pDC;theApp.score+=10;CStringstr;str.Format您的得分是%u共%d关,现在是第%d关theApp.scoretotalStagetheApp.stage;pDC-TextOut15015str;theApp.remain_num-=2;iftheApp.remain_num==0//剩余图片数为0,则通关{theApp.score+=theApp.stage*100;CStringstr;str.Format您的得分是%u共%d关,现在是第%d关theApp.scoretotalStagetheApp.stage;pDC-TextOut15015str;iftheApp.stage==totalStageMessageBox你已经成功完成所有关卡!!恭喜!!MB_OK;else{MessageBox成功完成游戏!下面进行下一关!恭喜!!MB_OK;theApp.remain_num=lenx*leny;theApp.stage++;NewStagepDC;}}ReleaseDCpDC;}theApp.PreClick=point;}//重画黑色的背景BOOLCLinkView::OnEraseBkgndCDC*pDC{//设置brush为希望的背景颜色CBrushbackBrushRGB000;//保存旧的brushCBrush*pOldBrush=pDC-SelectObjectbackBrush;CRectrect;pDC-GetClipBoxrect;//画需要的区域pDC-PatBltrect.leftrect.toprect.Widthrect.HeightPATCOPY;pDC-SelectObjectpOldBrush;returnTRUE;}//最小化后再次恢复窗口时,需要重画窗口voidCLinkView::OnPaint{CPaintDCdcthis;CDC*pDC=GetDC;theApp.PaintPicturepDC;ReleaseDCpDC;}//鼠标移动时,经过的的图片要变色voidCLinkView::OnMouseMoveUINTnFlagsCPointpoint{//在图片范围内ifpoint.xtheApp.marginpoint.ytheApp.margin\point.xtheApp.margin+width*lenxpoint.ytheApp.margin+width*leny{CDC*pDC=GetDC;//重画所有图片,主要是为了将上次经过的变色的图片恢复正常状态theApp.PaintPicturepDC;inti=point.x-theApp.margin/width;intj=point.y-theApp.margin/width;iftheApp.PicArray[j][i].visible==true{//鼠标经过的图片要变色CBitmapbitmap3;bitmap
3.LoadBitmap171+theApp.stage;//171是第一张变色图片的资源号CDCdcCompatible3;dcCompatible
3.CreateCompatibleDCpDC;dcCompatible
3.SelectObjectbitmap3;pDC-BitBlttheApp.margin+i*widththeApp.margin+j*widthwidthwidthdcCompatible30theApp.PicArray[j][i].type*widthSRCCOPY;//将鼠标指向的图片画到右边的空白处,图片下面显示说明文字CBitmapbitmap4;bitmap
4.LoadBitmap191+theApp.stage;//191是第一张正常图片的资源号CDCdcCompatible4;dcCompatible
4.CreateCompatibleDCpDC;dcCompatible
4.SelectObjectbitmap4;pDC-BitBlttheApp.margin+width*lenx+widththeApp.margin+widthwidthwidthdcCompatible40theApp.PicArray[j][i].type*widthSRCCOPY;pDC-TextOuttheApp.margin+width*lenx+widththeApp.margin+width*2theApp.pic_info[theApp.stage-1][theApp.PicArray[j][i].type];}ReleaseDCpDC;}}voidCLinkView::OnCharUINTnCharUINTnRepCntUINTnFlags{ifnChar==1{CDC*pDC=GetDC;CStringstr;str.Format您的得分是%u共%d关,现在是第%d关theApp.scoretotalStagetheApp.stage;pDC-TextOut15015str;iftheApp.stagetotalStageMessageBox你已经成功完成所有关卡!!恭喜!!MB_OK;else{MessageBox您使用了秘籍,直接进入下一关!提示MB_OK;theApp.remain_num=lenx*leny;theApp.stage++;NewStagepDC;str.Format您的得分是%u共%d关,现在是第%d关theApp.scoretotalStagetheApp.stage;pDC-TextOut15015str;}ReleaseDCpDC;}}voidCLinkView::OnCancelMode{CView::OnCancelMode;}Link.cpp//link.cpp:Definestheclassbehaviorsfortheapplication.//#includestdafx.h#includelink.h#includeMainFrm.h#includelinkDoc.h#includelinkView.h#includewindows.h#ifdef_DEBUG#definenewDEBUG_NEW#undefTHIS_FILEstaticcharTHIS_FILE[]=__FILE__;#endif///////////////////////////////////////////////////////////////////////////////CLinkAppBEGIN_MESSAGE_MAPCLinkAppCWinApp//{{AFX_MSG_MAPCLinkAppON_COMMANDID_APP_ABOUTOnAppAbout//NOTE-theClassWizardwilladdandremovemappingmacroshere.//DONOTEDITwhatyouseeintheseblocksofgeneratedcode!//}}AFX_MSG_MAP//StandardfilebaseddocumentcommandsON_COMMANDID_FILE_NEWCWinApp::OnFileNewON_COMMANDID_FILE_OPENCWinApp::OnFileOpenEND_MESSAGE_MAP///////////////////////////////////////////////////////////////////////////////CLinkAppconstructionCLinkApp::CLinkApp{}CLinkApptheApp;#includemmsystem.h#pragmacommentlibwinmm.libDWORDWINAPIPlay_SoundLPVOIDlpParameter{charbuf
[128];MCI_OPEN_PARMSmciOpen;MCIERRORmciError;mciOpen.lpstrDeviceType=mpegvideo;//mciOpen.lpstrElementName是constchar*类型的指针,这样赋值很麻烦!!chartemp
[50];strcpytemptheApp.file_path;mciOpen.lpstrElementName=temp;mciError=mciSendCommand0MCI_OPENMCI_OPEN_TYPE|MCI_OPEN_ELEMENTDWORDmciOpen;ifmciError{mciGetErrorStringmciErrorbuf128;return0;}UINTDeviceID=mciOpen.wDeviceID;MCI_PLAY_PARMSmciPlay;mciError=mciSendCommandDeviceIDMCI_PLAYMCI_WAITDWORDLPMCI_PLAY_PARMSmciPlay;ifmciError{mciGetErrorStringmciErrorbuf128;return0;}return0;}BOOLCLinkApp::InitInstance{AfxEnableControlContainer;//记录前一次点击的坐标PreClick.x=-1;PreClick.y=-1;margin=50;remain_num=lenx*leny;score=0;stage=1;strcpyfile_pathsound\\welcome.mp3;//背景音乐的路径#ifdef_AFXDLLEnable3dControls;//CallthiswhenusingMFCinasharedDLL#elseEnable3dControlsStatic;//CallthiswhenlinkingtoMFCstatically#endif//Changetheregistrykeyunderwhichoursettingsarestored.//TODO:Youshouldmodifythisstringtobesomethingappropriate//suchasthenameofyourcompanyororganization.SetRegistryKey_TLocalAppWizard-GeneratedApplications;LoadStdProfileSettings;//LoadstandardINIfileoptionsincludingMRU//Registertheapplicationsdocumenttemplates.Documenttemplates//serveastheconnectionbetweendocumentsframewindowsandviews.CSingleDocTemplate*pDocTemplate;pDocTemplate=newCSingleDocTemplateIDR_MAINFRAMERUNTIME_CLASSCLinkDocRUNTIME_CLASSCMainFrame//mainSDIframewindowRUNTIME_CLASSCLinkView;AddDocTemplatepDocTemplate;//ParsecommandlineforstandardshellcommandsDDEfileopenCCommandLineInfocmdInfo;ParseCommandLinecmdInfo;//Dispatchcommandsspecifiedonthecommandlineif!ProcessShellCommandcmdInforeturnFALSE;//Theoneandonlywindowhasbeeninitializedsoshowandupdateit.m_pMainWnd-ShowWindowSW_SHOW;m_pMainWnd-UpdateWindow;m_pMainWnd-SetWindowText_Twar3连连看;//设置标题theApp.hThread=::CreateThreadNULL0Play_SoundNULL0NULL;returnTRUE;}voidCLinkApp::PaintPictureCDC*pDC{CBitmapbitmap;bitmap.LoadBitmap191+stage;CDCdcCompatible;dcCompatible.CreateCompatibleDCpDC;dcCompatible.SelectObjectbitmap;HWNDhwnd=GetActiveWindow;CRectrect;GetClientRecthwndrect;intij;fori=0;ileny;++iforj=0;jlenx;++j{ifPicArray[i][j].visible==truepDC-BitBlttheApp.margin+j*widththeApp.margin+i*widthwidthwidthdcCompatible0PicArray[i][j].type*widthSRCCOPY;}}///////////////////////////////////////////////////////////////////////////////CAboutDlgdialogusedforAppAboutclassCAboutDlg:publicCDialog{public:CAboutDlg;//DialogData//{{AFX_DATACAboutDlgenum{IDD=IDD_ABOUTBOX};//}}AFX_DATA//ClassWizardgeneratedvirtualfunctionoverrides//{{AFX_VIRTUALCAboutDlgprotected:virtualvoidDoDataExchangeCDataExchange*pDX;//DDX/DDVsupport//}}AFX_VIRTUAL//Implementationprotected://{{AFX_MSGCAboutDlg//Nomessagehandlers//}}AFX_MSGDECLARE_MESSAGE_MAP};CAboutDlg::CAboutDlg:CDialogCAboutDlg::IDD{//{{AFX_DATA_INITCAboutDlg//}}AFX_DATA_INIT}voidCAboutDlg::DoDataExchangeCDataExchange*pDX{CDialog::DoDataExchangepDX;//{{AFX_DATA_MAPCAboutDlg//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAPCAboutDlgCDialog//{{AFX_MSG_MAPCAboutDlg//Nomessagehandlers//}}AFX_MSG_MAPEND_MESSAGE_MAP//AppcommandtorunthedialogvoidCLinkApp::OnAppAbout{CAboutDlgaboutDlg;aboutDlg.DoModal;}///////////////////////////////////////////////////////////////////////////////CLinkAppmessagehandlersMainform.cpp//MainFrm.cpp:implementationoftheCMainFrameclass//#includestdafx.h#includelink.h#includeMainFrm.h#includeHtmlHelp.h//打开chm帮助文件#ifdef_DEBUG#definenewDEBUG_NEW#undefTHIS_FILEstaticcharTHIS_FILE[]=__FILE__;#endif///////////////////////////////////////////////////////////////////////////////CMainFrameIMPLEMENT_DYNCREATECMainFrameCFrameWndBEGIN_MESSAGE_MAPCMainFrameCFrameWnd//{{AFX_MSG_MAPCMainFrameON_COMMANDID_New_GameOnNewGameON_COMMANDID_APP_ABOUTOnAppAbout//}}AFX_MSG_MAPEND_MESSAGE_MAP///////////////////////////////////////////////////////////////////////////////CMainFrameconstruction/destructionCMainFrame::CMainFrame{//TODO:addmemberinitializationcodehere}CMainFrame::~CMainFrame{}BOOLCMainFrame::PreCreateWindowCREATESTRUCTcs{//设置窗口的属性cs.cx=900;//窗口的宽度cs.cy=700;//窗口的高度cs.x=0;//窗口的位置,x轴cs.y=0;//窗口位置,y轴if!CFrameWnd::PreCreateWindowcsreturnFALSE;//TODO:ModifytheWindowclassorstylesherebymodifying//theCREATESTRUCTcsreturnTRUE;}///////////////////////////////////////////////////////////////////////////////CMainFramediagnostics#ifdef_DEBUGvoidCMainFrame::AssertValidconst{CFrameWnd::AssertValid;}voidCMainFrame::DumpCDumpContextdcconst{CFrameWnd::Dumpdc;}#endif//_DEBUGexternCLinkApptheApp;#includefstream#includestring#includeiostreamusingnamespacestd;//新建游戏voidCMainFrame::OnNewGame{srandtime0;intij;fori=0;ileny;++iforj=0;jlenx;++jtheApp.PicArray[i][j].visible=false;intxy;fori=0;ilenx-1;++i{forj=0;jleny;++j{boolre=true;whilere{x=rand%lenx;y=rand%leny;iftheApp.PicArray[y][x].visible==false{theApp.PicArray[y][x].type=i;theApp.PicArray[y][x].visible=true;theApp.PicArray[y][x].x=x;theApp.PicArray[y][x].y=y;re=false;}}}}fori=0;ileny;++iforj=0;jlenx;++jiftheApp.PicArray[i][j].visible==false{theApp.PicArray[i][j].type=lenx-1;theApp.PicArray[i][j].visible=true;theApp.PicArray[i][j].x=j;theApp.PicArray[i][j].y=i;}theApp.PreClick.x=-1;theApp.PreClick.y=-1;theApp.score=0;theApp.stage=1;CDC*pDC=GetDC;theApp.PaintPicturepDC;CStringstr;str.Format您的得分是%u共%d关,现在是第%d关theApp.scoretotalStagetheApp.stage;pDC-TextOut15015str;stringtemp;ifstreaminputpicture_introduction.txtios::in;input.seekg0;ifinput==NULL{MessageBox打开图片介绍文本失败!错误MB_OK;return;}//在picture_introduction.txt中读入图片的介绍信息inttotal_num=lenx*totalStage;CStringmessage;i=0;whileitotal_num{inputtemp;CStringt;t.Format%stemp;if!temp.emptytemp
[0]!=#{theApp.pic_info[i/lenx][i%lenx].Format%-18stemp.c_str;++i;}temp=;}ReleaseDCpDC;}//显示chm帮助文档voidCMainFrame::OnAppAbout{ShellExecuteNULLopenhelp.chmNULLNULLSW_SHOWNORMAL;//打开指定的文件}。