版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、I / 30 文档可自由编辑打印盐城工学院盐城工学院程序设计实践报告程序设计实践报告 段 佳 雯学学 院院 信息工程 专专 业业 计算机科学与技术计算机科学与技术班班 级级 Z111 学学 号号 1160704108 学生姓名学生姓名 段佳雯段佳雯 课程成绩课程成绩 完成日期完成日期 2014-1-16II / 30 文档可自由编辑打印目目 录录1 引言.11.1 课程设计目的.11.2 开发工具的介绍.12 概要设计.22.1 系统总体分析.22.2 主模块涉及的基本概念及说明.23 详细设计.73.1 主要的函数和定义说明 .73.1 调试成果及讲解 .165 心得体会.20参考文献.21
2、附录221 / 30 文档可自由编辑打印打地鼠游戏程序设计打地鼠游戏程序设计1 1 引言引言本程序设计实践是采用 C+语言,在 VC 平台下设计。本课程设计提供了独立实践的机会,将课本上的理论知识和实际有机的结合起来,充分的锻炼分析解决实际问题的能力。提高了适应实际,实践编程的能力。1.1 课程设计目的程序设计实践主要是培养学生利用系统综合 C+语言进行程序设计的能力。(1)进一步巩固和复习 C+程序设计的基础知识。(2)培养结构化程序、模块化程序设计的方法和能力。(3)了解软件的编制过程及各环节的具体内容。(4)提高程序调试技巧、软件设计能力和代码规范化等素质。(5)提高分析问题、解决问题以
3、及实际运用能力。 (6)功能要求:基本要求:设计的系统界面要美观大方,操作合理,有必要的提示。创新要求:在基本要求达到后,进行创新设计。对系统进行功能模块分析、控制流程分析正确。系统设计要实用,编程简练,可用,功能全面,并有一定的容错能力。说明书、流程图要清楚。要求程序设计合理,用户界面良好,如采用菜单工作方式。1.2 开发工具的介绍关于关于 VisualVisual C+C+Visual C+6.0 是 Microsoft 公司在 1998 年推出的基于 Windows 9X 和 Windows NT 的优秀集成开发环境。该环境为用户提供了良好的可视化编程环境,程序员可以里利用该开发环境轻松
4、地访问 C+源代码编辑器,资源编辑器和使用内部调试器,并且可以创建项目文件。Visual C+6.0 不仅包括编译器,而且它还包括许多有用组件,通过这些组件的协同工作,可以在 Visual C+6.0 集成环境中轻松地完成创建源文件,编辑资源,以及对程序的编译,连接和调试等各项工作。VC+6.0 是 Windows 95/98、XP 或 Windows NT 下的一个应用程序,本身对软硬件没有特殊要求。就是说它对环境的要求与 Windows 95/98、Windows NT 要求是一致的。硬件要求:一般在 586 以上的处理器、16MB 以上内存、100MB 以上的硬盘。软件要求:Window
5、s 95/98 或 Windows NT3.51 以上版本。VC+ 6.0 系统可以在一张 CD 盘上,也可以在“Visual Studio( Visual C+、Visual 2 / 30 文档可自由编辑打印Foxpro)”等产品的第一张 CD 盘上。一般都有一个 VC 的自动安装程序,也可以执行 VC6 目录下的 setup.exe,在安装包的提示下进行,对初学者可采用“典型安装”方式。在安装好 VC 6.0 系统后,有时根据需要添加或删除某些部件,可插入 CD 盘重新执行setup.exe 安装程序,安装程序会检测当前系统安装 VC6 的足件,用户单击“添加删除”按钮后,在“安装维护”对
6、话框中选定要添加的部件或撤消选定要删除的部件。与一般的应用软件一样,有以下两种启动方式:(1)通过“开始”按钮,选择“程序”菜单,然后打开“Microsoft Visual studio 6.0 中文版”子菜单中的“Microsoft Visual C+ 6.0 中文版”程序。(2)用户也可以使用命令行启动 VC。单击“开始”按钮后选择“运行”命令,在“运行”对话框中输入 c:Program FilesMicrosoft Visual StudioVC98VC6.exe(按默认盘符和路径安装)即可。1.3 功能说明:打地鼠是一种非常有趣的益智游戏。游戏进行时,地鼠会不断从洞口探出头来再缩回去,
7、地鼠头在洞外时,可以通过案件的方式打击地鼠,时间到时游戏结束,打中地鼠次数越多分数越高,打中红色地鼠会减分,灰色地鼠分数比棕色地鼠分数低。打破记录可以刷新成绩。点击鼠标左键可以打击地鼠。2 2 概要设计概要设计2.1 系统总体分析开发环境:Microsoft WindowsXP TASM2.2 主模块涉及的基本概念及说明2.2.1Message 消息机制在 Windows 中发生的一切都可以用消息来表示,消息用于告诉操作系统发生了什么,所有的 Windows 应用程序都是消息驱动的。 一个消息是由消息的名称(UINT)和两个参数(WPARAM, LPARAM)组成。消息的参数中包含有重要的信息
8、。主要包括程序核心,输入焦点,消息分类,消息队列,消息循环,消息分类。一个消息由一个消息名称(UINT) ,和两个参数(WPARAM,LPARAM)组成。本设计中主要用 Msg 来调用 Messagebox 里的消息。从而来实现鼠标点击实现功能的操作。例如对鼠标消息而言,LPARAM 中一般包含鼠标的位置信息。Msg 变量是型态为 MSG的结构。当鼠标在某个窗口内移动时,Windows 会不断地发出鼠标移动消息WM_MOUSEMOVE,并把鼠标的最新位置传给该窗口。如果在窗口的范围内按下鼠标左键,系统就会发出“按下左键”的 WM_LBUTTONDOWN 消息给该窗口,等到用户放开按键后,再发出
9、“放开左键”的 WM_LBUTTONUP 消息给该窗口。消息可以看做是一个动作。操作系统把消息3 / 30 文档可自由编辑打印给封装成结构。本设计中主要用 WindowFunc 函数来调用消息循环。Windows 为当前执行的每个Windows 程序维护一个消息队列。在发生输入事件之后,Windows 将事件转换为一个消息并将消息放入程序的消息队列中。程序通过执行一块称之为消息循环的程序代码从消息队列中取出消息。本程序中在时钟运行里运用到了消息循环。例while(1)if( PeekMessage(&msg,NULL,0,0,PM_NOREMOVE)/消息循环if (!GetMessa
10、ge(&msg,NULL,0,0)/接收消息return msg.wParam;TranslateMessage(&msg);/翻译消息DispatchMessage(&msg);/处理消息else if( bActive)UpdateFrame();elseWaitMessage();KillTimer(hwnd,1);/时钟停止return msg.wParam;消息循环的过程如图 11 所示:图 1-1 在程序的时钟里也运用到了消息队列的思想。消息队列就是 Windows 中有一个系统消息队列,对于每一个正在执行的 Windows 应用程序,系统为其建立一个“消息
11、队列” ,即4 / 30 文档可自由编辑打印应用程序队列,用来存放该程序可能创建的各种窗口的消息。应用程序中含有一段称作“消息循环”的代码,用来从消息队列中检索这些消息并把它们分发到相应的窗口函数中。在消息循环中没有消息的话就排队等待。没有消息就创建空传消息。2.2.2DirectDrawDirectDraw 是通过基于 COM 的接口提供服务。在 DirectX 5.0 版本中,这些接口分别是:IDirectDraw2、IDirectDrawSurface3、IDirectDrawPalette、IDirectDrawClipper和 IDirectDrawVideoPort。DirectX
12、 的这些组件是向下兼容的,它们仍然支持旧版本中的所有功能。 DirectDraw 是 DirectX 中的关于视频输入输出的基本部分,使用 DirectDraw 可以方便地编制出高效的视频处理程序,只要用户的硬件支持 DirectDraw,就能保证你的代码可以处理它们。与 DirectX 其它组件一样,只要可能,DirectDraw 就会最高程度的利用硬件执行某特定功能,并且让那些该硬件还不支持的特性也能用软件仿真的方式加以实现。设备无关性通常是通过硬件抽象层(HAL:Hardware abstraction layer)实现的。DirectDraw 主要提供了完成以下任务的工具:管理多页面
13、,直接访问视频 RAM ,换页(Page flipping) ,后台缓存(Back buffering) ,管理调色板(Palette) ,裁剪(Clipping) ,视频端口(Video port) 。除此之外,DirectDraw 允许开发者在应用程序运行期测定显示硬件的特性,然后,充分利用主机硬件设备的加速特性为用户提供可能的最优的显示速度和效果。DirectDraw 对象的创建和准备的每一步骤:1. 创建 DirectDraw 对象:创建 DirectDraw 对象的一个实例,应该用DirectDrawCreate API 函数,也可以用 COM 中的 CoCreateInstance
14、 函数。DirectDrawCreate 用一个全局统一标志符 GUID(Globally Unique IDentifier)来表征显示设备,在大多数情况下 GUID 为 NULL(使用系统的缺省显示设备,既“空设备” ) ;指针指向DirectDraw 对象的地址;第三个参数总是 NULL(供将来扩展使用)。下述代码表明了如何创建一个 DirectDraw 对象,并且检验是否成功。2.设置显示模式:设置 DirectDraw 应用程序的显示模式需要两步:首先调用IDirectDraw:SetCooperativeLevel 方法来设定该模式下的要求,一旦确定了要求,再用IDirectDra
15、w:SetDisplayMode 方法来选择显示分辨率。在改变显示分辨率之前,还必须通过 IDirectDraw:SetCooperativeLevel 方法来指定 DDSCL_EXCLUSIVE 和DDSCL_FULLSCREEN 标志。这样能使游戏程序完全控制显示设备,其它的应用程序不能同时共享显示设备。DDSCL_FULLSCREEN 标志表示将程序设为全屏模式。使用5 / 30 文档可自由编辑打印IDirectDraw:SetCooperativeLevel 时,必须向窗口 (HWND)传送一个句柄,让窗口决定何时非正常地终止应用程序。例如,若发生了 GP 错误或 GDI 被翻转(fl
16、ip)到了后台缓冲区,用户就无法访问当前屏幕。为了避免这种情况,DirectDraw 有一个后台等待进程,它俘获所有发往该窗口的消息,用这些消息来确定应用程序何时终止。如果创建了新的窗口,必须确定该窗口为活动的,否则,就会有一系列的事件无法继续工作。3.改变显示模式一旦选择了应用程序的工作模式,就可以使用方法来改变显示模式。4.创建可翻转表面(Flippable Surface) :设定了显示模式后,必须创建放置应用程序的表面。5. 定义表面要求:创建可翻转表面的的第一步是在 DDSURFACEDESC 结构中定义表面的要求。6. 创建表面: 填完了 DDSURFACEDESC 结构,就可以使
17、用该结构和 lpDD 了,lpDD 是用DirectDrawCreate 方法创建的 DirectDraw 对象的指针。7.取得后台缓冲区的指针: 使用 IDirectDrawSurface:GetAttachedSurface 方法可以取得后台缓冲区的指针。8.着色表面: 创建了主表面和后台缓冲区后,DDEX1 使用标准的 Windows GDI 函数将一些文本提交到主表面和后台缓冲区。一般来讲,当向表面写数据时,该表面就是后台缓冲区,然后将缓冲区翻转成主表面显示出来。在 DDEX1 中,第一次翻转表面之前有一个重要的延迟。于是 DDEX1 就将数据写入主缓冲区,避免开始显示时有太长的时间间
18、隔。后面将会讲到,DDEX1 只在 WM_TIMER 期间向后台写数据。初始化函数或标题头可能会写入主缓冲区。应该注意的是,一旦使用 IDirectDrawSurface:Unlock 对表面解锁,指向表面的指针就变成无效,必须再次使用 IDirectDrawSurface:Lock 方法才能获取该表面内存的有效指针。9.写表面及翻转表面: 完成了初始化后,DDEX1 开始处理消息循环。在消息循环的过程中,完成锁定后台缓冲区写入新的文本解锁后台缓冲区翻转表面的过程。WM_TIMER 包含了写数据和翻转表面的大部分代码。 WM_TIMER 消息的前半部分用于向后台缓冲区写数据, “phase”变
19、量决定是写主缓冲区消息还是写后台缓冲区消息。如果 phase为 1,表示写主缓冲区的消息,然后将 phase 改变为 0;若为 0,表示写后台缓冲区的消息,然后将 phase 改变为 1。注意,两种情况中的消息都是写向后台缓冲区。后台缓冲区写入了消息后,使用 IDirectDrawSurface:ReleaseDC 方法解锁。10. 释放 DirectDraw 对象: 当按了 F12 后,DDEX1 程序在退出之前先处理WM_DESTROY 消息,该消息调用了 finiObjects 函数,而 finiObjects 函数包含了所有的IUnknown Release 的调用。11. 将位图调入
20、表面: 如 DDEX1 中一样,doInit 函数是 DDEX2 的初始化函数,两者的实质一样。6 / 30 文档可自由编辑打印12.设置调色板,将位图调入后台缓冲区: 创建了调色板之后,可以通过调用IDirectDrawSurface:SetPalette 方法将 DirectDrawPalette 对象的指针 ddpal 传送给主表面。13. 从屏外表面位块传输: DDEX2 同 DDEX1 基本相同。DDEX2 打开一个位图文件并将它送往后台缓冲区,然后翻转后台缓冲区和主表面。但这对显示位图并不特别理想,DDEX3扩展了 DDEX2 的功能,它加入了两个屏外缓冲区,每个缓冲区都存储一个位
21、图。14. 将位图文件调入屏外表面: 创建了两个屏外表面后,DDEX3 使用了 InitSurfaces函数将位图从 Frntback.bmp 文件装入到两个表面。InitSurfaces 函数使用了DDCopyBitmap 函数调入两个位图。15. 将屏外表面位位块传输到后台缓冲区:WM_TIMER 包含了写表面和翻转表面的代码。在 DDEX3 中,它选择适当的屏外表面,并将其位块传输到后台缓冲区。16. 创建动画: 1、Color Key 和位图动画在 DDEX3 例中描述了将位图放入屏外缓冲区的一种主要方式。DDEX4 则使用了将背景和一系列的精灵(sprite,本例中精灵是圆环)装入屏
22、外表面的技术,然后使用, IDirectDrawSurface:BltFast 方法将屏外表面的各部分拷贝到后台缓冲区。doInit 函数除了具有前面例子中的功能外,还包括了为精灵设置Color key 的代码。Color key 是用于设置透明度的颜色值。当使用硬件块写方式时,矩型区域内除了设为 color key 的像素,其它的像素都被块写,由此在表面上产生非矩型的精灵。17.动态改变调色板:DDEX5 描述了任何在程序运行时动态地改变调色板,尽管在游戏中这并不总是用到。DirectDraw 确实能很好地控制调色板。18. 替换调色板:DDEX5 中的 updateFrame 函数同 DD
23、EX4 中的基本相同,先将背景块写入后台缓冲区,再将 3 个红色圆环块写到前景。19. 使用覆盖表面(Overlay): 创建一个主表面要使用覆盖表面,必须先要初始化一个主表面,覆盖表面将显示在该主表面上。检测硬件对覆盖的支持 初始化 DirectDraw 后,需要检测设备是否支持覆盖表面。因为 DirectDraw 不能仿真覆盖,所以如果硬件不支持覆盖,就不能继续下面的工作。你可以用方法获取硬件设备驱动程序的能力检测覆盖支持。在调用该方法之后,查看 DDCAPS 结构中的 dwFlags 成员是否包含有 DDCAPS_OVERLAY 标志。若有就表明支持覆盖,否则就不支持。创建一个覆盖表面如
24、果知道显示设备支持覆盖表面,就可以创建一个。因为没有指明设备怎样支持覆盖表面的标准,所以不能够期望创建任意大小的像素格式的表面。另外,也不要期望第一次创建覆盖表面就会成功。因此,必须作好准备进行多次创建的尝试,直到有一个能够工作为止。Mosquito 程序在创建表面时遵循“best case to worst case”的原则,首先尝试创建一个三缓冲页翻转复杂覆盖表面。如果尝试失败,程序就改变方法尝试用其它通用的迅速格式来配置。显示覆盖表面创建了覆盖表面之后就可以显示它了。通常,硬件在用于显示覆盖的矩形的位置和像素格式上加上7 / 30 文档可自由编辑打印对齐约束。另外,还需要经常通过调整目的
25、矩形的宽度来说明最小要求的拉伸因子以成功地显示覆盖表面。更新覆盖的显示位置显示覆盖表面之后,有时可能就不需要对覆盖做其它的操作了。但有些软件还需要重新放置覆盖,改变覆盖的显示位置。隐藏覆盖表面如果不再需要一个覆盖表面或只想不让覆盖可见。UpdateOverlay UpdateOverlay 用于重新定位一个覆盖页面,或修改其视觉属性。这些页面在创建时必须提 DDSCAPS_OVERLAY 标志。3 3 详细设计详细设计3.1 主要的函数和定义说明3.1.1 WinMain 函数主函数的入口。和我们以前的 main()函数一样。本次设计中的具体定义:INT WINAPI WinMain(HINS
26、TANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nMode)。3.1.2 WM_LBUTTONDOWN WM_LBUTTONDOWN 消息当用户在 window 客户区域点击鼠标左键的时候发送。如果当前鼠标没有被捕捉,消息发送给鼠标下面的 window 窗体。否则,消息发送给当前捕捉鼠标消息的方法。3.1.3 WindowFun 函数 窗口构造函数,注册函数,自动调用,处理消息循环。本次设计中的具体定义:LRESULT CALLBACK WindowFunc(HWND hwnd,UINT message,WPARAM wP
27、aram,LPARAM lParam)。3.1.4 InitDDraw()函数运用了 directdraw 编程,初始化 directdraw。主要作用是创建 DirectDraw 对象,设置协作级别为窗口模式,创建主页面,创建离屏页面,创建老鼠页面,创建木锤,创建火花,创建标题,创建背景,创建时间,创建分数页面,创建 Clipper 裁剪器。本次设计中的具体定义:BOOL InitDDraw()DWORD dwFlags;DDSURFACEDESC ddsd;8 / 30 文档可自由编辑打印/创建 DirectDraw 对象DirectDrawCreate(NULL, &lpDD,
28、NULL);/设置协作级别为窗口模式dwFlags = DDSCL_NORMAL;lpDD-SetCooperativeLevel(hwnd, dwFlags);/创建主页面ZeroMemory(&ddsd, sizeof(ddsd);ddsd.dwSize = sizeof(ddsd);ddsd.dwFlags = DDSD_CAPS;ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;lpDD-CreateSurface(&ddsd, &lpDDSFront, NULL);/创建离屏页面ddsd.dwFlags = DDSD_C
29、APS | DDSD_WIDTH | DDSD_HEIGHT; ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;RECT rect;GetClientRect(hwnd, &rect);forewidth=rect.right-rect.left;foreheight=rect.bottom-rect.top;GetRect(&backrect, 0, 0, 433,348);ddsd.dwWidth = backwidth=forewidth;ddsd.dwHeight = backheight=foreheight;lpDD-Cre
30、ateSurface( &ddsd, &lpDDSBack, NULL );/创建老鼠页面ddsd.dwWidth = 124;ddsd.dwHeight = 425;lpDD-CreateSurface( &ddsd, &lpDDSMouse0, NULL );lpDD-CreateSurface( &ddsd, &lpDDSMouse1, NULL );lpDD-CreateSurface( &ddsd, &lpDDSMouse2, NULL );DDReLoadBitmap(lpDDSMouse0, MOUSE00.BMP)
31、;9 / 30 文档可自由编辑打印DDReLoadBitmap(lpDDSMouse1, MOUSE01.BMP);DDReLoadBitmap(lpDDSMouse2, MOUSE02.BMP);DDSetColorKey(lpDDSMouse0,RGB(0,0,255);DDSetColorKey(lpDDSMouse1,RGB(0,0,255);DDSetColorKey(lpDDSMouse2,RGB(0,0,255);/创建木锤ddsd.dwWidth = 68;ddsd.dwHeight = 136;lpDD-CreateSurface( &ddsd, &lpDDS
32、Hammer, NULL );DDReLoadBitmap(lpDDSHammer, HAM.BMP);DDSetColorKey(lpDDSHammer,RGB(0,0,255);/创建火花ddsd.dwWidth = 68;ddsd.dwHeight = 24;lpDD-CreateSurface( &ddsd, &lpDDSBow, NULL );DDReLoadBitmap(lpDDSBow, Bow.BMP);DDSetColorKey(lpDDSBow,RGB(255,0,127);/创建标题ddsd.dwWidth = 319;ddsd.dwHeight = 56
33、;lpDD-CreateSurface( &ddsd, &lpDDSLogo, NULL );DDReLoadBitmap(lpDDSLogo, logo.BMP);DDSetColorKey(lpDDSLogo,RGB(0,0,255);/创建背景ddsd.dwWidth = 433;ddsd.dwHeight = 348;lpDD-CreateSurface( &ddsd, &lpDDSBk, NULL );DDReLoadBitmap(lpDDSBk, BK.BMP);10 / 30 文档可自由编辑打印/创建时间ddsd.dwWidth = 45;ddsd
34、.dwHeight = 13;lpDD-CreateSurface( &ddsd, &lpDDSTime, NULL );DDReLoadBitmap(lpDDSTime, Time.BMP);DDSetColorKey(lpDDSTime,RGB(255,0,127);/创建数字ddsd.dwWidth = 260;ddsd.dwHeight = 38;lpDD-CreateSurface( &ddsd, &lpDDSHamfig, NULL );DDReLoadBitmap(lpDDSHamfig, Hamfig.BMP);DDSetColorKey(lpD
35、DSHamfig,RGB(255,0,127);/创建数字ddsd.dwWidth = 160;ddsd.dwHeight = 23;lpDD-CreateSurface( &ddsd, &lpDDSFig, NULL );DDReLoadBitmap(lpDDSFig, fig.BMP);DDSetColorKey(lpDDSFig,RGB(255,0,127);/创建分数页面ddsd.dwWidth = 43;ddsd.dwHeight = 25;lpDD-CreateSurface( &ddsd, &lpDDSScore0, NULL );lpDD-Cre
36、ateSurface( &ddsd, &lpDDSScore1, NULL );lpDD-CreateSurface( &ddsd, &lpDDSScore2, NULL );DDReLoadBitmap(lpDDSScore0, Score01.BMP);DDReLoadBitmap(lpDDSScore1, Score02.BMP);DDReLoadBitmap(lpDDSScore2, Score03.BMP);DDSetColorKey(lpDDSScore0,RGB(255,0,127);DDSetColorKey(lpDDSScore1,RGB(25
37、5,0,127);11 / 30 文档可自由编辑打印DDSetColorKey(lpDDSScore2,RGB(255,0,127);/创建 Clipper 裁剪器lpDD-CreateClipper(0, &lpClipper, NULL);lpClipper-SetHWnd(0, hwnd);lpDDSFront-SetClipper(lpClipper);return TRUE;3.1.5 InitData()函数 在本次设计中的作用是数据初始化。实现老鼠洞位置数据的初始化,老鼠头位置的初始化。本次设计中的具体定义:void InitData()int i;bActive = t
38、rue;delay = 5;dwLastTickCount = 0;hit = false;get = false;time = 20;score = 0;RECT Window;GameStatus = 0;GetClientRect(hwnd, &Window);pt.x=pt.y=0;ClientToScreen(hwnd, &pt);/初始化老鼠洞位置holepos0.x = 24;holepos0.y = 215;12 / 30 文档可自由编辑打印holepos1.x = 160;holepos1.y = 215;holepos2.x = 296;holepos2.y
39、 = 215;holepos3.x = 1;holepos3.y = 150;holepos4.x = 137;holepos4.y = 150;holepos5.x = 274;holepos5.y = 150;holepos6.x = 32;holepos6.y = 87;holepos7.x = 159;holepos7.y = 87;holepos8.x = 287;holepos8.y = 87;/初始化老鼠头位置for (i = 0 ;i 9;i+)mouseposi.x = holeposi.x + 25;mouseposi.y = holeposi.y +15;mousewid
40、th = 62;mouseheight = 62;/初始化老鼠洞for (i =0 ;i2)delay -= 2;break;case VK_ESCAPE:MessageBox(hwnd,送给你的.:)n From:n 耗子nn ,关于这个游戏,MB_OK);PostQuitMessage(0);break;break;3.1.10 WM_LBUTTONUP窗口消息当光标在窗口客户区时,用户释放鼠标左键时发出的消息。如果鼠标没有捕获,这个消息被送到光标下的窗口。否则,该消息发布到捕获鼠标的窗口。程序如下:case WM_LBUTTONUP: hit = false;break;3.1.11 W
41、M_DESTROY:WM_DESTROY 是关闭程序的,关闭程序时弹出对话框。程序如下:case WM_DESTROY:MessageBox(hwnd,送给你的.:)nFrom:n 关于这个游戏,MB_OK);PostQuitMessage(0);break;3.1.12 WM_MOUSEMOVE:作用是鼠标移动对应的坐标。程序如下:15 / 30 文档可自由编辑打印case WM_MOUSEMOVE:pos.x = LOWORD(lParam);pos.y = HIWORD(lParam);break;3.1.13 WM_TIMERc+中定时器 告诉 windows 一个时间间隔,然后 wi
42、ndows 以此时间间隔周期性触发程序。程序如下:case WM_TIMER:if (bActive)switch (wParam)case 1:StepAll();break;case 2:time -;break;break;default:return DefWindowProc(hwnd,message,wParam,lParam);break;return 0;3.1.14 hwnd 的作用 介绍如下程序:hwnd = CreateWindow(/设计窗口szClassName,打老鼠,WS_SYSMENU|WS_CAPTION|WS_MINIMIZEBOX|WS_POPUP,/窗口
43、坐标180,/窗口的位置程序框顶点到显示框顶点之间是 180 和 8016 / 30 文档可自由编辑打印80,433,/窗口的长宽348,HWND_DESKTOP,NULL,hInstance,NULL);3.1.15 ShowWindow(hwnd,nMode);/显示窗口 hwnd3.1.16 UpdateWindow(hwnd);/更新窗口3.1.17 InitData()如下程序含义定义的 SetTimer(窗口中设置时钟,时钟的编号,时钟的速度,NUll) 。单位是毫秒,表示 1000 毫秒的时钟,滴答一下。设置时钟的目的是有消息 timer, 每滴答一下 ,响应消息 ,执行消息响应
44、。程序如下:SetTimer(hwnd,1,200,NULL);SetTimer(hwnd,2,1000,NULL);3 程序调试3.1 调试成果及讲解 3.1.1 三种种类的老鼠17 / 30 文档可自由编辑打印图 3-1如图 3-1 土黄老鼠是可爱的老鼠,是普通地鼠,分数也普通。图 3-2如图 3-2 粉红色老鼠头上有个可爱的蝴蝶结,不能随便打,会倒扣分数。18 / 30 文档可自由编辑打印图 3-3如图 3-3 黑老鼠有凶恶的眼神,速度很快,打击难度高,分数也高。3.2 运行效果初始:图 3-4点击左键跳出如下对话框,点击确定,进入游戏。19 / 30 文档可自由编辑打印图 3-5游戏结
45、束 出现如下对话框。点击确定 ,再来一局。20 / 30 文档可自由编辑打印再玩一局破纪录后出现如下对话框,记录刷新。图 3-6打中的老鼠会头金星,出现如下星星:21 / 30 文档可自由编辑打印5 心得体会在学习 C+以前,我认为 C+只是在 C 语言的基础上的一种延伸,认为只要学过 C 语言,就可以用 C 语言的那种设计思想来学习 C+、设计 C+程序。正是由于抱了这种错误的思想,使我在一开始学习 C+的时候遇到了很大的困难,我没有办法体会面向对象的设计思想,我在学习这门课的时候老是想着实现这个函数功能的具体过程,而没太注意对象分类的重要性。随着课程学习的深入,我感觉到了利用类和对象、继承
46、、封装等一系列知识可以把我们程序中很多繁杂、重复的部分省略掉,还可以解决一些利用面向过程的设计思想无法解决的问题,我自己也试着编写一些小的 C+程序,当然在这个过程中遇到了很多困难,其中调试带来的困难让我无法忘记,在调试程序的同时,我也总结出来了一些调试的小技巧,让我在 C 语言课程设计中也受用匪浅。虽然现在仍然会有一些问题不能解决比如插入透明图片的问题。但是在今后的学习和努力中会发现更多的东西,更加的进步。在学习这门课的过程中,我感受到了自己亲自动手编程序、调程序的重要性,我们要熟悉 C+的语法、体会调试的思想,最好的一个手段就是自己动手编程、调试,这会比我们一味的看书效果好得多。另外,我还
47、感觉到一个好的程序编出来需要很多人的团结合作。我在检查自己编写的程序是否有 BUG 未被找出的时候,我会让我的同学作为一个程序使用者来找出未发现的BUG 并提出改进意见,这让我们的工作更加高效。很高兴能够了解到 C+的神奇魅力和面向对象程序设计的独特思想,它为我今后的程序设计奠定了基础。感谢老师对我们的悉心教授!22 / 30 文档可自由编辑打印参考文献参考文献1 谭浩强, C 程序设计 ,清华大学出版社2 刘振安,孙忱,刘燕君, C 程序设计课程设计 ,机械工业出版社3 汪诗林, 数据结构算法与应用 ,机械工业出版社4 陈锦昌,赵明秀.C 语言计算机绘图教程.华南理工大学出版社.1998.9
48、23 / 30 文档可自由编辑打印附录(部分主要程序)#include #include #include ddutil.h#include stdio.h#include resource.h/函数声明INT UpdateFrame();LRESULT CALLBACK WindowFunc(HWND,UINT,WPARAM,LPARAM);BOOL InitDDraw( void );void GetRect(RECT* rect, long left, long top, long width, long height);void Flip(void);void DrawAll();vo
49、id InitData();void CheckHit();void StepAll();void StartGame();void DrawNumber(LPDIRECTDRAWSURFACE dd,LPDIRECTDRAWSURFACE ss,int num,int x,int y,int width,int height);/全局变量char szClassName = ForEpork;HWND hwnd;/showwindow 函数中whnd 的定义HINSTANCE hInst;BOOL bActive;DWORD delay;/延时DWORD dwTickCount,dwLast
50、TickCount;/关于游戏的全局变量BOOLhit,get;POINTpos;/木锤位置intforewidth, foreheight;/前台页面的宽度和高度RECTbackrect;/后台页面映射矩形intbackwidth, backheight;/后台页面的宽度和高度intmouse9;/老鼠洞出现东东的纪录POINTholepos9;/老鼠洞的位置POINTmousepos9;/老鼠头的位置intstatus9;/老鼠状态,0-4intbehit9;/老鼠各个被打的纪录intmousewidth;intmouseheight;POINT pt;inttime;/剩余时间intsc
51、ore;/分数intGameStatus;/游戏状态2 / 30 文档可自由编辑打印/DirectDraw 变量LPDIRECTDRAW lpDD;LPDIRECTDRAWCLIPPER lpClipper;LPDIRECTDRAWSURFACE lpDDSFront; /以下均为DirectDrawSurface 对象LPDIRECTDRAWSURFACE lpDDSBack; LPDIRECTDRAWSURFACE lpDDSMouse3;LPDIRECTDRAWSURFACE lpDDSHammer;LPDIRECTDRAWSURFACE lpDDSBk;LPDIRECTDRAWSURF
52、ACE lpDDSLogo;LPDIRECTDRAWSURFACE lpDDSBow;LPDIRECTDRAWSURFACE lpDDSFig;LPDIRECTDRAWSURFACE lpDDSHamfig;LPDIRECTDRAWSURFACE lpDDSTime;LPDIRECTDRAWSURFACE lpDDSScore3;INT WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nMode)/与 main 函数类似 是函数的入口MSG msg;/消息,基于消息的编程 什么是消息?
53、操作系统封装消息 变成结构/在 Windows 中发生的一切都可以用消息来表示,消息用于告诉操作系统发生了什么,/所有的 Windows 应用程序都是消息驱动的。 一个消息是由消息的名称(UINT)和两个参数(WPARAM, LPARAM)组成。WNDCLASSEX wcl;wcl.cbClsExtra = 0;wcl.cbSize = sizeof(WNDCLASSEX);wcl.cbWndExtra = 0;wcl.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH)/WHITE_BRUSH 表示窗口的颜色是白色的;wcl.hCursor
54、 = LoadCursor(NULL,IDC_ARROW);/LoadCursor 光标wcl.hIcon = LoadIcon(hInstance,IDI_ICON1);/LoadIcon 图标wcl.hIconSm = LoadIcon(NULL,IDI_WINLOGO);/logowcl.hInstance = hInstance;wcl.lpfnWndProc = WindowFunc;wcl.lpszClassName = szClassName;wcl.lpszMenuName = NULL;wcl.style = 0;if (!RegisterClassEx(&wcl)
55、return 0;3 / 30 文档可自由编辑打印hwnd = CreateWindow(/设计窗口szClassName,打老鼠,WS_SYSMENU|WS_CAPTION|WS_MINIMIZEBOX|WS_POPUP,/窗口坐标180,/窗口的位置程序框顶点到显示框顶点之间是 180 和 8080,433,/窗口的长宽348,HWND_DESKTOP,NULL,hInstance,NULL);ShowWindow(hwnd,nMode);/显示窗口 hwndUpdateWindow(hwnd);/更新窗口if (!InitDDraw()MessageBox(GetActiveWindow
56、(), 初始化 DirectDraw 过程中出错!请检查你是否正确的安装了 DirectX。, Error, MB_OK );return 0;hInst = hInstance;InitData();SetTimer(hwnd,1,200,NULL);/(窗口中设置时钟,时钟的编号,时钟的速度,NUll)单位是毫秒 快SetTimer(hwnd,2,1000,NULL);/表示 1000 毫秒的时钟 滴答一下 慢/设置时钟的目的是有消息timer 每滴答一下 响应消息 执行消息响应while(1)if( PeekMessage(&msg,NULL,0,0,PM_NOREMOVE)/消息循环if (!GetMessage(&msg,NULL,0,0)/接收消息return msg.wParam;TranslateMessage(&msg);/翻译消息DispatchMessage(&msg);/处理消息else if( bActive)UpdateFrame();else4 / 30 文档可自由编辑打印WaitMessage();Kill
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 护理质控组长护理质量控制效果评价
- 护理警示教育:常见事故案例分析
- 山东省济宁市2026年5月九年级道德与法治中考模拟冲刺试卷(含答案)
- 民间工艺品制作工安全素养能力考核试卷含答案
- 旅游团队领队安全理论测试考核试卷含答案
- 2026年新科教版高中高一数学上册第一单元集合关系运算卷含答案
- 2026年新科教版高中高一地理下册第一单元人口结构问题分析卷含答案
- 玉米收获机操作工岗前安全文明考核试卷含答案
- 煤制烯烃生产工岗前基础效率考核试卷含答案
- 拜耳法溶出工操作能力评优考核试卷含答案
- 2026山西晋城市城区城市建设投资经营有限公司招聘15人备考题库含答案详解(考试直接用)
- 2026陕西紫光辰济药业有限公司招聘5人笔试备考题库及答案解析
- 2026年注册消防工程师继续教育通关试题库附答案详解(满分必刷)
- 2026年信息处理和存储支持服务行业分析报告及未来发展趋势报告
- (二模)太原市2026年高三年级模拟考试(二)语文试卷(含答案及解析)
- 2026年度职业病防治宣传周培训课件
- 2026食品安全抽查考试试题与答案
- 特种设备考核奖惩制度
- 2026春统编版三年级下册道德与法治每课知识点清单
- 2025浙江温州建设集团有限公司面向社会招聘38人笔试历年难易错考点试卷带答案解析2套试卷
- 油漆车间安全培训
评论
0/150
提交评论