目录一、需求分析 (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)九、附录 (6)一、需求分析1.课程设计目的(1)运用C++语言设计拼图游戏具有极强的实践性,加强我们对C++课程基础知识点的理解掌握和灵活运用理能力,培养实际分析问题能力,养成良好的编程习惯;了解C++面向对象的设计方法与技巧,有效地、深刻地理解课程内容,体会理论、方法和设计原则;培养分析实际问题和解决问题的能力,具备使用面向对象程序设计开发工具设计实际系统的能力。
(2)进一步领会程序设计的特点和应用,提高运用C++ 以及面向对象知识解决实际问题的能力,初步掌握MFC编程的基本功能,掌握一种可视化编程的方法,学习使用CStatic控制操作位图,加强对C++面向对象程序设计的理解。
(3)掌握用C++ 编写面向对象的实用程序的设计方法,对面向对象方法和思想增加感性的认识,学会利用C++程序设计语言编写出一些短小、可靠的Windows实用程序,切实提高面向对象的程序设计能力,为后续的相关课程的学习打下基础。
(4)锻炼实际的编程能力,提高调查资料、查阅技术文献、资料以及编写软件设计文档的能力,提高自学编程的能力。
2.程序所实现的功能(1)本程序除了实现了拼图所要求的基本功能外,还添加了背景音乐、计算步数和游戏所用的时间,当游戏开始时背景音乐自动循环播放,步数随player操作自动增加,时间自动增加。
(2)进入游戏界面后,player可以在菜单栏中选择游戏的难度、图片风格和拼图图像,亦可以自定义图片,若选择“简单”,程序将图片分成9块,若选择“困难”,程序将图片分成16块.(3)单击“重置”或按F3菜单项会弹出一个对话框让用户确认是否重置游戏。
(4)单击任意图象,图像将随机排列,并开始计时和记步,用户通过鼠标单击空格周围的图片来改变其位置,用户没单击一次,步数增加一次。
(5)游戏中用户可通过单击“提示”菜单项或按F4来查看图像的缩略图及游戏相关信息。
(6)游戏状态栏显示用户所用时间及步数,成功时状态栏给出提示信息和所花费时间、步数,用户可选择其他图像或难度进行游戏。
二、设计内容1.主模块图2.1主程序流程图2.2用例图:用户选择背景图片选择难度级别开始游戏是否选择不显示显示原图原图提示拼图成功返回重新选择背景图片及难度级别2.3主程序类调用关系图2.4 CPictureDlg类中成员函数主要调用关系图三、设计方案论述本程序有一个CPictureDlg类,它公有继承CDialog类的一些性质。
CDialog类中包括位图的读入和显示,拼图游戏中的Picture都是位图资源。
在游戏程序中,采用Static Text即静态文本控件来显示位图。
静态文本控件的功能比较简单,可显示字符串,图标,位图。
先为对话框的“游戏”中的菜单项“容易”和“困难”添加消息响应为另外还需为CPictureDlg 类添加BOOL型变量Easy来标识游戏的难度(分为9格或16格),同时添加BOOL型变量IsRnd 用来标识图格是否进行了随机位置的初始化,接下来为CPictureDlg对话框添加16个Static 控件(可以先设置好一个控件后,再通过复制得到其它的控件),并设置它们的属性:ID 设为IDC_IMAGE0到IDC_IMAGE15,Tabstop请勾上,Type属性设为Bitmap,控件添加好了后,我们需要添加一个CStatic类型的数组m_Image[16],与这16个Static控件相关联,通过这个操作这个数组的下标来控制这16个控件对图像进行分格显示。
建立关联的代码应写在CPictureDlg类中系统生成的OnInitDialog()函数体内,这个函数是整个对话框程序运行的入口,相当于一个main函数,在这个函数体里,我们也需要为之前声明的变量提供初始值,即将变量初始化,变量没有初始化的后果通常会造成内存泄露,使程序在运行时出现莫名奇妙的错误。
判断游戏是否完成的函数IsWin(),只要所有的Static控件都回到了相应的位置,就可以认为用户己完成了拼图,即游戏完成。
四、调试分析1.实际完成的情况(1)完成的功能:本程序除了实现了拼图所要求的基本功能外,还添加了背景音乐、计算步数和游戏所用的时间,当游戏开始时背景音乐自动循环播放,步数随player操作自动增加,时间自动增加。
(2)支持的数据类型:BOOL类型、控件数组类型。
2.程序的性能分析本程序能够很好的运行,并且画面质量以及音质方面都很高3.上机过程中出现的问题及其解决方案1)开始导入图片时,图片不能显示,重新导入bmp格式的图片后解决了。
2)开始建立了时间函数OnTimer,但是游戏运行后时间并不增加,在开始游戏对应的函数中增加SetTimer函数,得到想要的结果。
3)初始设置的快捷键无效,查阅资料后加入Accelerator及相应的函数,使得快捷键有效。
4.程序中可以改进、扩充的功能及设计实现构想。
1)游戏的难度等级有点少,可以适当增加几个等级。
2)游戏未设置根据用户花费的时间和步数判定用户的成绩并进行排名的功能,可以增设,以便用户了解自己玩的水平。
五、用户手册1.打开Picture文件夹,双击Ppicture.dsw标志打开程序,然后运行。
2.开始程序会出现以下欢迎界面:3.用户需要选择图片、难度和图片风格,然后单击图片开始游戏,计时器开始计时,用户通过鼠标单击空格周围的图片来改变其位置,用户每单击一次,步数增加一次。
4.游戏中用户可通过单击“提示”菜单项或按F4来查看图像的缩略图及游戏相关信息。
图像缩略图游戏相关信息5.用户也可以单击菜单栏中的重置或按快捷键F3重置图片,会出现提示信息,用户单击确定重置图片。
提示框如下:6.当完成拼图后系统会自动给出成功提示,并显示用户的成绩,用户单击确定后可以选择其他图片或难度继续游戏,也可以选择单击“退出”或按Esc退出游戏。
六、设计总结通过本次课程设计,学习并初步掌握了基于对话框的MFC程序的设计,并学会了使用CStatic控件操作位图。
熟悉了在基于对话框的工程中加入菜单操作、用代码操作菜单、Windows位图文件的基本结构、Visual C++中对位图资源的操作、Visual C++中对自定义位图文件的操作、设置相关位图的概念、用Static控件显示位图以及用Status Bar显示提示信息和Visual C++随机函数。
在设计过程中,曾遇到了两个瓶颈导致程序一度无法完成,第一个是位图文件的添加,包括将图片格式转换成BMP格式、添加相关Static控件,尤其是对控件图标不熟悉的情况下,一时不知道在哪儿添加控件,后来上网查阅并请教同学才得以完成控件的添加,使得程序可以继续完成。
不过在程序即将结束的时候,又遇到了一个新的问题,导致程序差点功亏一篑,问题就是图片的缩略图的添加,也就是游戏中的“提示”的应用,当然没有“提示”操作,并不会影响整个程序的运行环境,但是为了使游戏者能够顺利的完成游戏,此“提示”操作必不可少,在纠结了一段时间之后,在与同学的商讨下,终于完成了缩略图的添加,为程序的顺利完成提供了帮助。
在本次设计的完成过程中,我对软件的开发有了一个初步的认识,一个小型游戏软件尚且需要不断地查阅资料、请教别人,那么完成一个大型的软件,必定需要更加复杂的过程。
所以在做软件开发时首先要保持一个平静的心态,静下心来潜心去研究,同时还要熟悉的掌握、灵活的运用所学知识,方能完成设计。
也对MFC程序开发也有了相应的了解,每一个函数都有其特定的用途,掌握好这其中的一些关联,对一个程序的完成不无好处,这次课程设计为我以后编程的相关学习奠定了基础,使我在不同方面得到了锻炼。
七、程序中类的主要的成员函数BOOL OnInitDialog(); //初始化函数void OnRun(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); //计时函数void SetPre(); //生成略缩图void CPictureDlg::OnForHelp() //显示略缩图void ShowItem(); //显示帮助对话框八、主要参考文献1.郑莉.C++语言程序设计(第3版).北京:清华大学出版社,2005.72.钱能.C++程序设计教程(第2版).北京:清华大学出版社,2005.83.黄维通.Visual C++面向对象与可视化程序设计(第2版).北京:清华大学出版社,2003.124..刘路放.Visual C++与面向对象程序设计教程(第二版).北京:高等教育出版社,2007.85. 潘爱民.COM原理与应用.北京:清华大学出版社,1999.11九、附录BOOL CPictureDlg::OnInitDialog()//整个对话框程序运行的入口{CDialog::OnInitDialog();// Set the icon for this dialog. The framework does this automatically// when the application's main window is not a dialogSetIcon(m_hIcon, TRUE); // Set big iconSetIcon(m_hIcon, FALSE); // Set small iconsrand((unsigned)time(NULL));hAccel = ::LoadAccelerators(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_ACCELERA TOR1));// TODO: Add extra initialization hereBitmap.LoadBitmap(IDB_BITMAP6);//初始界面是图像BITMAP6pKDC = new CDC;pMainMenu = GetMenu(); //获取菜单Style3d = TRUE;Islong = FALSE;Advan = FALSE;Easy = TRUE;TimeCon = "计时器";IntStep = 0;Strstep = "步数";SetWindowPos(NULL,0,0,600,700,SWP_NOMOVE); //控制窗口大小SetTimer(10,1000,NULL);//10表示计时器的名字,1000表示时间间隔是1000毫秒,NULL表示使用onTimer函数。