版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、成绩管理系统 计算机科学与技术学部C+课程设计题 目 VC+拼图游戏设计学 部 计算机科学与技术 班 级 计科1103班 指 导 教 师 李 军 姓 名 欧阳辉、曾婷 2012年6月3日摘 要拼图游戏是广受欢迎的一种智力游戏,它的变化多端,难度不一,让人百玩不厌。拼图游戏不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。它既有简单易学的特性,为人民群众所喜闻乐见。当前网络上流传的拼图游戏功能并不尽善尽美,其中最主要的问题就是很多软件在图片打乱上面处理的比较模糊,也有采用固定的打乱方法;而且有时出现有一对板块是对调的无法完成游戏,所以决定开发一个随机打乱图片可以完成的拼图游戏系统。其核
2、心规则是将一整张图分成N小块,随机打乱,让用户拼回原图。现在通过已学的MFC Windows应用程序设计知识,开发一个MFC应用程序,该程序提供两种游戏模式:简单和困难。在程序中已经加入了几副图片供用户娱乐。此外,它还允许用户自行添加图片。本文介绍了一个基于VC的趣味拼图游戏开发的全过程,MFC规范的出现使得开发VC游戏成为可能。这个拼图游戏是一个3*3(4*4)的拼图,由9(16)个随机分割打乱的小图片构成,其中置一格为空。通过消息映射控制移动空框边的小图片来实现拼图,从游戏前得准备到主要类和设备接口的实现,最后运行、调试和打包。关键词:VC,拼图,MFC,游戏,随机分割打乱。课程设计任务分
3、配表 表1 信息表姓名 主要工作组员欧阳辉负责程序框架构建及功能代码的输入,并调试程序并书写一部分实验报告。 曾 婷负责查找一部分代码的资料,并完成一部分实验报告。课程设计成绩表表2 成绩表姓名学号班级成绩组员欧阳辉计科1103曾 婷11432324814316 计科1103 目 录第1章 前言31.1 课题背景31.2 课题意义 41.3 主要要求4 1.4 理论依据与工作内容21第2章 系统功能分析62.1 功能模块的实现62.1.1 成绩输入模块62.1.2 增加数据72.1.3 修改数据82.1.4按姓名查询92.1.5按学号查询102.1.6输出所有学生的成绩112.1.7主函数12
4、第3章 系统测试143.1程序流程图143.2 程序运行测试163.2.1 程序主界面图163.2.2输入数据信息图163.2.3添加数据信息图173.2.4修改数据信息图173.2.5按姓名查询信息图183.2.6按学号查询信息图183.2.7输出所有学生的成绩信息图18第4章 总结19第1章 前言1.1.课题背景随着IT行业的迅猛发展,计算机应用开始由数据、事物处理转向娱乐,这样就为电脑游戏的产生提供一个良好的基础。例如现在有不少的网络游戏,但更多的是单机小游戏。拼图游戏就是其中一种。所谓拼图游戏是指将一张完整的图分成N小块,随机打乱,让用户拼回原图,根据用户所花费的时间和步数的多少来评价
5、其玩游戏的水平的一种游戏。这样一个益智游戏可以放松用户绷紧的神经,锻炼用户的思维能力与逻辑能力。1.2课题意义通过开发该拼图游戏,熟练掌握对话框和常用控件的应用,掌握综合应用各种可视化元素和交互技术实现一个典型的Windows 应用程序。希望通过本次开发过程,进一步的掌握调试程序的技能,寻找错误,丰富编程经验,提升编写MFC程序的能力。1.3主要要求运行程序后,开始游戏。1.用户可以选择应用程序提供的位图资源或自定义的位图作为游戏使用的图片。2.用户可以选择游戏的难度,若选择“简单”,程序将图片分成9块;若选择“困难”则分成16块。3.单击“重置”菜单项会重新游戏。单击任一图格,图像将随机排列
6、,并开始计时;用户可单击空格周围的图格来改变其位置。4.用户在游戏时可以通过单击“提示”菜单项来查看当前图片的缩略图。5.拼图成功后,用户可以自定义选择另外一幅图片重新开始游戏或者退出程序。1.4理论依据与工作内容理论依据:该程序基于对话框程序组成(包括一个菜单栏,状态栏和显示游戏图片的游戏区),主要利用对话框文档上的菜单项来执行各个功能,如:重置、更换位图、自行加载位图。在CPictureDlg类里面添加成员函数和变量来实现各个功能。工作内容:在基于对话框的工程中加入菜单操作、用代码操纵菜单、Windows位图文件的基本结构、Visual C+中对位图资源的操作、Visual C+中对自定义
7、位图文件的操作、设备相关位图(DDB)的概念、用Static 控件显示位图以及用Status Bar显示提示信息和Visual C+随机函数该程序。设计流程图绘制边框加载图片随机打乱图片拼图判断是否与原图一样完成拼图结束开始YN 图1设计流程图 第2章 系统需求分析2.1 功能模块的实现2.1.1 成绩输入模块第3章 系统设计3.1详细设计过程(包含关键代码及截图)3.1.1 创建初始界面 新建一个 MFC AppWizard(exe)工程,将其命名为 Picture,在第一步选择 基本对话框,如图所示,接下来直接点 完成。在 Workspace 的 Resource 标签中加入菜单资源,方法
8、是在 Picture resources 上右击,在弹出的快捷菜单中选择 insert;然后在弹出的对话框中选中 menu 项,单击 New。 图3-1新建工程图3-2添加菜单项以上完成后,右击打开对话框的属性(Properties),将对话框的ID号设为IDD_PICTURE_DIALOG,Caption 设置为“拼图游戏”,并为 Menu 属性对应的下拉框选择IDR_MENU1,如下图所示;这样菜单就可以在程序运行时显示在主对话框的顶部了。 图3-3拼图游戏属性运行结果如下: 图3-4运行结果 在 ClassView 标签中为 CPictureDlg 类添加两个 CMenu 类型的成员变量
9、*pMainMenu,*pSubMenu.3.1.2 位图的读入和显示 在程序中,需要由用户来选择游戏中使用的图片,同时还需要将整幅图片分成不同的小块。因此,采用(Picture)Static 控件作为位图的载体,分别显示图片的不同部分。 首先,需要读入位图资源。单击 VC6.0 菜单栏上的“InsertResource”子菜单,在弹出的对话框中选中 Bitmap,再单击“import”,在弹出的对话框中找到你需要添加进来的图片(注意在文件类型下拉框中选择“所有文件(*.*)”,否则你将找不到“*.bmp”的图片),单击“import”后将弹出如图所示的确认框,单击“确定”即可。 图3-5位图
10、添加成功依次添加四个位图文件(ID 默认)后,在 ResourceView 中将看到如图所示效果: 图3-6添加四副位图为对话框的“图片”菜单添加五个菜单项,如图2-3所示,ID分别为:ID_PICTURE1,ID_PICTURE2,ID_PICTURE3,ID_PICTURE4,ID_ADVAN。参数 nBitmapID 指定位图资源的 ID 号,nMenuID 指定菜单项的 ID 号。在函数中,我们首先用 GetSubMenu 得到指向弹出菜单对象的指针,然后用 CheckMenuItem 方法为 nMenuID所指定的菜单项放置选中标记。接下来用 CBitmap 对象的 LoadBitm
11、ap 方法将 nBitmapID 所指定的位图载入。相应代码如下:void CPictureDlg:OnRun(UINT nBitmapID, UINT nMenuID) pSubMenu = pMainMenu->GetSubMenu(1); pSubMenu->CheckMenuItem(ID_PICTURE1,MF_UNCHECKED); pSubMenu->CheckMenuItem(ID_PICTURE2,MF_UNCHECKED); pSubMenu->CheckMenuItem(ID_PICTURE3,MF_UNCHECKED); pSubMenu->
12、;CheckMenuItem(ID_PICTURE4,MF_UNCHECKED); pSubMenu->CheckMenuItem(ID_ADVAN,MF_UNCHECKED); pSubMenu->CheckMenuItem(nMenuID, MF_CHECKED);用类向导(ClassWizard,“View”菜单下的第一个子菜单,也可按 Ctrl + W 快捷键打开)依次为对话框中的“图像”菜单中的子菜单项添加消息响应函数四张图片对应菜单的消息响应代码如下:void CPictureDlg:OnPicture1() / TODO: Add your command handl
13、er code OnRun(IDB_BITMAP1, ID_PICTURE1);void CPictureDlg:OnPicture2() / TODO: Add your command handler code OnRun(IDB_BITMAP2, ID_PICTURE2);void CPictureDlg:OnPicture3() / TODO: Add your command handler code OnRun(IDB_BITMAP3, ID_PICTURE3);void CPictureDlg:OnPicture4() / TODO: Add your command handl
14、er code OnRun(IDB_BITMAP4, ID_PICTURE4); “自定义”菜单项的消息响应代码由于需要打开一个新的位图文件,所以需要先为CPictureDlg 类添加一个 HBITMAP 类型的成员变量 hBitmap,用来表示指向位图资源的句柄。其次,还需要添加两个 INT 型变量 Width,Height 来表示用户打开图片的大小;BOOL 型变量 IsLong 来表示图片属于长大于宽型还是宽大于长型,BOOL 型变量 Advan 表示该图片是否是自定义型。代码中, LoadImage 方法来加载自定义文件中的位图资源,用然后用 GetObject方法得到其 BITMAP
15、 对象。3.1.3 用(Picture)Static 控件显示位图 在游戏程序中,采用 Static Text 即静态文本控件来显示位图。静态文本控件的功能比较简单,可显示字符串,图标,位图。先为对话框的“游戏”中的菜单项“容易”和“困难”添加消息响应,如图所示另外还需为 CPictureDlg 类添加 BOOL 型变量 Easy 来标识游戏的难度(分为 9 格或 16 格),同时添加 BOOL 型变量 IsRnd 用来标识图格是否进行了随机位置的初始.把俩个难度的菜单添加消息响应函数,写入相应代码。接下来为 CPictureDlg 对话框添加 16 个 Static 控件(可以先设置好一个控
16、件后,再通过复制得到其它的控件),如图所示;并设置它们的属性:ID 设为 IDC_IMAGE0 到IDC_IMAGE15,Tabstop 请勾上,Type 属性设为 Bitmap;尤为重要的是 Styles 标签里的Notify勾上。控件添加好了后,我们需要添加一个 CStatic 类型的数组 m_Image16与这 16 个 Static 控件相关联,通过这个操作这个数组的下标来控制这 16 个控件对图像进行分格显示。建立关联的代码应写在 CPictureDlg 类中系统生成的OnInitDialog()函数体内,这个函数是整个对话框程序运行的入口,相当于一个 main 函数,在这个函数体里
17、,我们也需要为之前声明的变量提供初始值,即将变量初始化,变量没有初始化的后果通常会造成内存泄露,使程序在运行时出现莫名奇妙的错误。接下来要为 CPictureDlg 类添加两个 INT 型的成员变量 x 和 y,用来计算 Static 控件的位置,如图所示。为 CPictureDlg 类添加一个成员函数 SetPos,用来对 Static 控件的位置进行初始代设定了 Static 控件的初始位置之后,就可以将图像拷贝到上面,因此需为 CPictureDlg类添加一个成员函数 SetImage。添加代码。注意,代码中涉及到一个未定义的 BOOL 型变量 Style3d,需要声明并初始化,这个变量
18、的作用是判断用户选择的图片风格是 3D 风格还是平面风格。这是他的初始化。这里我们顺便把对话框菜单的“选项”菜单项完善一下。接下来用类向导为“3D 效果”菜单项和“平面”菜单项添加消息响应函数在函数体中添加代码。在游戏正式开始之前,我们首先要对各图格进行随机排列。 CPictureDlg 添加两个成为员函数 MapRand 和 Rnd,分别用来作为随机函数和设定随机图格的位置。相应代码如下:UINT CPictureDlg:MapRand(UINT nMax) int nRand = rand(); float fMap = (float)nMax / RAND_MAX; float fRet
19、Val = (float)nRand*fMap+0.5f; return (UINT)fRetVal;void CPictureDlg:Rnd() int xnum,ynum,level; UINT rand; if(Easy) level = 8; else if(!Easy) level = 15; WINDOWPLACEMENT wpnum, wp15; for(int a = 0; a <= 600; a+) rand = MapRand(4); if(rand=1) for(int b = 0; b <= level - 1; b+) m_Imagelevel.GetWi
20、ndowPlacement(&wp15); m_Imageb.GetWindowPlacement(&wpnum); xnum = wpnum.rcNormalPosition.left; ynum = wpnum.rcNormalPosition.top; if(wpnum.rcNormalPosition.top = wp15.rcNormalPosition.top && wpnum.rcNormalPosition.left = wp15.rcNormalPosition.left - x) m_Imageb.SetWindowPos(NULL,xnum
21、+x,ynum,0,0,SWP_NOSIZE);m_Imagelevel.SetWindowPos(NULL,xnum,ynum,0,0,SWP_NOSIZE); if(rand = 2) for(int c = 0; c <= level - 1; c+) m_Imagelevel.GetWindowPlacement(&wp15); m_Imagec.GetWindowPlacement(&wpnum); xnum = wpnum.rcNormalPosition.left; ynum = wpnum.rcNormalPosition.top;if(wpnum.rcN
22、ormalPosition.top=wp15.rcNormalPosition.top && wpnum.rcNormalPosition.left = wp15.rcNormalPosition.left + x) m_Imagec.SetWindowPos(NULL,xnum-x,ynum,0,0,SWP_NOSIZE);m_Imagelevel.SetWindowPos(NULL,xnum,ynum,0,0,SWP_NOSIZE); if(rand = 3) for(int d = 0; d <= level - 1; d+) m_Imagelevel.GetWin
23、dowPlacement(&wp15); m_Imaged.GetWindowPlacement(&wpnum); xnum = wpnum.rcNormalPosition.left; ynum = wpnum.rcNormalPosition.top; if(wpnum.rcNormalPosition.left=wp15.rcNormalPosition.left && wpnum.rcNormalPosition.top = wp15.rcNormalPosition.top + y) m_Imaged.SetWindowPos(NULL,xnum,yn
24、um-y,0,0,SWP_NOSIZE);m_Imagelevel.SetWindowPos(NULL,xnum,ynum,0,0,SWP_NOSIZE); if(rand = 4) for(int e = 0; e <= level - 1; e+) m_Imagelevel.GetWindowPlacement(&wp15); m_Imagee.GetWindowPlacement(&wpnum);xnum = wpnum.rcNormalPosition.left; ynum = wpnum.rcNormalPosition.top; if(wpnum.rcNorm
25、alPosition.left= wp15.rcNormalPosition.left && wpnum.rcNormalPosition.top = wp15.rcNormalPosition.top - y) m_Imagee.SetWindowPos(NULL,xnum,ynum+y,0,0,SWP_NOSIZE);m_Imagelevel.SetWindowPos(NULL,xnum,ynum,0,0,SWP_NOSIZE); if(Easy) m_Image8.ShowWindow(SW_HIDE); else if(!Easy) m_Image8.ShowWindo
26、w(SW_SHOW); m_Image15.ShowWindow(SW_HIDE); pSubMenu = pMainMenu->GetSubMenu(0); pSubMenu->EnableMenuItem(ID_FORHELP,MF_ENABLED); IsRnd = TRUE;函数 rand 用来产生一个伪随机数,它在头文件<stdlib.h>中定义。用来移动随机图格的函数为 MoveImage(int num)函数。添加相应的代码。现在,我们就可以依次为那 16 个 Static 控件添加鼠标响应事件了。代码如下:void CPictureDlg:OnImage
27、0() / TODO: Add your control notification if(IsRnd) MoveImage(0); else Rnd(); if(IsWin() CanCount = FALSE;其他14个代码只改中间那个数字。代码的含义是:单击 Static 控件时,程序首先判断图格是否进行了随机数初始化,若是,则移动图格,否则的话先进行初始化。此外还需用 IsWin()函数判断游戏是否完成,如果完成则设置计时器控制变量 Cancount 为假。在这里声明一下 BOOL 型变量 Cancount 和 INT型变量 count,他们在后面都会用到。在 OnAdvan()函数中添
28、加如下代码,如图在 OnEasy()和 OnHard()函数中添加如下代码,如图在 OnRnd()函数的最后一行也添加一行代码,如图下面我们来添加判断游戏是否完成的函数 IsWin(),只要所有的 Static 控件都回到了相应的位置,就可以认为用户己完成了拼图,即游戏完成。为 CPictureDlg添加一个CStantusBarCtrl类型的变量m_wndStatusBar相关代码如下:BOOL CPictureDlg:IsWin() WINDOWPLACEMENT wp;int con,move; int win = 0; if(IsLong) move = 70; else move =
29、 0; if(Easy = TRUE) con = 2; else if(!Easy) con = 3; for(int a = 0; a <= con; a+) m_Imagea.GetWindowPlacement(&wp); if(wp.rcNormalPosition.top=0 && wp.rcNormalPosition.left = a*x+move) win+=1; for(int b = 0; b <= con; b+) m_Imagecon+1+b.GetWindowPlacement(&wp); if(wp.rcNormalPo
30、sition.top=y && wp.rcNormalPosition.left = b*x+move) win+=1; if(win<3) return FALSE; for(int c = 0; c <= con; c+) m_Image2*(con+1)+c.GetWindowPlacement(&wp); if(wp.rcNormalPosition.top=2*y && wp.rcNormalPosition.left = c*x+move) win+=1; if(win<5) return FALSE; if(!Easy)
31、for(int d = 0; d <= 3; d+) m_Image12+d.GetWindowPlacement(&wp); if(wp.rcNormalPosition.top=3*y && wp.rcNormalPosition.left =d*x+move) win+=1; if(Easy = TRUE && win = 9) /判断是否完成 m_Image8.ShowWindow(SW_SHOW); m_wndStatusBar.SetText("祝贺你,拼出来了!",0,0); return TRUE; else i
32、f(!Easy = TRUE && win = 16) m_Image8.ShowWindow(SW_SHOW); m_Image15.ShowWindow(SW_SHOW); m_wndStatusBar.SetText("祝贺你,拼出来了!",0,0);return TRUE;else return FALSE;到目前为止,我们的程序运行后显示的仍然是一个什么图片都没有的对话框,接下来,我们将为游戏添加启动代码。打开类向导,为之前添加的菜单项“开始”(ID_BEGIN)“重置”,(ID_REPLAY)“提示”, (ID_FORHELP),和“退出”(ID
33、_QUIT)添加消息响应函数。修改 CPictureDlg 类的 OnInitDialog()函数的内容如下: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 dialog SetIcon(m_hIcon, TRUE);/ Set big iconSetIcon(m_hIcon, FALSE);/
34、 Set small iconsrand(unsigned)time(NULL);/ TODO: Add extra initialization hereBitmap.LoadBitmap(IDB_BITMAP1);pkDC = new CDC;pMainMenu = GetMenu();/获取菜单Style3d = TRUE;IsLong = FALSE;Advan = FALSE;Easy = TRUE;SetWindowPos(NULL,0,0,356,352,SWP_NOMOVE); /控制窗口大小m_Image0.SubclassDlgItem(IDC_IMAGE0,this);m
35、_Image1.SubclassDlgItem(IDC_IMAGE1,this);m_Image2.SubclassDlgItem(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_Image
36、8.SubclassDlgItem(IDC_IMAGE8,this);m_Image9.SubclassDlgItem(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);OnBegin();return TRUE; / return TRUE unless you set the focus to a control其中有一个 pk
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 幼儿教育考试题库及答案
- 2026九年级上语文难点突破方法指导
- 2026四年级数学 人教版数学乐园品格塑造营
- 2025年临床执业医师笔试
- 住宅小区保安服务管理制度
- 企业班组交接班制度
- 企业三个清单制度
- 工地材料保管员奖惩制度
- 社区巾帼文明岗奖惩制度
- 从工资里扣作为奖惩制度
- 部编版小学语文六年级下册必读书阅读训练试题及答案(全册)
- 《机电设备维修与维护(第2版)》高职全套教学课件
- 定额〔2025〕1号文-关于发布2018版电力建设工程概预算定额2024年度价格水平调整的通知
- 《光的本质之争》课件
- 初中数学新课程标准(2024年版)
- 《任务型教学法在初中历史教学中的应用研究》
- 学校食堂员工培训
- 中药灌肠疗法课件
- 西门子S7-1500 PLC技术及应用 课件 第5章 S7-1500 PLC 的通信及其应用
- 2024年员工借调合同书
- 市政绿化养护及市政设施养护服务方案(技术方案)
评论
0/150
提交评论