还剩27页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
盐城工学院程序设计实践报告段佳雯学院信息工程专业计算机科学与技术班级Z111学号1160704108学生姓名段佳雯课程成绩完成日期2014-1-16目录TOC\o1-3\h\z\u1引言
11.1课程设计目的
11.2__工具的介绍12概要设计
22.1系统总体分析
22.2主模块涉及的基本概念及说明23详细设计
73.1主要的函数和定义说明
73.1调试成果及讲解165心得体会20____21附录…………………………………………………………………………………………………………22打地鼠游戏程序设计1引言本程序设计实践是采用C++语言,在VC平台下设计本课程设计提供了__实践的机会,将课本上的理论知识和实际有机的结合起来,充分的锻炼分析解决实际问题的能力提高了适应实际,实践编程的能力
1.1课程设计目的程序设计实践主要是培养学生利用系统综合C++语言进行程序设计的能力
(1)进一步巩固和复习C++程序设计的基础知识
(2)培养结构化程序、模块化程序设计的方法和能力
(3)了解软件的编制过程及各环节的具体内容
(4)提高程序调试技巧、软件设计能力和代码规范化等素质
(5)提高分析问题、解决问题以及实际运用能力
(6)功能要求基本要求设计的系统界面要美观大方,操作合理,有必要的提示创新要求在基本要求达到后,进行创新设计对系统进行功能模块分析、控制流程分析正确系统设计要实用,编程简练,可用,功能全面,并有一定的容错能力说明书、流程图要清楚要求程序设计合理,用户界面良好,如采用菜单工作方式
1.2__工具的介绍关于VisualC++VisualC++
6.0是Microsoft公司在1998年推出的基于Windows9X和WindowsNT的优秀集成__环境该环境为用户提供了良好的可视化编程环境,程序员可以里利用该__环境轻松地访问C++源代码编辑器,资源编辑器和使用内部调试器,并且可以创建项目文件VisualC++
6.0不仅包括编译器,而且它还包括许多有用组件,通过这些组件的协同工作,可以在VisualC++
6.0集成环境中轻松地完成创建源文件,编辑资源,以及对程序的编译,连接和调试等各项工作VC++
6.0是Windows95/
98、XP或WindowsNT下的一个应用程序,本身对软硬件没有特殊要求就是说它对环境的要求与Windows95/
98、WindowsNT要求是一致的硬件要求一般在___以上的处理器、16MB以上内存、100MB以上的硬盘软件要求Windows95/98或WindowsNT
3.51以上版本VC++
6.0系统可以在一张CD盘上,也可以在“VisualStudioVisualC++、VisualFoxpro”等产品的第一张CD盘上一般都有一个VC的自动__程序,也可以执行VC6目录下的setup.exe,在__包的提示下进行,对初学者可采用“典型__”方式在__好VC
6.0系统后,有时根据需要添加或删除某些部件,可插入CD盘重新执行setup.exe__程序,__程序会检测当前系统__VC6的足件,用户单击“添加/删除”按钮后,在“__维护”对话框中选定要添加的部件或撤消选定要删除的部件与一般的应用软件一样,有以下两种启动方式1通过“开始”按钮,选择“程序”菜单,然后打开“MicrosoftVisualstudio
6.0中文版”子菜单中的“MicrosoftVisualC++
6.0中文版”程序2用户也可以使用命令行启动VC单击“开始”按钮后选择“运行”命令,在“运行”对话框中输入c:\ProgramFiles\MicrosoftVisualStudio\VC98\VC
6.exe(按默认盘符和路径__)即可
1.3功能说明打地鼠是一种非常有趣的益智游戏游戏进行时,地鼠会不断从洞口探出头来再缩回去,地鼠头在洞外时,可以通过案件的方式打击地鼠,时间到时游戏结束,打中地鼠次数越多分数越高,打中红色地鼠会减分,灰色地鼠分数比棕色地鼠分数低打破记录可以刷新成绩__鼠标左键可以打击地鼠2概要设计
2.1系统总体分析__环境MicrosoftWindowsXPTA__
2.2主模块涉及的基本概念及说明
2.
2.1Message消息机制在Windows中发生的一切都可以用消息来表示,消息用于告诉操作系统发生了什么,所有的Windows应用程序都是消息驱动的一个消息是由消息的名称UINT和两个参数(WPARAMLPARAM)组成消息的参数中包含有重要的信息主要包括程序核心,输入焦点,消息分类,消息队列,消息循环,消息分类一个消息由一个消息名称(UINT),和两个参数(WPARAM,LPARAM)组成本设计中主要用Msg来调用Messagebox里的消息从而来实现鼠标__实现功能的操作例如对鼠标消息而言,LPARAM中一般包含鼠标的位置信息Msg变量是型态为MSG的结构当鼠标在某个窗口内__时,Windows会不断地发出鼠标__消息WM_MOUSEMOVE,并把鼠标的最新位置传给该窗口如果在窗口的范围内按下鼠标左键,系统就会发出“按下左键”的WM_LBUTTONDOWN消息给该窗口,等到用户放开按键后,再发出“放开左键”的WM_LBUTTONUP消息给该窗口消息可以看做是一个动作操作系统把消息给封装成结构本设计中主要用WindowFunc函数来调用消息循环Windows为当前执行的每个Windows程序维护一个消息队列在发生输入__之后,Windows将__转换为一个消息并将消息放入程序的消息队列中程序通过执行一块称之为消息循环的程序代码从消息队列中取出消息本程序中在时钟运行里运用到了消息循环例while1{ifPeekMessagemsgNULL00PM_NOREMOVE//消息循环{if!GetMessagemsgNULL00//接收消息{returnmsg.wParam;}TranslateMessagemsg;//翻译消息DispatchMessagemsg;//处理消息}elseifbActive{UpdateFrame;}else{WaitMessage;}}KillTimerhwnd1;//时钟停止returnmsg.wParam;}消息循环的过程如图1—1所示图1-1在程序的时钟里也运用到了消息队列的思想消息队列就是Windows中有一个系统消息队列,对于每一个正在执行的Windows应用程序系统为其建立一个“消息队列”,即应用程序队列,用来存放该程序可能创建的各种窗口的消息应用程序中含有一段称作“消息循环”的代码,用来从消息队列中检索这些消息并把它们分发到相应的窗口函数中在消息循环中没有消息的话就排队等待没有消息就创建空传消息
2.
2.2DirectDrawDirectDraw是通过基于COM的接口提供服务在DirectX
5.0版本中,这些接口分别是IDirectDraw
2、IDirectDrawSu_____
3、IDirectDrawPalette、IDirectDrawClipper和IDirectDrawVideoPortDirectX的这些组件是向下兼容的,它们仍然支持旧版本中的所有功能DirectDraw是DirectX中的关于视频输入输出的基本部分,使用DirectDraw可以方便地编制出高效的视频处理程序,只要用户的硬件支持DirectDraw,就能保证你的代码可以处理它们与DirectX其它组件一样,只要可能,DirectDraw就会最高程度的利用硬件执行某特定功能,并且让那些该硬件还不支持的特性也能用软件仿真的方式加以实现设备无关性通常是通过硬件抽象层(HAL Hardwareabstractionlayer)实现的DirectDraw主要提供了完成以下任务的工具管理多页面,直接访问视频RAM,换页(Pageflipping),后台缓存(Backbuffering),管理调色板(Palette),裁剪(Clipping),视频端口(Videoport)除此之外,DirectDraw允许__者在应用程序运行期测定显示硬件的特性,然后,充分利用主机硬件设备的加速特性为用户提供可能的最优的显示速度和效果DirectDraw对象的创建和准备的每一步骤
1.创建DirectDraw对象创建DirectDraw对象的一个实例,应该用DirectDrawCreateAPI函数,也可以用COM中的CoCreateInstan__函数DirectDrawCreate用一个全局统一标志符GUIDGloballyUniqueIDentifier来表征显示设备,在大多数情况下GUID为NULL使用系统的缺省显示设备,既“空设备”);指针指向DirectDraw对象的地址;第三个参数总是NULL供将来扩展使用下述代码表明了如何创建一个DirectDraw对象,并且检验是否成功
2.设置显示模式设置DirectDraw应用程序的显示模式需要两步首先调用IDirectDraw::SetCooperativeLevel方法来设定该模式下的要求,一旦确定了要求,再用IDirectDraw::SetDisplayMode方法来选择显示分辨率在改变显示分辨率之前,还必须通过IDirectDraw::SetCooperativeLevel方法来指定DDSCL_EXCLUSIVE和DDSCL_FULLSCREEN标志这样能使游戏程序完全控制显示设备,其它的应用程序不能同时共享显示设备DDSCL_FULLSCREEN标志表示将程序设为全屏模式使用IDirectDraw::SetCooperativeLevel时,必须向窗口HWND传送一个句柄,让窗口决定何时非正常地终止应用程序例如,若发生了GP错误或GDI被翻转flip到了后台缓冲区,用户就无法访问当前屏幕为了避免这种情况,DirectDraw有一个后台等待进程,它俘获所有发往该窗口的消息,用这些消息来确定应用程序何时终止如果创建了新的窗口,必须确定该窗口为活动的,否则,就会有一系列的__无法继续工作
3.改变显示模式一旦选择了应用程序的工作模式,就可以使用方法来改变显示模式
4.创建可翻转表面FlippableSu_____设定了显示模式后,必须创建放置应用程序的表面
5.定义表面要求:创建可翻转表面的的第一步是在DDSU_____DESC结构中定义表面的要求
6.创建表面:填完了DDSU_____DESC结构,就可以使用该结构和lpDD了,lpDD是用DirectDrawCreate方法创建的DirectDraw对象的指针
7.取得后台缓冲区的指针:使用IDirectDrawSu_____::GetAttachedSu_____方法可以取得后台缓冲区的指针
8.着色表面:创建了主表面和后台缓冲区后,DDEX1使用标准的Windows GDI函数将一些文本提交到主表面和后台缓冲区一般来讲,当向表面写数据时,该表面就是后台缓冲区,然后将缓冲区翻转成主表面显示出来在DDEX1中,第一次翻转表面之前有一个重要的延迟于是DDEX1就将数据写入主缓冲区,避免开始显示时有太长的时间间隔后面将会讲到,DDEX1只在WM_TIMER期间向后台写数据初始化函数或标题头可能会写入主缓冲区应该注意的是,一旦使用IDirectDrawSu_____::Unlock对表面解锁,指向表面的指针就变成无效,必须再次使用IDirectDrawSu_____::Lock方法才能获取该表面内存的有效指针
9.写表面及翻转表面:完成了初始化后,DDEX1开始处理消息循环在消息循环的过程中,完成锁定后台缓冲区——写入新的文本——解锁后台缓冲区——翻转表面的过程WM_TIMER包含了写数据和翻转表面的大部分代码WM_TIMER消息的前半部分用于向后台缓冲区写数据,“phase”变量决定是写主缓冲区消息还是写后台缓冲区消息如果phase为1,表示写主缓冲区的消息,然后将phase改变为0;若为0,表示写后台缓冲区的消息,然后将phase改变为1注意,两种情况中的消息都是写向后台缓冲区后台缓冲区写入了消息后,使用IDirectDrawSu_____::ReleaseDC方法解锁
10.释放DirectDraw对象:当按了F12后,DDEX1程序在退出之前先处理WM_DESTROY消息,该消息调用了finiO__ects函数,而finiO__ects函数包含了所有的IUnknownRelease的调用
11.将位图调入表面:如DDEX1中一样,doInit函数是DDEX2的初始化函数,两者的实质一样
12.设置调色板,将位图调入后台缓冲区:创建了调色板之后,可以通过调用IDirectDrawSu_____::SetPalette方法将DirectDrawPalette对象的指针ddpal传送给主表面
13.从屏外表面位块传输:DDEX2同DDEX1基本相同DDEX2打开一个位图文件并将它送往后台缓冲区,然后翻转后台缓冲区和主表面但这对显示位图并不特别理想,DDEX3扩展了DDEX2的功能,它加入了两个屏外缓冲区,每个缓冲区都存储一个位图
14.将位图文件调入屏外表面:创建了两个屏外表面后,DDEX3使用了InitSu_____s函数将位图从Frntback.bmp文件装入到两个表面InitSu_____s函数使用了DDCopyBit__p函数调入两个位图
15.将屏外表面位位块传输到后台缓冲区WM_TIMER包含了写表面和翻转表面的代码在DDEX3中,它选择适当的屏外表面,并将其位块传输到后台缓冲区
16.创建动画:
1、ColorKey和位图动画在DDEX3例中描述了将位图放入屏外缓冲区的一种主要方式DDEX4则使用了将背景和一系列的精灵sprite,本例中精灵是圆环装入屏外表面的技术,然后使用IDirectDrawSu_____::BltFast方法将屏外表面的各部分拷贝到后台缓冲区doInit函数除了具有前面例子中的功能外,还包括了为精灵设置Colorkey的代码Colorkey是用于设置透明度的颜色值当使用硬件块写方式时,矩型区域内除了设为colorkey的像素,其它的像素都被块写,由此在表面上产生非矩型的精灵
17.动态改变调色板:DDEX5描述了任何在程序运行时动态地改变调色板,尽管在游戏中这并不总是用到DirectDraw确实能很好地控制调色板
18.替换调色板:DDEX5中的updateFrame函数同DDEX4中的基本相同,先将背景块写入后台缓冲区,再将3个红色圆环块写到前景
19.使用覆盖表面Overlay:创建一个主表面要使用覆盖表面,必须先要初始化一个主表面,覆盖表面将显示在该主表面上检测硬件对覆盖的支持初始化DirectDraw后,需要检测设备是否支持覆盖表面因为DirectDraw不能仿真覆盖,所以如果硬件不支持覆盖,就不能继续下面的工作你可以用方法获取硬件设备驱动程序的能力检测覆盖支持在调用该方法之后,查看DDCAPS结构中的dwFlags成员是否包含有DDCAPS_OVERLAY标志若有就表明支持覆盖,否则就不支持创建一个覆盖表面如果知道显示设备支持覆盖表面,就可以创建一个因为没有指明设备怎样支持覆盖表面的标准,所以不能够期望创建任意大小的像素格式的表面另外,也不要期望第一次创建覆盖表面就会成功因此,必须作好准备进行多次创建的尝试,直到有一个能够工作为止Mosquito程序在创建表面时遵循“bestcasetoworstcase”的原则,首先尝试创建一个三缓冲页翻转复杂覆盖表面如果尝试失败,程序就改变方法尝试用其它通用的迅速格式来配置显示覆盖表面创建了覆盖表面之后就可以显示它了通常,硬件在用于显示覆盖的矩形的位置和像素格式上加上对齐约束另外,还需要经常通过调整目的矩形的宽度来说明最小要求的拉伸因子以成功地显示覆盖表面更新覆盖的显示位置显示覆盖表面之后,有时可能就不需要对覆盖做其它的操作了但有些软件还需要重新放置覆盖,改变覆盖的显示位置隐藏覆盖表面如果不再需要一个覆盖表面或只想不让覆盖可见UpdateOverlayUpdateOverlay用于重新定位一个覆盖页面,或修改其视觉属性这些页面在创建时必须提DDSCAPS_OVERLAY标志3详细设计
3.1主要的函数和定义说明
3.
1.1Win__in函数主函数的入口和我们以前的__in()函数一样本次设计中的具体定义INTWINAPIWin__inHINSTAN__hInstan__HINSTAN__hPrevInstan__LPSTRlpCmdLineint__ode
3.
1.2WM_LBUTTONDOWNWM_LBUTTONDOWN消息当用户在window客户区域__鼠标左键的时候发送如果当前鼠标没有被捕捉,消息发送给鼠标下面的window窗体否则,消息发送给当前捕捉鼠标消息的方法
3.
1.3WindowFun函数窗口构造函数,注册函数,自动调用,处理消息循环本次设计中的具体定义LRESULTCALLBACKWindowFuncHWNDhwndUINTmessageWPARAMwParamLPARAMlParam
3.
1.4InitDDraw函数运用了directdraw编程,初始化directdraw主要作用是创建DirectDraw对象,设置协作级别为窗口模式,创建主页面,创建离屏页面,创建老鼠页面,创建木锤,创建火花,创建标题,创建背景,创建时间,创建分数页面,创建Clipper裁剪器本次设计中的具体定义BOOLInitDDraw{DWORDdwFlags;DDSU_____DESCddsd;//创建DirectDraw对象DirectDrawCreateNULLlpDDNULL;//设置协作级别为窗口模式dwFlags=DDSCL_NOR__L;lpDD-SetCooperativeLevelhwnddwFlags;//创建主页面ZeroMemoryddsdsizeofddsd;ddsd.dwSize=sizeofddsd;ddsd.dwFlags=DDSD_CAPS;ddsd.ddsCaps.dwCaps=DDSCAPS_PRI__RYSU_____;lpDD-CreateSu_____ddsdlpDDSFrontNULL;//创建离屏页面ddsd.dwFlags=DDSD_CAPS|DDSD_WIDTH|DDSD_HEIGHT;ddsd.ddsCaps.dwCaps=DDSCAPS_OFFSCREENPLAIN;RECTrect;GetClientRecthwndrect;forewidth=rect.right-rect.left;foreheight=rect.bottom-rect.top;GetRectbackrect00433348;ddsd.dwWidth=backwidth=forewidth;ddsd.dwHeight=backheight=foreheight;lpDD-CreateSu_____ddsdlpDD__ackNULL;//创建老鼠页面ddsd.dwWidth=124;ddsd.dwHeight=425;lpDD-CreateSu_____ddsdlpDD__ouse
[0]NULL;lpDD-CreateSu_____ddsdlpDD__ouse
[1]NULL;lpDD-CreateSu_____ddsdlpDD__ouse
[2]NULL;DDReLoadBit__plpDD__ouse
[0]MOUSE
00.BMP;DDReLoadBit__plpDD__ouse
[1]MOUSE
01.BMP;DDReLoadBit__plpDD__ouse
[2]MOUSE
02.BMP;DDSetColorKeylpDD__ouse
[0]RGB00255;DDSetColorKeylpDD__ouse
[1]RGB00255;DDSetColorKeylpDD__ouse
[2]RGB00255;//创建木锤ddsd.dwWidth=68;ddsd.dwHeight=136;lpDD-CreateSu_____ddsdlpDDSHammerNULL;DDReLoadBit__plpDDSHammerHAM.BMP;DDSetColorKeylpDDSHammerRGB00255;//创建火花ddsd.dwWidth=68;ddsd.dwHeight=24;lpDD-CreateSu_____ddsdlpDD__owNULL;DDReLoadBit__plpDD__owBow.BMP;DDSetColorKeylpDD__owRGB2550127;//创建标题ddsd.dwWidth=319;ddsd.dwHeight=56;lpDD-CreateSu_____ddsdlpDDSLogoNULL;DDReLoadBit__plpDDSLogologo.BMP;DDSetColorKeylpDDSLogoRGB00255;//创建背景ddsd.dwWidth=433;ddsd.dwHeight=348;lpDD-CreateSu_____ddsdlpDD__kNULL;DDReLoadBit__plpDD__kBK.BMP;//创建时间ddsd.dwWidth=45;ddsd.dwHeight=13;lpDD-CreateSu_____ddsdlpDDSTimeNULL;DDReLoadBit__plpDDSTimeTime.BMP;DDSetColorKeylpDDSTimeRGB2550127;//创建数字ddsd.dwWidth=260;ddsd.dwHeight=38;lpDD-CreateSu_____ddsdlpDDSHamfigNULL;DDReLoadBit__plpDDSHamfigHamfig.BMP;DDSetColorKeylpDDSHamfigRGB2550127;//创建数字ddsd.dwWidth=160;ddsd.dwHeight=23;lpDD-CreateSu_____ddsdlpDDSFigNULL;DDReLoadBit__plpDDSFigfig.BMP;DDSetColorKeylpDDSFigRGB2550127;//创建分数页面ddsd.dwWidth=43;ddsd.dwHeight=25;lpDD-CreateSu_____ddsdlpDDSScore
[0]NULL;lpDD-CreateSu_____ddsdlpDDSScore
[1]NULL;lpDD-CreateSu_____ddsdlpDDSScore
[2]NULL;DDReLoadBit__plpDDSScore
[0]Score
01.BMP;DDReLoadBit__plpDDSScore
[1]Score
02.BMP;DDReLoadBit__plpDDSScore
[2]Score
03.BMP;DDSetColorKeylpDDSScore
[0]RGB2550127;DDSetColorKeylpDDSScore
[1]RGB2550127;DDSetColorKeylpDDSScore
[2]RGB2550127;//创建Clipper裁剪器lpDD-CreateClipper0lpClipperNULL;lpClipper-SetHWnd0hwnd;lpDDSFront-SetClipperlpClipper;returnTRUE;}
3.
1.5InitData函数在本次设计中的作用是数据初始化实现老鼠洞位置数据的初始化,老鼠头位置的初始化本次设计中的具体定义voidInitData{inti;bActive=true;delay=5;dwLastTickCount=0;hit=false;get=false;time=20;score=0;RECTWindow;GameStatus=0;GetClientRecthwndWindow;pt.x=pt.y=0;ClientToScreenhwndpt;//初始化老鼠洞位置holepos
[0].x=24;holepos
[0].y=215;holepos
[1].x=160;holepos
[1].y=215;holepos
[2].x=296;holepos
[2].y=215;holepos
[3].x=1;holepos
[3].y=150;holepos
[4].x=137;holepos
[4].y=150;holepos
[5].x=274;holepos
[5].y=150;holepos
[6].x=32;holepos
[6].y=87;holepos
[7].x=159;holepos
[7].y=87;holepos
[8].x=287;holepos
[8].y=87;//初始化老鼠头位置fori=0;i9;i++{mousepos[i].x=holepos[i].x+25;mousepos[i].y=holepos[i].y+15;}mousewidth=62;mouseheight=62;//初始化老鼠洞fori=0;i9;i++{mouse[i]=1;status[i]=0;holepos[i].y-=21;mousepos[i].y-=21;behit[i]=0;}}
3.
1.6DrawAll()函数本次设计中主要功能是画出所需要的__,包括背景,老鼠,木槌本次设计中的具体定义voidDrawAll//画出所需要的__{inti;HRESULTrval;RECTrectrect1;……}
3.
1.7WM_LBUTTONDOWNWM_LBUTTONDOWN消息当用户在window客户区域__鼠标左键的时候发送如果当前鼠标没有被捕捉,消息发送给鼠标下面的window窗体否则,消息发送给当前捕捉鼠标消息的方法程序如下caseWM_LBUTTONDOWN:ifGameStatus==1{hit=true;get=false;}else{StartGame;}break;
3.
1.8WM_SETCURSOR:作用是光标消息程序如下caseWM_SETCURSOR:SetCursorNULL;
3.
1.9WM_KEYDOWN作用是键盘消息caseWM_KEYDOWN:switchcharwParam{caseVK_SUBTRACT:delay+=2;break;caseVK_ADD:ifdelay2delay-=2;break;caseVK_ESCAPE:MessageBoxhwnd送给你的...:\nFrom:\n耗子\nhttp://rpg.
3322.net\nRaynor@ah
163.com关于这个游戏MB_OK;PostQuitMessage0;break;}break;
3.
1.10WM_LBUTTONUP窗口消息当光标在窗口客户区时,用户释放鼠标左键时发出的消息如果鼠标没有捕获,这个消息被送到光标下的窗口否则,该消息发布到捕获鼠标的窗口程序如下caseWM_LBUTTONUP:hit=false;break;
3.
1.11WM_DESTROY:WM_DESTROY是关闭程序的,关闭程序时弹出对话框程序如下caseWM_DESTROY:MessageBoxhwnd送给你的...:\nFrom:\n关于这个游戏MB_OK;PostQuitMessage0;break;
3.
1.12WM_MOUSEMOVE:作用是鼠标__对应的坐标程序如下caseWM_MOUSEMOVE:pos.x=LOWORDlParam;pos.y=HIWORDlParam;break;
3.
1.13WM_TIMERc++中定时器告诉windows一个时间间隔,然后windows以此时间间隔周期性触发程序程序如下caseWM_TIMER:ifbActive{switchwParam{case1:StepAll;break;case2:time--;break;}}break;default:returnDefWindowProchwndmessagewParamlParam;break;}return0;}
3.
1.14hwnd的作用介绍如下程序hwnd=CreateWindow//设计窗口szClassName打老鼠WS_SY__ENU|WS_CAPTION|WS_MINIMIZEBOX|WS_POPUP//窗口坐标180//窗口的位置程序框顶点到显示框顶点之间是180和8080433//窗口的长宽348HWND_DESKTOPNULLhInstan__NULL;
3.
1.15ShowWindowhwnd__ode;//显示窗口hwnd
3.
1.16UpdateWindowhwnd;//更新窗口
3.
1.17InitData如下程序含义定义的SetTimer(窗口中设置时钟,时钟的编号,时钟的速度,NUll)单位是毫秒,表示1000毫秒的时钟,滴答一下设置时钟的目的是有消息timer,每滴答一下,响应消息,执行消息响应程序如下SetTimerhwnd1200NULL;SetTimerhwnd21000NULL;3程序调试
3.1调试成果及讲解
3.
1.1三种种类的老鼠图3-1如图3-1土黄老鼠是可爱的老鼠,是普通地鼠,分数也普通图3-2如图3-2粉红色老鼠头上有个可爱的蝴蝶结,不能随便打,会倒扣分数图3-3如图3-3黑老鼠有凶恶的眼神,速度很快,打击难度高,分数也高
3.2运行效果初始图3-4__左键跳出如下对话框,__确定,进入游戏图3-5游戏结束出现如下对话框__确定,再来一局再玩一局破纪录后出现如下对话框,记录刷新图3-6打中的老鼠会头金星,出现如下星星5心得体会在学习C++以前,我认为C++只是在C语言的基础上的一种延伸,认为只要学过C语言,就可以用C语言的那种设计思想来学习C++、设计C++程序正是由于抱了这种错误的思想,使我在一开始学习C++的时候遇到了很大的困难,___办法体会面向对象的设计思想,我在学习这门课的时候老是想着实现这个函数功能的具体过程,而没太注意对象分类的重要性随着课程学习的深入,我感觉到了利用类和对象、继承、封装等一系列知识可以把我们程序中很多繁杂、重复的部分省略掉,还可以解决一些利用面向过程的设计思想无法解决的问题,我自己也试着编写一些小的C++程序,当然在这个过程中遇到了很多困难,其中调试带来的困难让我无法忘记,在调试程序的同时,我也总结出来了一些调试的小技巧,让我在C语言课程设计中也受用匪浅虽然现在仍然会有一些问题不能解决比如插入透明__的问题但是在今后的学习和努力中会发现更多的东西,更加的进步在学习这门课的过程中,我__到了自己亲自动手编程序、调程序的重要性,我们要熟悉C++的语法、体会调试的思想,最好的一个手段就是自己动手编程、调试,这会比我们一味的看书效果好得多另外,我还感觉到一个好的程序编出来需要很多人的团结合作我在检查自己编写的程序是否有BUG未被找出的时候,我会让我的同学作为一个程序使用者来找出未发现的BUG并提出改进意见,这让我们的工作更加高效很高兴能够了解到C++的神奇魅力和面向对象程序设计的独特思想,它为我今后的程序设计奠定了基础感谢老师对我们的悉心教授!____
[1]谭浩强,《C程序设计》,清华大学出版社
[2]刘振安,孙忱,刘燕君,《C程序设计课程设计》,机械工业出版社
[3]汪诗林,《数据结构算法与应用》,机械工业出版社
[4]陈锦昌,赵明秀.C语言计算机绘图教程.华南理工大学出版社.
1998.9附录(部分主要程序)#includewindows.h#includeddraw.h#includeddutil.h#includestdio.h#includeresour__.h//函数声明INTUpdateFrame;LRESULTCALLBACKWindowFuncHWNDUINTWPARAMLPARAM;BOOLInitDDrawvoid;voidGetRectRECT*rectlongleftlongtoplongwidthlongheight;voidFlipvoid;voidDrawAll;voidInitData;voidCheckHit;voidStepAll;voidStartGame;voidDrawNumberLPDIRECTDRAWSU_____ddLPDIRECTDRAWSU_____ssintnumintxintyintwidthintheight;//全局变量charszClassName[]=ForEpork;HWNDhwnd;//showwindow函数中whnd的定义HINSTAN__hInst;BOOLbActive;DWORDdelay;//延时DWORDdwTickCountdwLastTickCount;//关于游戏的全局变量BOOLhitget;POINTpos;//木锤位置intforewidthforeheight;//前台页面的宽度和高度RECTbackrect;//后台页面映射矩形intbackwidthbackheight;//后台页面的宽度和高度intmouse
[9];//老鼠洞出现东东的纪录POINTholepos
[9];//老鼠洞的位置POINTmousepos
[9];//老鼠头的位置intstatus
[9];//老鼠状态0-4intbehit
[9];//老鼠各个被打的纪录intmousewidth;intmouseheight;POINTpt;inttime;//剩余时间intscore;//分数intGameStatus;//游戏状态//DirectDraw变量LPDIRECTDRAWlpDD;LPDIRECTDRAWCLIPPERlpClipper;LPDIRECTDRAWSU_____lpDDSFront;//以下均为DirectDrawSu_____对象LPDIRECTDRAWSU_____lpDD__ack;LPDIRECTDRAWSU_____lpDD__ouse
[3];LPDIRECTDRAWSU_____lpDDSHammer;LPDIRECTDRAWSU_____lpDD__k;LPDIRECTDRAWSU_____lpDDSLogo;LPDIRECTDRAWSU_____lpDD__ow;LPDIRECTDRAWSU_____lpDDSFig;LPDIRECTDRAWSU_____lpDDSHamfig;LPDIRECTDRAWSU_____lpDDSTime;LPDIRECTDRAWSU_____lpDDSScore
[3];INTWINAPIWin__inHINSTAN__hInstan__HINSTAN__hPrevInstan__LPSTRlpCmdLineint__ode//与__in函数类似是函数的入口{MSGmsg;//消息,基于消息的编程什么是消息?操作系统封装消息变成结构//在Windows中发生的一切都可以用消息来表示,消息用于告诉操作系统发生了什么,//所有的Windows应用程序都是消息驱动的一个消息是由消息的名称UINT和两个参数(WPARAMLPARAM)组成WNDCLAS___wcl;wcl.cbCl___tra=0;wcl.cbSize=sizeofWNDCLAS___;wcl.cbWndExtra=0;wcl.hbrBackground=HBRUSHGetStockO__ectWHITE_BRUSH//WHITE_BRUSH表示窗口的颜色是白色的;wcl.hCursor=LoadCursorNULLIDC_ARROW;//LoadCursor光标wcl.hIcon=LoadIconhInstan__IDI_ICON1;//LoadIcon图标wcl.hIcon__=LoadIconNULLIDI_WINLOGO;//logowcl.hInstan__=hInstan__;wcl.lpfnWndProc=WindowFunc;wcl.lpszClassName=szClassName;wcl.lpszMenuName=NULL;wcl.style=0;if!RegisterClas___wclreturn0;hwnd=CreateWindow//设计窗口szClassName打老鼠WS_SY__ENU|WS_CAPTION|WS_MINIMIZEBOX|WS_POPUP//窗口坐标180//窗口的位置程序框顶点到显示框顶点之间是180和8080433//窗口的长宽348HWND_DESKTOPNULLhInstan__NULL;ShowWindowhwnd__ode;//显示窗口hwndUpdateWindowhwnd;//更新窗口if!InitDDraw{MessageBoxGetActiveWindow初始化DirectDraw过程中出错!请检查你是否正确的__了DirectXErrorMB_OK;return0;}hInst=hInstan__;InitData;SetTimerhwnd1200NULL;//(窗口中设置时钟,时钟的编号,时钟的速度,NUll)单位是毫秒快SetTimerhwnd21000NULL;//表示1000毫秒的时钟滴答一下慢//设置时钟的目的是有消息timer每滴答一下响应消息执行消息响应while1{ifPeekMessagemsgNULL00PM_NOREMOVE//消息循环{if!GetMessagemsgNULL00//接收消息{returnmsg.wParam;}TranslateMessagemsg;//翻译消息DispatchMessagemsg;//处理消息}elseifbActive{UpdateFrame;}else{WaitMessage;}}KillTimerhwnd1;//时钟停止returnmsg.wParam;}LRESULTCALLBACKWindowFuncHWNDhwndUINTmessageWPARAMwParamLPARAMlParam//窗口构造函数注册函数自动调用处理消息循环{switchmessage{caseWM_ACTIVATEAPP://bActive=wParam;break;caseWM_CREATE://写入注册表HKEYhRegKey;unsignedlongresult;charversion
[10];sprintfversion
1.00;Re__reateKeyExHKEY_CURRENT_USERSoftware\\RaynorGame\\ForEpork0Epork0KEY_ALL_AC__SSNULLhRegKeyresult;ifresult==REG_CREATED_NEW_KEY{RegSetValueExhRegKeyVersion0REG_SZLPBYTEversion4;}else{RegSetValueExhRegKeyVersion0REG_SZLPBYTEversion4;}Re__loseKeyhRegKey;break;caseWM_SETCURSOR://光标消息SetCursorNULL;break;caseWM_KEYDOWN://键盘消息switchcharwParam{caseVK_SUBTRACT:delay+=2;break;caseVK_ADD:ifdelay2delay-=2;break;caseVK_ESCAPE:MessageBoxhwnd送给你的...:\n关于这个游戏MB_OK;PostQuitMessage0;break;}break;caseWM_LBUTTONDOWN://WM_LBUTTONDOWN消息当用户在window客户区域__鼠标左键的时候发送//如果当前鼠标没有被捕捉,消息发送给鼠标下面的window窗体否则,消息发送给当前捕捉鼠标消息的方法ifGameStatus==1{hit=true;get=false;}else{StartGame;}break;caseWM_LBUTTONUP://窗口消息当光标在窗口客户区时,用户释放鼠标左键时发出的消息//如果鼠标没有捕获,这个消息被送到光标下的窗口否则,该消息发布到捕获鼠标的窗口hit=false;break;caseWM_DESTROY://WM_DESTROY是关闭程序的关闭程序时弹出对话框……MessageBoxhwnd送给你的...:\nFrom:\n耗子\nhttp://rpg.
3322.net\nRaynor@ah
163.com关于这个游戏MB_OK;PostQuitMessage0;break;caseWM_MOUSEMOVE://鼠标__对应的坐标pos.x=LOWORDlParam;pos.y=HIWORDlParam;break;caseWM_TIMER://c++中定时器告诉windows一个时间间隔,然后windows以此时间间隔周期性触发程序ifbActive{switchwParam{case1:StepAll;break;case2:time--;break;}}break;default:returnDefWindowProchwndmessagewParamlParam;break;}return0;}INTUpdateFrame{ifbActive{dwTickCount=GetTickCount;ifdwTickCount-dwLastTickCount=delay{return0;}dwLastTickCount=dwTickCount;//Heretoaddmycode...DrawAll;CheckHit;Flip;}return1;}BOOLInitDDraw//运用了directdraw编程//初始化directdraw{DWORDdwFlags;DDSU_____DESCddsd;//创建DirectDraw对象DirectDrawCreateNULLlpDDNULL;//设置协作级别为窗口模式dwFlags=DDSCL_NOR__L;lpDD-SetCooperativeLevelhwnddwFlags;voidDrawAll//画出所需要的__{inti;HRESULTrval;//HDChdc;RECTrectrect1;……}voidInitData//数据初始化{inti;bActive=true;delay=5;dwLastTickCount=0;hit=false;get=false;time=20;score=0;……}。