已阅读5页,还剩25页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
盐城工学院盐城工学院 程序设计实践报告程序设计实践报告 段 佳 雯 学学 院院 信息工程 专专 业业 计算机科学与技术计算机科学与技术 班班 级级 Z111 学学 号号 1160704108 学生姓名学生姓名 段佳雯段佳雯 课程成绩课程成绩 完成日期完成日期 2014-1-16 C+程序设计课程设计(2014) II 目目 录录 1 引言.1 1.1 课程设计目的1 1.2 开发工具的介绍1 2 概要设计.2 2.1 系统总体分析.2 2.2 主模块涉及的基本概念及说明2 3 详细设计.7 3.1 主要的函数和定义说明 .7 3.1 调试成果及讲解 .16 5 心得体会.20 参考文献.21 附录22 C+程序设计课程设计(2014) 1 打地鼠游戏程序设计打地鼠游戏程序设计 1 1 引言引言 本程序设计实践是采用 C+语言,在 VC 平台下设计。本课程设计提供了独立实践的机 会,将课本上的理论知识和实际有机的结合起来,充分的锻炼分析解决实际问题的能力。 提高了适应实际,实践编程的能力。 1.1 课程设计目的 程序设计实践主要是培养学生利用系统综合 C+语言进行程序设计的能力。 (1)进一步巩固和复习 C+程序设计的基础知识。 (2)培养结构化程序、模块化程序设计的方法和能力。 (3)了解软件的编制过程及各环节的具体内容。 (4)提高程序调试技巧、软件设计能力和代码规范化等素质。 (5)提高分析问题、解决问题以及实际运用能力。 (6)功能要求: 基本要求:设计的系统界面要美观大方,操作合理,有必要的提示。 创新要求:在基本要求达到后,进行创新设计。对系统进行功能模块分析、控制流程 分析正确。系统设计要实用,编程简练,可用,功能全面,并有一定的容错能力。说明书、 流程图要清楚。要求程序设计合理,用户界面良好,如采用菜单工作方式。 1.2 开发工具的介绍 关于关于 VisualVisual C+C+ Visual C+6.0 是 Microsoft 公司在 1998 年推出的基于 Windows 9X 和 Windows NT 的 优秀集成开发环境。该环境为用户提供了良好的可视化编程环境,程序员可以里利用该开 发环境轻松地访问 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 以上的硬盘。 软件要求:Windows 95/98 或 Windows NT3.51 以上版本。 VC+ 6.0 系统可以在一张 CD 盘上,也可以在“Visual Studio( Visual C+、Visual C+程序设计课程设计(2014) 2 Foxpro)”等产品的第一张 CD 盘上。一般都有一个 VC 的自动安装程序,也可以执行 VC6 目 录下的 setup.exe,在安装包的提示下进行,对初学者可采用“典型安装”方式。 在安装好 VC 6.0 系统后,有时根据需要添加或删除某些部件,可插入 CD 盘重新执行 setup.exe 安装程序,安装程序会检测当前系统安装 VC6 的足件,用户单击“添加删除” 按钮后,在“安装维护”对话框中选定要添加的部件或撤消选定要删除的部件。 与一般的应用软件一样,有以下两种启动方式: (1)通过“开始”按钮,选择“程序”菜单,然后打开“Microsoft Visual studio 6.0 中文版”子菜单中的“Microsoft Visual C+ 6.0 中文版”程序。 (2)用户也可以使用命令行启动 VC。单击“开始”按钮后选择“运行”命令,在“运 行”对话框中输入 c:Program FilesMicrosoft Visual StudioVC98VC6.exe(按默认 盘符和路径安装)即可。 1.3 功能说明:打地鼠是一种非常有趣的益智游戏。游戏进行时,地鼠会不断从洞口 探出头来再缩回去,地鼠头在洞外时,可以通过案件的方式打击地鼠,时间到时游戏结束, 打中地鼠次数越多分数越高,打中红色地鼠会减分,灰色地鼠分数比棕色地鼠分数低。打 破记录可以刷新成绩。点击鼠标左键可以打击地鼠。 2 2 概要设计概要设计 2.1 系统总体分析 开发环境:Microsoft WindowsXP TASM 2.2 主模块涉及的基本概念及说明 2.2.1Message 消息机制 在 Windows 中发生的一切都可以用消息来表示,消息用于告诉操作系统发生了什么, 所有的 Windows 应用程序都是消息驱动的。 一个消息是由消息的名称(UINT)和两个参数 (WPARAM, LPARAM)组成。消息的参数中包含有重要的信息。主要包括程序核心,输入焦 点,消息分类,消息队列,消息循环,消息分类。一个消息由一个消息名称(UINT) ,和两 个参数(WPARAM,LPARAM)组成。 本设计中主要用 Msg 来调用 Messagebox 里的消息。从而来实现鼠标点击实现功能的 操作。例如对鼠标消息而言,LPARAM 中一般包含鼠标的位置信息。Msg 变量是型态为 MSG 的结构。当鼠标在某个窗口内移动时,Windows 会不断地发出鼠标移动消息 WM_MOUSEMOVE,并把鼠标的最新位置传给该窗口。如果在窗口的范围内按下鼠标左键,系 统就会发出“按下左键”的 WM_LBUTTONDOWN 消息给该窗口,等到用户放开按键后,再发出 “放开左键”的 WM_LBUTTONUP 消息给该窗口。消息可以看做是一个动作。操作系统把消息 C+程序设计课程设计(2014) 3 给封装成结构。 本设计中主要用 WindowFunc 函数来调用消息循环。Windows 为当前执行的每个 Windows 程序维护一个消息队列。在发生输入事件之后,Windows 将事件转换为一个消息并 将消息放入程序的消息队列中。程序通过执行一块称之为消息循环的程序代码从消息队列 中取出消息。本程序中在时钟运行里运用到了消息循环。例 while(1) if( PeekMessage( TranslateMessage(/翻译消息 DispatchMessage(/处理消息 else if( bActive) UpdateFrame(); else WaitMessage(); KillTimer(hwnd,1);/时钟停止 return msg.wParam; 消息循环的过程如图 11 所示: 图 1-1 在程序的时钟里也运用到了消息队列的思想。消息队列就是 Windows 中有一个系统 消息队列,对于每一个正在执行的 Windows 应用程序,系统为其建立一个“消息队列” ,即 C+程序设计课程设计(2014) 4 应用程序队列,用来存放该程序可能创建的各种窗口的消息。应用程序中含有一段称作 “消息循环”的代码,用来从消息队列中检索这些消息并把它们分发到相应的窗口函数中。 在消息循环中没有消息的话就排队等待。没有消息就创建空传消息。 2.2.2DirectDraw DirectDraw 是通过基于 COM 的接口提供服务。在 DirectX 5.0 版本中,这些接口分别 是:IDirectDraw2、IDirectDrawSurface3、IDirectDrawPalette、IDirectDrawClipper 和 IDirectDrawVideoPort。DirectX 的这些组件是向下兼容的,它们仍然支持旧版本中的 所有功能。 DirectDraw 是 DirectX 中的关于视频输入输出的基本部分,使用 DirectDraw 可以 方便地编制出高效的视频处理程序,只要用户的硬件支持 DirectDraw,就能保证你的代码 可以处理它们。 与 DirectX 其它组件一样,只要可能,DirectDraw 就会最高程度的利用硬件执行某特 定功能,并且让那些该硬件还不支持的特性也能用软件仿真的方式加以实现。设备无关性 通常是通过硬件抽象层(HAL:Hardware abstraction layer)实现的。 DirectDraw 主要提供了完成以下任务的工具: 管理多页面 ,直接访问视频 RAM ,换页(Page flipping) ,后台缓存(Back buffering) ,管理调色板(Palette) ,裁剪(Clipping) ,视频端口(Video port) 。 除此之外,DirectDraw 允许开发者在应用程序运行期测定显示硬件的特性,然后,充 分利用主机硬件设备的加速特性为用户提供可能的最优的显示速度和效果。 DirectDraw 对象的创建和准备的每一步骤: 1. 创建 DirectDraw 对象:创建 DirectDraw 对象的一个实例,应该用 DirectDrawCreate API 函数,也可以用 COM 中的 CoCreateInstance 函数。 DirectDrawCreate 用一个全局统一标志符 GUID(Globally Unique IDentifier)来表征显示 设备,在大多数情况下 GUID 为 NULL(使用系统的缺省显示设备,既“空设备” ) ;指针指向 DirectDraw 对象的地址;第三个参数总是 NULL(供将来扩展使用)。下述代码表明了如何创 建一个 DirectDraw 对象,并且检验是否成功。 2.设置显示模式:设置 DirectDraw 应用程序的显示模式需要两步:首先调用 IDirectDraw:SetCooperativeLevel 方法来设定该模式下的要求,一旦确定了要求,再用 IDirectDraw:SetDisplayMode 方法来选择显示分辨率。在改变显示分辨率之前,还必须 通过 IDirectDraw:SetCooperativeLevel 方法来指定 DDSCL_EXCLUSIVE 和 DDSCL_FULLSCREEN 标志。这样能使游戏程序完全控制显示设备,其它的应用程序不能同时 共享显示设备。DDSCL_FULLSCREEN 标志表示将程序设为全屏模式。使用 C+程序设计课程设计(2014) 5 IDirectDraw:SetCooperativeLevel 时,必须向窗口 (HWND)传送一个句柄,让窗口决定 何时非正常地终止应用程序。例如,若发生了 GP 错误或 GDI 被翻转(flip)到了后台缓冲区, 用户就无法访问当前屏幕。为了避免这种情况,DirectDraw 有一个后台等待进程,它俘获 所有发往该窗口的消息,用这些消息来确定应用程序何时终止。如果创建了新的窗口,必 须确定该窗口为活动的,否则,就会有一系列的事件无法继续工作。 3.改变显示模式一旦选择了应用程序的工作模式,就可以使用方法来改变显示模式。 4.创建可翻转表面(Flippable Surface) :设定了显示模式后,必须创建放置应用程 序的表面。 5. 定义表面要求:创建可翻转表面的的第一步是在 DDSURFACEDESC 结构中定义表面的 要求。 6. 创建表面: 填完了 DDSURFACEDESC 结构,就可以使用该结构和 lpDD 了,lpDD 是用 DirectDrawCreate 方法创建的 DirectDraw 对象的指针。 7.取得后台缓冲区的指针: 使用 IDirectDrawSurface:GetAttachedSurface 方法可 以取得后台缓冲区的指针。 8.着色表面: 创建了主表面和后台缓冲区后,DDEX1 使用标准的 Windows GDI 函数将 一些文本提交到主表面和后台缓冲区。一般来讲,当向表面写数据时,该表面就是后台缓 冲区,然后将缓冲区翻转成主表面显示出来。在 DDEX1 中,第一次翻转表面之前有一个重 要的延迟。于是 DDEX1 就将数据写入主缓冲区,避免开始显示时有太长的时间间隔。后面 将会讲到,DDEX1 只在 WM_TIMER 期间向后台写数据。初始化函数或标题头可能会写入主缓 冲区。应该注意的是,一旦使用 IDirectDrawSurface:Unlock 对表面解锁,指向表面的指 针就变成无效,必须再次使用 IDirectDrawSurface:Lock 方法才能获取该表面内存的有效 指针。 9.写表面及翻转表面: 完成了初始化后,DDEX1 开始处理消息循环。在消息循环的过 程中,完成锁定后台缓冲区写入新的文本解锁后台缓冲区翻转表面的过程。 WM_TIMER 包含了写数据和翻转表面的大部分代码。 WM_TIMER 消息的前半部分用于向后台 缓冲区写数据, “phase”变量决定是写主缓冲区消息还是写后台缓冲区消息。如果 phase 为 1,表示写主缓冲区的消息,然后将 phase 改变为 0;若为 0,表示写后台缓冲区的消息, 然后将 phase 改变为 1。注意,两种情况中的消息都是写向后台缓冲区。后台缓冲区写入 了消息后,使用 IDirectDrawSurface:ReleaseDC 方法解锁。 10. 释放 DirectDraw 对象: 当按了 F12 后,DDEX1 程序在退出之前先处理 WM_DESTROY 消息,该消息调用了 finiObjects 函数,而 finiObjects 函数包含了所有的 IUnknown Release 的调用。 11. 将位图调入表面: 如 DDEX1 中一样,doInit 函数是 DDEX2 的初始化函数,两者的 实质一样。 C+程序设计课程设计(2014) 6 12.设置调色板,将位图调入后台缓冲区: 创建了调色板之后,可以通过调用 IDirectDrawSurface:SetPalette 方法将 DirectDrawPalette 对象的指针 ddpal 传送给 主表面。 13. 从屏外表面位块传输: DDEX2 同 DDEX1 基本相同。DDEX2 打开一个位图文件并将它 送往后台缓冲区,然后翻转后台缓冲区和主表面。但这对显示位图并不特别理想,DDEX3 扩展了 DDEX2 的功能,它加入了两个屏外缓冲区,每个缓冲区都存储一个位图。 14. 将位图文件调入屏外表面: 创建了两个屏外表面后,DDEX3 使用了 InitSurfaces 函数将位图从 Frntback.bmp 文件装入到两个表面。InitSurfaces 函数使用了 DDCopyBitmap 函数调入两个位图。 15. 将屏外表面位位块传输到后台缓冲区:WM_TIMER 包含了写表面和翻转表面的代码。 在 DDEX3 中,它选择适当的屏外表面,并将其位块传输到后台缓冲区。 16. 创建动画: 1、Color Key 和位图动画在 DDEX3 例中描述了将位图放入屏外缓冲区 的一种主要方式。DDEX4 则使用了将背景和一系列的精灵(sprite,本例中精灵是圆环)装 入屏外表面的技术,然后使用, IDirectDrawSurface:BltFast 方法将屏外表面的各部分 拷贝到后台缓冲区。doInit 函数除了具有前面例子中的功能外,还包括了为精灵设置 Color key 的代码。Color key 是用于设置透明度的颜色值。当使用硬件块写方式时,矩型 区域内除了设为 color key 的像素,其它的像素都被块写,由此在表面上产生非矩型的精 灵。 17.动态改变调色板:DDEX5 描述了任何在程序运行时动态地改变调色板,尽管在游戏 中这并不总是用到。DirectDraw 确实能很好地控制调色板。 18. 替换调色板:DDEX5 中的 updateFrame 函数同 DDEX4 中的基本相同,先将背景块写 入后台缓冲区,再将 3 个红色圆环块写到前景。 19. 使用覆盖表面(Overlay): 创建一个主表面要使用覆盖表面,必须先要初始化一个 主表面,覆盖表面将显示在该主表面上。检测硬件对覆盖的支持 初始化 DirectDraw 后, 需要检测设备是否支持覆盖表面。因为 DirectDraw 不能仿真覆盖,所以如果硬件不支持覆 盖,就不能继续下面的工作。你可以用方法获取硬件设备驱动程序的能力检测覆盖支持。 在调用该方法之后,查看 DDCAPS 结构中的 dwFlags 成员是否包含有 DDCAPS_OVERLAY 标志。 若有就表明支持覆盖,否则就不支持。创建一个覆盖表面如果知道显示设备支持覆盖表面, 就可以创建一个。因为没有指明设备怎样支持覆盖表面的标准,所以不能够期望创建任意 大小的像素格式的表面。另外,也不要期望第一次创建覆盖表面就会成功。因此,必须作 好准备进行多次创建的尝试,直到有一个能够工作为止。Mosquito 程序在创建表面时遵循 “best case to worst case”的原则,首先尝试创建一个三缓冲页翻转复杂覆盖表面。如 果尝试失败,程序就改变方法尝试用其它通用的迅速格式来配置。显示覆盖表面创建了覆 盖表面之后就可以显示它了。通常,硬件在用于显示覆盖的矩形的位置和像素格式上加上 C+程序设计课程设计(2014) 7 对齐约束。另外,还需要经常通过调整目的矩形的宽度来说明最小要求的拉伸因子以成功 地显示覆盖表面。更新覆盖的显示位置显示覆盖表面之后,有时可能就不需要对覆盖做其 它的操作了。但有些软件还需要重新放置覆盖,改变覆盖的显示位置。隐藏覆盖表面如果 不再需要一个覆盖表面或只想不让覆盖可见。UpdateOverlay UpdateOverlay 用于重新定 位一个覆盖页面,或修改其视觉属性。这些页面在创建时必须提 DDSCAPS_OVERLAY 标志。 3 3 详细设计详细设计 3.1 主要的函数和定义说明 3.1.1 WinMain 函数 主函数的入口。和我们以前的 main()函数一样。 本次设计中的具体定义: INT WINAPI WinMain(HINSTANCE 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 wParam,LPARAM lParam)。 3.1.4 InitDDraw()函数 运用了 directdraw 编程,初始化 directdraw。主要作用是创建 DirectDraw 对象, 设置协作级别为窗口模式,创建主页面,创建离屏页面,创建老鼠页面,创建木锤, 创建火花,创建标题,创建背景,创建时间,创建分数页面,创建 Clipper 裁剪器。 本次设计中的具体定义: BOOL InitDDraw() DWORD dwFlags; DDSURFACEDESC ddsd; C+程序设计课程设计(2014) 8 /创建 DirectDraw 对象 DirectDrawCreate(NULL, /设置协作级别为窗口模式 dwFlags = DDSCL_NORMAL; lpDD-SetCooperativeLevel(hwnd, dwFlags); /创建主页面 ZeroMemory( ddsd.dwSize = sizeof(ddsd); ddsd.dwFlags = DDSD_CAPS; ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE; lpDD-CreateSurface( /创建离屏页面 ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT; ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN; RECT rect; GetClientRect(hwnd, forewidth=rect.right-rect.left; foreheight=rect.bottom-rect.top; GetRect( ddsd.dwWidth = backwidth=forewidth; ddsd.dwHeight = backheight=foreheight; lpDD-CreateSurface( /创建老鼠页面 ddsd.dwWidth = 124; ddsd.dwHeight = 425; lpDD-CreateSurface( lpDD-CreateSurface( lpDD-CreateSurface( DDReLoadBitmap(lpDDSMouse0, “MOUSE00.BMP“); C+程序设计课程设计(2014) 9 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( DDReLoadBitmap(lpDDSHammer, “HAM.BMP“); DDSetColorKey(lpDDSHammer,RGB(0,0,255); /创建火花 ddsd.dwWidth = 68; ddsd.dwHeight = 24; lpDD-CreateSurface( DDReLoadBitmap(lpDDSBow, “Bow.BMP“); DDSetColorKey(lpDDSBow,RGB(255,0,127); /创建标题 ddsd.dwWidth = 319; ddsd.dwHeight = 56; lpDD-CreateSurface( DDReLoadBitmap(lpDDSLogo, “logo.BMP“); DDSetColorKey(lpDDSLogo,RGB(0,0,255); /创建背景 ddsd.dwWidth = 433; ddsd.dwHeight = 348; lpDD-CreateSurface( DDReLoadBitmap(lpDDSBk, “BK.BMP“); C+程序设计课程设计(2014) 10 /创建时间 ddsd.dwWidth = 45; ddsd.dwHeight = 13; lpDD-CreateSurface( DDReLoadBitmap(lpDDSTime, “Time.BMP“); DDSetColorKey(lpDDSTime,RGB(255,0,127); /创建数字 ddsd.dwWidth = 260; ddsd.dwHeight = 38; lpDD-CreateSurface( DDReLoadBitmap(lpDDSHamfig, “Hamfig.BMP“); DDSetColorKey(lpDDSHamfig,RGB(255,0,127); /创建数字 ddsd.dwWidth = 160; ddsd.dwHeight = 23; lpDD-CreateSurface( DDReLoadBitmap(lpDDSFig, “fig.BMP“); DDSetColorKey(lpDDSFig,RGB(255,0,127); /创建分数页面 ddsd.dwWidth = 43; ddsd.dwHeight = 25; lpDD-CreateSurface( lpDD-CreateSurface( lpDD-CreateSurface( DDReLoadBitmap(lpDDSScore0, “Score01.BMP“); DDReLoadBitmap(lpDDSScore1, “Score02.BMP“); DDReLoadBitmap(lpDDSScore2, “Score03.BMP“); DDSetColorKey(lpDDSScore0,RGB(255,0,127); DDSetColorKey(lpDDSScore1,RGB(255,0,127); C+程序设计课程设计(2014) 11 DDSetColorKey(lpDDSScore2,RGB(255,0,127); /创建 Clipper 裁剪器 lpDD-CreateClipper(0, lpClipper-SetHWnd(0, hwnd); lpDDSFront-SetClipper(lpClipper); return TRUE; 3.1.5 InitData()函数 在本次设计中的作用是数据初始化。实现老鼠洞位置数据的初始化,老鼠头位置的 初始化。 本次设计中的具体定义: void InitData() int i; bActive = true; delay = 5; dwLastTickCount = 0; hit = false; get = false; time = 20; score = 0; RECT Window; GameStatus = 0; GetClientRect(hwnd, pt.x=pt.y=0; ClientToScreen(hwnd, /初始化老鼠洞位置 holepos0.x = 24; holepos0.y = 215; C+程序设计课程设计(2014) 12 holepos1.x = 160; holepos1.y = 215; holepos2.x = 296; holepos2.y = 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 2)delay -= 2; break; case VK_ESCAPE: MessageBox(hwnd,“送给你的.:)n From:n 耗子nn R“,“关于这个游戏“,MB_OK); PostQuitMessage(0); break; break; 3.1.10 WM_LBUTTONUP 窗口消息当光标在窗口客户区时,用户释放鼠标左键时发出的消息。如果鼠标没有捕 获,这个消息被送到光标下的窗口。否则,该消息发布到捕获鼠标的窗口。 程序如下: case WM_LBUTTONUP: hit = false; break; 3.1.11 WM_DESTROY: WM_DESTROY 是关闭程序的,关闭程序时弹出对话框。 程序如下: case WM_DESTROY: MessageBox(hwnd,“送给你的.:)nFrom:n “关于这个游戏“,MB_OK); PostQuitMessage(0); break; 3.1.12 WM_MOUSEMOVE: 作用是鼠标移动对应的坐标。 程序如下: C+程序设计课程设计(2014) 15 case WM_MOUSEMOVE: pos.x = LOWORD(lParam); pos.y = HIWORD(lParam); break; 3.1.13 WM_TIMER c+中定时器 告诉 windows 一个时间间隔,然后 windows 以此时间间隔周期性触发程 序。 程序如下: 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,/窗口坐标 180,/窗口的位置程序框顶点到显示框顶点之间是 180 和 80 C+程序设计课程设计(2014) 16 80, 433,/窗口的长宽 348, HWND_DESKTOP, NULL, hInstance, NULL); 3.1.15 ShowWindow(hwnd,nMode);/显示窗口 hwnd 3.1.16 UpdateWindow(hwnd);/更新窗口 3.1.17 InitData() 如下程序含义定义的 SetTimer(窗口中设置时钟,时钟的编号,时钟的速度,NUll) 。 单位是毫秒,表示 1000 毫秒的时钟,滴答一下。设置时钟的目的是有消息 timer, 每滴答一下 ,响应消息 ,执行消息响应。 程序如下: SetTimer(hwnd,1,200,NULL); SetTimer(hwnd,2,1000,NULL); 3 程序调试 3.1 调试成果及讲解 3.1.1 三种种类的老鼠 C+程序设计课程设计(2014) 17 图 3-1 如图 3-1 土黄老鼠是可爱的老鼠,是普通地鼠,分数也普通。 图 3-2 如图 3-2 粉红色老鼠头上有个可爱的蝴蝶结,不能随便打, 会倒扣分数。 C+程序设计课程设计(2014) 18 图 3-3 如图 3-3 黑老鼠有凶恶的眼神,速度很 快,打击难度高,分数也高。 3.2 运行效果 初始: 图 3-4 点击左 键跳出如下 对话框,点 击确定,进 入游戏。 C+程序设计课程设计(2014) 19 图 3-5 游戏结束 出现如下对话框。点击确定 ,再来一局。 C+程序设计课程设计(2014) 20 再玩一局破纪录后出现如下对话框,记录刷新。 图 3-6 打中的老鼠会头金星,出现如下星星: C+程序设计课程设计(2014) 21 5 心得体会 在学习 C+以前,我认为 C+只是在 C 语言的基础上的一种延伸,认为只要学过 C 语言, 就可以用 C 语言的那种设计思想来学习 C+、设计 C+程序。正是由于抱了这种错误的思想, 使我在一开始学习 C+的时候遇到了很大的困难,我没有办法体会面向对象的设计思想, 我在学习这门课的时候老是想着实现这个函数功能的具体过程,而没太注意对象分类的重 要性。 随着课程学习的深入,我感觉到了利用类和对象、继承、封装等一系列知识可以把我 们程序中很多繁杂、重复的部分省略掉,还可以解决一些利用面向过程的设计思想无法解 决的问题,我自己也试着编写一些小的 C+程序,当然在这个过程中遇到了很多困难,其 中调试带来的困难让我无法忘记,在调试程序的同时,我也总结出来了一些调试的小技巧, 让我在 C 语言课程设计中也受用匪浅。虽然现在仍然会有一些问题不能解决比如插入透明 图片的问题。但是在今后的学习和努力中会发现更多的东西,更加的进步。 在学习这门课的过程中,我感受到了自己亲自动手编程序、调程序的重要性,我们要 熟悉 C+的语法、体会调试的思想,最好的一个手段就是自己动手编程、调试,这会比我 们一味的看书效果好得多。 另外,我还感觉到一个好的程序编出来需要很多人的团结合作。我在检查自己编写的 程序是否有 BUG 未被找出的时候,我会让我的同学作为一个程序使用者来找出未发现的 BUG 并提出改进意见,这让我们的工作更加高效。 很高兴能够了解到 C+的神奇魅力和面向对象程序设计的独特思想,它为我今后的程 序设计奠定了基础。感谢老师对我们的悉心教授! C+程序设计课程设计(2014) 22 参考文献参考文献 1 谭浩强, C 程序设计 ,清华大学出版社 2 刘振安,孙忱,刘燕君, C 程序设计课程设计 ,机械工业出版社 3 汪诗林, 数据结构算法与应用 ,机械工业出版社 4 陈锦昌,赵明秀.C 语言计算机绘图教程.华南理工大学出版社.1998.9 C+程序设计课程设计(2014) 23 附录(部分主要程序) #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(); void 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,dwLastTickCount; /关于游戏的全局变量 BOOLhit,get; POINTpos;/木 锤位置 intforewidth, foreheight;/ 前台页面的宽度和高度 RECTbackrect;/后 台页面映射矩形 intbackwidth, backheight;/ 后台页面的宽度和高度 intmouse9;/老 鼠洞出现东东的纪录 POINTholepos9;/老 鼠洞的位置 POINTmousepos9;/老 鼠头的位置 intstatus9;/老 鼠状态,0-4 intbehit9;/老 鼠各个被打的纪录 intmousewidth; intmouseheight; POINT pt; inttime;/剩 余时间 intscore;/分 数 intGameStatus;/游 戏状态 C+程序设计课程设计(2014) 2 /DirectDraw 变量 LPDIRECTDRAW lpDD; LPDIRECTDRAWCLIPPER lpClipper; LPDIRECTDRAWSURFACE lpDDSFront; /以下均为 DirectDrawSurface 对象 LPDIRECTDRAWSURFACE lpDDSBack; LPDIRECTDRAWSURFACE lpDDSMouse3; LPDIRECTDRAWSURFACE lpDDSHammer; LPDIRECTDRAWSURFACE lpDDSBk; LPDIRECTDRAWSURFACE 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;/消息,基于消息的编 程 什么是消息?操作系统封装消息 变成 结构 /在 Windows 中发生的一切都可 以用消息来表示,消息用于告诉操作系统 发生了什么, /所有的 Windows 应用程序都是 消息驱动的。 一个消息是由消息的名称 (UINT)和两个参数(WPARAM, LPARAM)组 成。 WNDCLASSEX wcl; wcl.cbClsExtra = 0; wcl.cbSize = sizeof(WNDCLASSEX); wcl.cbWndExtra = 0; wcl.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH)/WHITE_B RUSH 表示窗口的颜色是白色的; wcl.hCursor = LoadCursor(NULL,IDC_ARROW);/LoadCur sor 光标 wcl.hIcon = LoadIcon(hInstance,“IDI_ICON1“);/Lo adIcon 图标 wcl.hIconSm = LoadIcon(NULL,IDI_WINLOGO);/logo wcl.hInstance = hInstance; wcl.lpfnWndProc = WindowFunc; wcl.lpszClassName = szClassName; wcl.lpszMenuName = NULL; wcl.style = 0; if (!RegisterClassEx( C+程序设计课程设计(2014) 3 hwnd = CreateWindow(/设计窗 口 szClassName, “打老鼠“, WS_SYSMENU|WS_CAPTION|WS_MINIMIZ EBOX|WS_POPUP,/窗口坐标 180,/窗口的位置程序框顶 点到显示框顶点之间是 180 和 80 80, 433,/窗口的长宽 348, HWND_DESKTOP, NULL, hInstance, NULL); ShowWindow(hwnd,nMode);/显 示窗口 hwnd UpdateWindow(hwnd);/更新窗 口 if (!InitDDraw() MessageBox(GetActiveWindow(), “ 初始化 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( TranslateMessage(/翻译消 息 DispatchMessage(/处理消息 else if( bActive) UpdateFrame(); else C+程序设计课程设计(2014) 4 WaitMessage(); KillTimer(hwnd,1);/时钟停止 return msg.wParam; LRESULT CALLBACK WindowFunc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam) /窗口构造函数 注册函数 自动调用 处理消息循环 switch(me
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026福建厦门市大同小学招聘8人笔试题库附参考答案详解【巩固】
- 2026福建莆田湄洲日报社招聘投递员5名笔试题库(历年真题)附答案详解
- 2026广东江门台山市红十字会招聘编外人员1人笔试题库审定版附答案详解
- 2026河南安阳市滑县农业农村局招募特聘农技(防疫)员35人笔试题库带答案详解(培优B卷)
- 2026年销售管理(销售技巧培训)试题及答案
- 2026年信息安全(安全审计)试题及答案
- 人工智能驱动的普惠金融模型优化
- 保险业与金融科技协同发展
- 暑假作业03 相交线与平行线(一)-【暑假强化练】七升八数学(北师大版)(原卷版)
- 2026广东广州南沙人力资源发展有限公司招聘急诊医生辅助岗位2人(外聘项目)备考题库(原创题)附答案详解
- 2025年留疆战士考试题库(附答案)
- DB14∕T 3525-2025 防汛抗旱物资储备管理规范
- 2026年河南省职业病诊断医师资格(化学中毒类)高分突破必练试题库(含答案)
- 2025四川紧缺选调《综合测试》试题及答案
- 北京市西城区2024-2025学年五年级上学期期末数学试题
- 2025年高级经济师知识产权考试历年模拟试题及答案
- 塑料氧指数测试工艺考核试卷及答案
- 2025年中国电力电子散热器市场调查研究报告
- 2025年中国电源散热器配件市场调查研究报告
- 暑期防溺水家长会课件教学
- JJF 1033-2023计量标准考核规范
评论
0/150
提交评论