1、 目录 一、 需求分析 1 1.课程设计目的 1 2.程序所实现的功能 1 二、 设计内容 1 1. 主模块图 1 2.1. 主程序流程图 2 2.2 用例图 2 2.3 主程序调用关系图 3 2.4 函数主要调用关系图 3 三、 设计方案论述 3 四、调试分析 4 1.实际完成的情况 4 2.程序的性能分析 4 3.上机过程中出现的问题及其解决方案 4 4.程序中可以改进、扩充的功能及设计实现构想 4 五、用户手册 4 六、设计总结 5 七、程序中主要的功能函数 6 八、主要参考文献 6 九、附录 61 一、需求分析 1.课程设计目的 ( 1)运用 C+语言设计拼图游戏 具有极强的实践性,加
2、强我们对 C+课程基础 知识点的理解掌握和 灵活运用理能力, 培养 实际分析问题能力,养成良好的编程习惯;了解 C+面向对象的设计方法与技巧, 有效地、深刻地理解课程内容,体会理论、方法和设计原则;培养分析实际问题和解决问题的能力,具备使用面向对象程序设计开发工具设计实际系统的能力。 (2)进一步 领会程序设计的特点和应用,提高 运 用 C+ 以及 面向对象知识解决实际问题的能力,初步掌握 MFC 编程的基本功能,掌握一种可视化编程的方法,学习使用 CStatic 控制操作位图,加强对 C+面向对象程序设计的理解。 (3)掌握 用 C+ 编写面向对象的实用程序的设计方法, 对面向对象方法和思想
3、增加感性的认识 , 学会利用 C+程序设计语言 编写出一些短小、可靠的 Windows 实用程序,切实提高面向对象的程序设计能力, 为后续的相关课程的学习打下基础。 (4)锻炼实际的编程能力,提高调查资料、查阅技术文献、资料以及编写软件设计文档的能力,提高自学编程的能力。 2.程序所实现的功能 (1)本程序除了实现了拼图所要求的基本功能外,还添加了背景音乐、计算步数和游戏所用的时间,当游戏开始时背景音乐自动循环播放,步数随 player 操作自动增加,时间自动增加。 (2)进入游戏界面后, player 可以在菜单栏中选择游戏的难度、图片风格和拼图图像,亦可以自定义图片,若选择“简 单”,程序
4、将图片分成 9 块,若选择“困难”,程序将图片分成 16 块 . (3)单击“重置”或按 F3 菜单项会弹出一个对话框让用户确认是否重置游戏。 (4)单击任意图象,图像将随机排列,并开始计时和记步,用户通过鼠标单击空格周围的图片来改变其位置,用户没单击一次,步数增加一次。 (5)游戏中用户可通过单击“提示”菜单项或按 F4 来查看图像的缩略图及游戏相关信息。 (6)游戏状态栏显示用户所用时间及步数,成功时状态栏给出提示信息和所花费时间、步数,用户可选择其他图像或难度进行游戏。 二、设计内容 1.主模块图 2 2.1 主程序流程图 2.2 用例图 : 3 2.3主程序类调用关系图 用户 选择背景
5、图片 选择难度级别 开始游戏 是否选择 原图提示 不显示 显示原图 拼图成功 返回重新选择背景图片及难度级别 4 2.4 CPictureDlg 类中成员函数主要调用关系图 三、 设计方案论述 本程序有一个 CPictureDlg类,它公有继承 CDialog类的一些性质。 CDialog类中包括位图的读入和显示,拼图游戏中的 Picture都是位图资源。在游戏程序中,采用 Static Text即静态文本控件来显示位图。静态文本控件的功能比较简单,可显示字符串,图标,位图。 先为对话框的“游戏”中的菜单项“容易”和“困难”添加消息响应为另外还需为 CPictureDlg类添加 BOOL型变量
6、 Easy来标识游戏的难度(分为 9格或 16格),同时添加 BOOL型变量 IsRnd用来标识图格是否进行了随机位置的初始化,接下来为 CPictureDlg对话框添加 16个 Static控 件(可以先设置好一个控件后,再通过复制得到其它的控件),并设置它们的属性: ID设为 IDC_IMAGE0到 IDC_IMAGE15, Tabstop请勾上, Type属性设为 Bitmap,控件添加好了后,我们需要添加一个 CStatic类型的数组 m_Image16,与这 16个 Static控件相关联,通过这个操作这个数组的下标来控制这 16个控件对图像进行分格显示。建立关联的代码应写在CPic
7、tureDlg类中系统生成的 OnInitDialog()函数体内,这个函数是整个对话框程序运行的入口,相当于一个 main函数, 在这个函数体里,我们也需要为之前声明的变量提供初始值,即将变量初始化,变量没有初始化的后果通常会造成内存泄露,使程序在运行时出现莫名奇妙的错误。判断游戏是否完成的函数 IsWin(),只要所有的 Static控件都回到了相应的位置,就可以认为用户己完成了拼图,即游戏完成。 四、调试分析 5 1.实际完成的情况 ( 1)完成的功能: 本程序除了实现了拼图所要求的基本功能外,还添加了背景音乐、计算步数和游戏所用的时间,当游戏开始时背景音乐自动循环播放,步数随 play
8、er 操作自动增加,时间自动增加。 ( 2)支持的数据 类型: BOOL 类型、控件数组类型。 2.程序的性能分析 本程序能够很好的运行,并且画面质量以及音质方面都很高 3.上机过程中出现的问题及其解决方案 1)开始导入图片时,图片不能显示,重新导入 bmp 格式的图片后解决了。 2)开始建立了时间函数 OnTimer,但是游戏运行后时间并不增加,在开始游戏对应的函 数中增加 SetTimer 函数,得到想要的结果。 3)初始设置的快捷键无效,查阅资料后加入 Accelerator 及相应的函数,使得快捷键有效。 4.程序中可以改进、扩充的功能及设计实 现构想。 1)游戏的难度等级有点少,可以
9、适当增加几个等级。 2)游戏未设置根据用户花费的时间和步数判定用户的成绩并进行排名的功能,可以增设,以便用户了解自己玩的水平。 五、 用户手册 1.打开 Picture 文件夹,双击 Ppicture.dsw 标志打开程序,然后运行。 2.开始程序会出现以下欢迎界面: 3.用户需要选择图片、难度和图片风格,然后单击图片开始游戏,计时器开始计时, 用户通过鼠标单击空格周围的图片来改变其位置,用户每单击一次,步数增加一次。 4.游戏中用户可通过单击“提示”菜 单项或按 F4 来查看图像的缩略图及游戏相关信息。 图像缩略图 6 游戏相关信息 5.用户也可以单击菜单栏中的重置或按快捷键 F3 重置图片
10、,会出现提示信息,用户单击确定重置图片。提示框如下: 6.当完成拼图后系统会自动给出成功提示,并显示用户的成绩,用户单击确定后可以选择其他图片或难度继续游戏,也可以选择单击“退出”或按 Esc 退出游戏。 六、设计总结 通过本次课程设计,学习并初步掌握了基于对话框的 MFC程序的设计,并学会了使用CStatic控件操作位图。熟悉了在基于对话框的工程中加入菜单操作、用代码操作菜单、Windows位图文件的基本结构、 Visual C+中对位图资源的操作、 Visual C+中对自定义位图文件的操作、设置相关位图的概念、用 Static控件显示位图以及用 Status Bar显示提示信息和 Vis
11、ual C+随机函数。 在设计过程中,曾遇到了两个瓶颈导致 程序一度无法完成,第一个是位图文件的添加,包括将图片格式转换成 BMP格式、添加相关 Static控件,尤其是对控件图标不熟悉的情况下,7 一时不知道在哪儿添加控件,后来上网查阅并请教同学才得以完成控件的添加,使得程序可以继续完成。不过在程序即将结束的时候,又遇到了一个新的问题,导致程序差点功亏一篑,问题就是图片的缩略图的添加,也就是游戏中的“提示”的应用,当然没有“提示”操作,并不会影响整个程序的运行环境,但是为了使游戏者能够顺利的完成游戏,此“提示”操作必不可少,在纠结了一段时间之后,在与同学的商讨下,终于完成 了缩略图的添加,为
12、程序的顺利完成提供了帮助。 在本次设计的完成过程中,我对软件的开发有了一个初步的认识,一个小型游戏软件尚且需要不断地查阅资料、请教别人,那么完成一个大型的软件,必定需要更加复杂的过程。所以在做软件开发时首先要保持一个平静的心态,静下心来潜心去研究,同时还要熟悉的掌握、灵活的运用所学知识,方能完成设计。也对 MFC程序开发也有了相应的了解,每一个函数都有其特定的用途,掌握好这其中的一些关联,对一个程序的完成不无好处,这次课程设计为我以后编程的相关学习奠定了基础,使我在不同方面得到了锻炼。 七、 程序中类的主要的成员函数 BOOL OnInitDialog(); /初始化函数 void OnRun
13、(UINT nBitmapID,UINT nMenuID);/加载位图资源 BOOL IsWin(); /判断拼图是否成功 void MoveImage(int num); /移动随机小图块 void Rnd(); /随机 设置小图块 的位置 UINT MapRand(UINT nMax); /随机函数 void SetImage(); /把图像拷贝到 Static 控件 void SetPos() / 初始化 Staic 控件的位置 CString IntToString(int number); /为游戏添加计时器 void OnTimer(UINT nIDEvent); /计时函数 vo
14、id SetPre(); /生成略缩图 void CPictureDlg:OnForHelp() /显示略缩图 void ShowItem(); /显示帮助对话框 八、主要参考文献 1.郑莉 .C+语言程序设计(第 3 版)北京:清华大学出版社, 2005.7 2.钱能 .C+程序设计教程(第 2 版)北京:清华大学出版社, 2005.8 3.黄维通 .Visual C+面向对象与可视化程序设计 (第 2 版 ).北京 :清华大学出版社, 2003.12 4.刘路放 .Visual C+与面向对象程序设计教程 (第二版 ).北京 :高等教育出版社, 2007.8 5. 潘爱民 . COM 原理
15、与应用 .北京:清华大学出版社, 1999.11 九、附录 BOOL CPictureDlg:OnInitDialog()/整个对话框程序运行的入口 CDialog:OnInitDialog(); / Set the icon for this dialog. The framework does this automatically / when the applications main window is not a dialog SetIcon(m_hIcon, TRUE); / Set big icon SetIcon(m_hIcon, FALSE); / Set small ico
16、n 8 srand(unsigned)time(NULL); hAccel = :LoadAccelerators(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_ACCELERATOR1); / TODO: Add extra initialization here Bitmap.LoadBitmap(IDB_BITMAP6);/初始界面是图像 BITMAP6 pKDC = new CDC; pMainMenu = GetMenu(); /获取菜单 Style3d = TRUE; Islong = FALSE; Advan = FALSE; Easy =
17、 TRUE; TimeCon = “计时器 “; IntStep = 0; Strstep = “步数 “; SetWindowPos(NULL,0,0,600,700,SWP_NOMOVE); /控 制窗口大小 SetTimer(10,1000,NULL);/10 表示计时器的名字, 1000 表示时间间隔是 1000 毫秒, NULL 表示使用onTimer 函数。 m_wndStatusBar.Create(WS_CHILD|WS_VISIBLE|CCS_BOTTOM|CCS_NODIVIDER, CRect(0,0,0,0),this,102); int static strPartD
18、im5 = 100,230, 330,400, -1; m_wndStatusBar.SetParts(4,strPartDim);/将状态显示栏分为四块 m_wndStatusBar.SetText(TimeCon,1,0); m_wndStatusBar.SetText(Strstep,2,0); m_wndStatusBar.SetText(“Player“,3,0); m_Image0.SubclassDlgItem(IDC_IMAGE0,this); m_Image1.SubclassDlgItem(IDC_IMAGE1,this); m_Image2.SubclassDlgItem
19、(IDC_IMAGE2,this); m_Image3.SubclassDlgItem(IDC_IMAGE3,this); m_Image4.SubclassDlgItem(IDC_IMAGE4,this); m_Image5.SubclassDlgItem(IDC_IMAGE5,this); m_Image6.SubclassDlgItem(IDC_IMAGE6,this); m_Image7.SubclassDlgItem(IDC_IMAGE7,this); m_Image8.SubclassDlgItem(IDC_IMAGE8,this); m_Image9.SubclassDlgIte
20、m(IDC_IMAGE9,this); m_Image10.SubclassDlgItem(IDC_IMAGE10,this); m_Image11.SubclassDlgItem(IDC_IMAGE11,this); m_Image12.SubclassDlgItem(IDC_IMAGE12,this); m_Image13.SubclassDlgItem(IDC_IMAGE13,this); m_Image14.SubclassDlgItem(IDC_IMAGE14,this); m_Image15.SubclassDlgItem(IDC_IMAGE15,this); m_Preview.
21、SubclassDlgItem(IDC_PREVIEW,this); OnBegin(); 9 PlaySound(“rain.wav“, NULL,SND_LOOP | SND_ASYNC); return TRUE; / return TRUE unless you set the focus to a control void CPictureDlg:OnSysCommand(UINT nID, LPARAM lParam)/截获控制命令的函数 if (nID dlgAbout.DoModal();/用来显示一个模态对话框 ,其返回值对应于用来关闭对话框的控件的 ID else CDia
22、log:OnSysCommand(nID, lParam); / If you add a minimize button to your dialog, you will need the code below / to draw the icon. For MFC applications using the document/view model, / this is automatically done for you by the framework. void CPictureDlg:OnPaint() /系统自动生成重绘窗口函数 if (IsIconic() CPaintDC d
23、c(this); / device context for painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); / Center icon in client rectangle int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect( int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; / Draw the icon dc.DrawIcon(x, y, m_hIcon); else CDialog:OnPaint(); SetImage();/调用 SetImage 函数将图片拷贝到 Static 控件上面 if(pKDC) pKDC-DeleteDC();