C++推箱子课程设计报告_第1页
C++推箱子课程设计报告_第2页
C++推箱子课程设计报告_第3页
C++推箱子课程设计报告_第4页
C++推箱子课程设计报告_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

.z.**理工大学华夏学院课程设计报告书课程名称:软件综合题目:基于VC++6.0的“推箱子”游戏软件的开发与测试系名:信息工程系专业班级:姓名:指导教师:2013年元月18日课程设计任务书学生:专业班级:软件2101指导教师:工作单位:信息系计算机教研室设计题目:基于VC++6.0的“推箱子”游戏软件的开发与测试初始条件:已完成c语言程序设计、软件工程、数据库概论或数据库技术等课程的学习2.系统环境:Intel奔腾4以上处理器,1G以上存,40G以上硬盘,Windows编程环境,VisualC++6.0编程工具要求完成的主要任务:(在规定的时间完成下列任务)(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)主要任务:系统完成用户登录及管理员增加、删除、修改、查询功能1.按系统功能进行游戏背景区域(移动区域、围墙)的设计与绘制:2.根据系统实现的功能,绘出功能图、系统流程图3.模块调试,运行结果正确,并经教师检查及答辩;设计报告撰写格式要求:(课程设计报告按统一通用格式书写)具体容如下:①设计任务与要求②总体方案与说明③程序主要模块的流程图④问题分析与解决方案的设计思想和改进设想⑤系统的调试记录、调试报告(即在调试中遇到的主要问题、解决方法及改进设想)⑥小结与体会附录:①使用说明=2\*GB3②参考资料时间安排:2012年12月29日第1天介绍本次课程设计的目的、要求,介绍MFCAppWizard应用程序框架的简介第2天~第5天介绍MFC中的窗口消息的创建及用,完成游戏背景区域(移动区域、围墙)的设计与绘制第6天~第9天完成目标区域、小人、箱子的绘制、绘制地图、加载/更新地图、关卡的设置及系统整合第10天系统运行与演示第11天~第14天系统测试与掌握调试的方法和技巧,撰写设计报告第15天按项目组进行演示与答辩,形成课程设计报告文档指导教师签字:2012年12月28日系主任签字:年月日目录1引言12项目需求分析13系统概要设计13.1功能控制模块13.2系统流程图23.3推箱子游戏具有的功能3能够显示主菜单和界面3能够实现键盘操作功能3能够把放置到位置的箱子进行变色显示4游戏胜负判断功能4支持关口选择功能43.4推箱子功能框架43.5游戏界面设计5游戏主界面5游戏菜单与帮助结构设计5游戏中关卡选择对话框设计63.6游戏的界面实现63.7关卡选择对话框的实现74详细设计104.1地图文件读取模块的设计与实现104.2地图绘制模块的设计与实现104.3键盘操作模块的设计与实现124.4游戏规则模块设计与实现125VC调试方法介绍145.1调试快捷键145.2跟踪调试145.3异常调试156功能测试176.1主菜单和界面显示功能测试176.2键盘操作功能测试176.3箱子放置到指定位置时变色显示功能测试196.4支持地图扩展功能的演示207特殊问题及解决方法218设计小结219参考文献21-.z.引言最经典的推箱子游戏,类似的游戏你一定早就玩过。要控制搬运工上下左右移动,来将箱子推到指定地点记得几年前,《推箱子》在PC机上刮起了一股不小的益智类游戏的旋风,现在许多资深玩家也都对《推箱子》赞不绝口,可见有深度的益智类游戏是非常受大家欢迎的。推箱子游戏1981年由日本人今林宏行首创,是在1982年12月由ThinkingRabbit公司首次发行,名“仓库番”。箱子只可以推,不可以拉,而且一次只能推动一个,胜利条件就是把所有的箱子都推到目的地。推箱子游戏是一种老少皆宜的益智游戏,既可以开发青少年学生的智力,又可以防止老年痴呆症,全家一起攻关还可以促进家庭和睦,何乐而不为?推箱子游戏是目前比较流行的游戏之一,很多操作系统或者流行软件都会带有这种游戏。它既能锻炼思维的严密性,又有很多乐趣。我们团队比较喜欢玩这个游戏,于是备采用c++编程语言进行实现。项目需求分析用户可以进行开始游戏,退出游戏,选关,重新开始游戏等操作。有结束提示。作为一款极为经典的游戏,推箱子吸引了一代代玩家乐此不疲,通过使用VisualC++6.0进行设计,将学习过的知识应用到实际程序中,以便于为以后的进一步学习奠定基础。推箱子游戏的设计目标完成一个比较简单的游戏,使之能够实现推箱子游戏的基本功能,成为一个比较完整的游戏框架。在一个狭小的仓库中,要求把木箱放到指定的位置,稍不小心就会出现箱子无法移动或者通道被堵住的情况,所以需要巧妙的利用有限的空间和通道,合理安排移动的次序和位置,才能顺利的完成任务。在游戏主界面中,会出现一个小人、若干个箱子和箱子放置点。玩家需要利用方向键控制小人上下左右移动,并推动界面中的箱子到达指定的箱子放置点。系统概要设计功能控制模块系统功能如图3-1所示。功能控制模块功能控制模块关卡重置功能指定位置状态判断功能屏幕输出功能游戏通关时的通关提示时刻判断游戏的小人物、箱子所能移动的方向位置和游戏能不能通关倒回本关的初始状态和重新选择关卡图3-1功能模块系统流程图系统流程如图3-2所示。初始化主界面初始化主界面开始退出选择关卡初始化进入新游戏继续关于推箱子游戏成功提示关闭游戏窗口游戏规则的说明进入下一关通关提示返回返回是否是最后一关成功进入上一次离开游戏的界面图3-2系统流程图推箱子游戏具有的功能能够显示主菜单和界面游戏需要一共主菜单让玩家进行游戏设置,同时能够把地图文件中的信息转换成为图像显示在游戏界面上。能够实现键盘操作功能能够接受到键盘驶入的方向键信息,并根据不同的方向键把游戏人物移动到相应的位置。例如,当玩家单机方向键向上“上”时,如果向上的位置是可以移动的,则就当把游戏人物向上西东一个方格。能够把放置到位置的箱子进行变色显示当玩家把箱子推到指定位置的格子时,需要把这个箱子进行变色,这样就能明确的现实出该箱子已经放置到指定位置。游戏胜负判断功能在游戏中,当玩家把所有的箱子都推到指定点时,玩家胜利通过当前游戏关口,进行下一关口的游戏。如果玩家无法将箱子全部推到指定位置时,玩家失败,玩家可以选择重新开始进行当前关口的游戏,还是退出游戏。支持关口选择功能玩家在游戏中可以自行选择需要挑战的关口。当玩家点击菜单中的“关卡选择”,并在对话框中输入所需要挑战的关口,设置完毕后点击开始即可打开所需关口。推箱子功能框架推箱子游戏推箱子游戏初始化模块画图模块移动箱子模块移动小人模块功能控制模块图3-3功能框架初始化模块。该模块包括屏幕初始化和游戏第一关到第最后一关的初始化。屏幕初始化用于输出操作信息,游戏每一关的初始化时构建每一关的关卡。画图模块。该模块最要是被其他模块调用,用于画墙、在空地画箱子、画小人、和画目的地。移动箱子模块。该模块用于移动箱子,包括目的地之间、空地之间和目的地与空地之间箱子的移动移动小人模块。该模块用于移动人物,包括目的地之间、空地之间和目的地与空地之间人物的移动功能控制模块。该模块是几个功能函数的集合,包括屏幕输出功能、指定位置状态功能和关卡重置功能。游戏界面设计游戏主界面推箱子游戏主界面设计如图3-4所示图3-4设计的游戏主界面游戏菜单与帮助结构设计图3-5游戏菜单结构图3-6帮助结构设计游戏中关卡选择对话框设计图3-7关卡选择对话框当玩家在对话框中输入关口数字,并重新点击开始游戏时,游戏会自动选择对应关口的地图级别开始新游戏。游戏的界面实现在推箱子游戏中,通过如下几步即可实现游戏的菜单在推箱子游戏工程的资源中添加一个菜单资源,其属性如表3-1所示:表3-1资源属性ID类别说明IDR_MAINFRAME弹出菜单游戏的主菜单IDR_RESTART菜单栏重新开始IDR_SELECT菜单栏关卡选择IDR_E*IT菜单栏游戏退出1给每个菜单栏添加相应函数到Cbo*ManDlg类中。2菜单响应函数的实现,各类菜单调用响应,要运用到的代码如下:voidCBo*ManDlg::OnE*it()//退出游戏响应{ inti=MessageBo*("退出游戏","提示",MB_OKCANCEL); switch(i) { case1: CDialog::OnCancel(); break; case2: break; }}voidCBo*ManDlg::OnSelect()//关卡选择{ CSelectsel; sel.DoModal(); g_level=sel.m_level;; GameStart();}voidCBo*ManDlg::OnRestart()//重新开始{ GameStart();}关卡选择对话框的实现推箱子游戏关口选择对话框的实现,分为如下几步:创建一个对话框资源,并添加相应的控件,如图:图3-8关口选择对话框资源在资源视窗中,Menu一项,双击IDR_MAINFRAME弹出菜单编辑框,添加一个“选关”选项,随便修改一个ID“查看->建立类向导”(Ctrl+W),第一个选项卡,找到“选关”选项的ID,选中MAND消息,点右边按钮添加函数。图3-9添加函数图1接下来资源视窗,Bitmap下插入Dialog对话框并编辑,添加一个编辑框,修改编辑框ID“查看->建立类向导”,添加新类,填好类名就会自动生成.cpp文件和.h文件。基类选CDialog,对话框ID选上面建好的对话框。OK图3-10添加函数图2为编辑框添加一个变量,用来存储编辑框获得的数据。选项卡MemberVariables,类名选上面那个对话框的类名,选中编辑框的ID,增加变量图3-11变量设置(6)要想在CBo*ManDlg类中使用这个对话框类,必须包含头文件:*include"MapSelect.h"最后,选项卡关联函数中调用这个对话框类:voidCBo*ManDlg::OnSelect()//关卡选择{ //TODO:Addyourmandhandlercodehere CSelectsel; sel.DoModal(); g_level=sel.m_level;// CStringstr;// str.Format("%d",g_level);// MessageBo*(str); GameStart();}选关功能完成详细设计地图文件读取模块的设计与实现地图文件读取模块,主要负责将对地图文件读取,并把相应的文件数据转换成地图显示出来。其设计步骤如下:(1)读取当前文件夹中的地图文件。(2)判断当前选择关口是否在文件夹中存在。(3)如果存在则把当前关口的地图信息放置到地图数组中。其实现代码如下所示:voidCBo*ManDlg::loadMap(intnum){ CStringstr; str.Format("[%d]",num);//格式化字符串,即将关卡编号变成[*] FILE*pFile=fopen("./Debug/map.t*t","rb"); //打开地图文件 if(pFile==NULL)return; //判断打开是否失败 charcTmp[20]; //创建临时字符数组 fgets(cTmp,20,pFile); //读取一行到数组中 while(strncmp(cTmp,str,3)!=0) //读取与当前关口编号相同的地图 { fgets(cTmp,20,pFile); } for(inti=0;i<14;i++) //读取地图数据到地图数组 { fgets(m_cMap[i],20,pFile); } fclose(pFile);}地图绘制模块的设计与实现地图绘制模块主要将地图数组中的数据绘制成地图图像。其设计分为如下几步。格局要求,实现不同类型格子的绘制函数。地图数组及地图文件中各字符代表的意思如表4-1所示:表4-1地图数组及地图字符代表的意思数据图像宏说明0背景MAP_BACK填充背景1墙MAP_WHITEWALL地图边框2地板MAP_BLUEWALL可移动的空间3目标MAP_BALL放箱子的位置4箱子MAP_BO*初始箱子的位置5目标与箱子重合MAP_REDBO*箱子到达目标位置6人MAP_MAN人的位置7人和目标重合MAP_MANBALL人站在目标上(2)读取地图数据,根据不同的数据调用不同的绘图函数。地图绘制,模块的实现代码如下:voidCBo*ManDlg::drawMap(CDC*pDC)//绘地图接口函数{ inti,j,*,y; for(i=0;i<14;i++)//遍历行 { for(j=0;j<16;j++)//遍历列 { *=j*29; y=i*29; switch(m_cMap[i][j])//根据数组中的数据进行绘图 { caseMAP_BACK://0绘制背景 drawBack(*,y,pDC); break; caseMAP_WHITEWALL://1绘制地图边框 drawWhiteWall(*,y,pDC); break; caseMAP_BLUEWALL://2绘制地板 drawBlueWall(*,y,pDC); break; caseMAP_BALL://3绘制目标 drawBall(*,y,pDC); break; caseMAP_BO*: //4绘制箱子 drawBo*(*,y,pDC); break; caseMAP_REDBO*://5绘制箱子与目标重合 drawRedBo*(*,y,pDC); break; caseMAP_MAN: //6绘制人 drawMan(*,y,pDC); break; caseMAP_MANBALL://绘制人和目标重合 drawManBall(*,y,pDC); break; } } }}键盘操作模块的设计与实现键盘操作模块主要负责接收玩家键盘输入并进行箱子移动等处理,其设计比较简单,只需要通过如下几步即可实现。通过截获当前窗口中键盘按下消息来判断玩家按下的按键。根据玩家按下的按键把人的相关坐标进行加减。例如:当玩家按下方向键“右”时,把人的*坐标增加,反之,把人的*坐标减少。把增加后的数据与地图数组中的数据进行比较,只要不是地图边框就可以移动,如果是箱子就还需要将箱子的坐标进行移动。但是要注意,要判断箱子移动后的坐标是否可以移动。键盘操作模块的实现,主要代码如下:BOOLCBo*ManDlg::PreTranslateMessage(MSG*pMsg){ if(pMsg->message==WM_KEYDOWN) { updateMap(pMsg->wParam);//根据按下的按键进行判断 Invalidate(FALSE); if(isFinish())//调用规则模块函数,判断是否胜利 { Af*MessageBo*("恭喜你!过关!!!"); g_level=g_level+1;//胜利后将当前关口加1 if(g_level>g_ma*level) { g_level=1;//如果大于最大关口编号,重新开始 } GameStart(); } } returnCDialog::PreTranslateMessage(pMsg);}游戏规则模块设计与实现 游戏规则模块,主要负责游戏规则的判断。其设计方法需要在每次玩家移动人物后,对当前地图数组进行判断。如果当前地图中存在单独的“目标区域”或者“人物站在目标上”两种情况,就说明玩家未过关,放置就死过关。 游戏规则模块的实现,代码如下:BOOLCBo*ManDlg::isFinish()//判断是否过关{ for(inti=0;i<14;i++) //遍历所有列 { for(intj=0;j<16;j++) //遍历所有行 { if(m_cMap[i][j]==MAP_BALL||m_cMap[i][j]==MAP_MANBALL) { returnFALSE; //有目标区域或人物站在目标区域上 } } } returnTRUE; //游戏结束}VC调试方法介绍VisualC/C++是众多C/C++编译器中,调试功能较为强大的编译器之一。调试程序是每个初学者必须经历的过程,只有不断发现自己的错误,才能减少编程错误,提高编程能力。当然我们不建议一遇到错误就调试,我希望大家先用眼睛看,把常见的错误都改正后,最后不行再调试,这样编程能力才会进步。要做到十分钟上百行无错代码的能力,不下苦功是练不成的。常用的调试快捷键有:F10单步运行,不进入函数。F11单步运行,进入函数。如果是自定义函数,则进入自定义函数。如果是系统函数,如scanf,printf,return等等,则进入汇编,当然这不是我们期望的。单步运行的同时,左下方会自动显示当前被改变值的变量,右下方则可以输入自定义变量。一般F10,F11结合使用。F9设置断点。光标所在行设置断点。F5运行到断点处暂停。为了更快运行到我们关心的地方,避免F10一步一步的运行浪费时间。F9,F5一般结合使用,到我们关注的地方后,我们可以继续F10。设断点的另外一大好处,是在递归程序中设置断点,可以很快运行到下一层中。写程序要养成良好代码风格,没有人会喜欢看别人错误的代码,尤其是那些没有分行缩进,一律左对齐的代码。养成分行缩进的风格在检查括号匹配的时候,也非常方便。运行时错误:一运行就弹出窗口,或在*些输入数据的情况下,弹出“存出错警告”的窗口。多数是由于指针访问非法空间造成的,比如未动态开辟就访问,释放后再次访问或释放等等。数组下标越界,开辟极大空间等也有可能导致此类错误。解决方法,可以通过单步运行F10或运行到断点处F5,确定出错行,然后仔细检查代码,加以修正调试快捷键F5:

开始调试Shift+F5:停止调试F10:

调试到下一句,这里是单步跟踪

F11:

调试到下一句,跟进函数部Shift+F11:

从当前函数中跳出Ctrl+F10:

调试到光标所在位置F9:

设置(取消)断点Alt+F9:

高级断点设置跟踪调试1、

尽量使用快捷键时行调试2、

观察调试信息3、

高级中断设置异常调试重试->取消->调试函数堆栈,用variables或者callstack窗口VC6.0Debug调试总结

1.如何显示Debug工具栏窗口

①:在任意工具栏的位置,单击鼠标右键,勾选Debug项

②:Tools>Customize--àToolbars--àDebug--àclose

引申:工具栏和工具条的区别?

一个工具栏可以放置多个工具条。

2.断点调试

F9:设置或去除断点。如果当前行未设置断点,按F9可在当前行设置断点,如果当前行已设置断点,按F9则为去除断点设置。

Alt+F9:调出断点设置窗口

在这个窗口里可以设置断点,去除所有已经设置的断点或者单个断点,也可以转到已设置的断点处,通过按钮EditCode,可以设置需要被计算的表达式,可以设置,监视(Watch)数组或结构体元素的个数,可以在窗口过程函数中设置断点,可以为任何一个想要监视(Watch)的消息(Message)设置一个断点。

3.开始调试

①:Build--StartDebug--Go

②:F5

注:F5有两层含义。对于非调试阶段,按F5用于开始调试。对于调试阶段(已经进入调试阶段),按F5用于运行程序到下一个断点处

4.停止调试

一旦按F5之后进入调试阶段,IDE编辑器上就会增加一个Debug菜单选项(里面包含一些常用调试手段)

这里列出不常见的两个,有E*ceptions,Threads,Modules,可以通过点击Modules进入ModuleList对话框,在这里可以看到一些模块(Module),如kernel32.dll,可以Googlekernel32.dll的一些信息。。。这里略过,我也不是很熟悉。。。--b,欢迎大牛补充。。。都说说是怎么用的。

①:Debug--àStopDebugging

②:Shift+F5

5.重新开始调试(或者说重头开始调试)

这个功能既可以在调试阶段使用,也可以在非调试阶段使用,用于进入调试阶段。

在调试阶段,它的功能如下:(即不停止调试的情况下)

如果在一个程序里有多个断点,比如断点1、断点2、。。。断点5.首先,按F5调试,进

入调试阶段,程序首先执行到断点1处,如果再按F5就会执行到断点2处,依次类推,直到断点5处,如果当程序执行到断点5处,再按F5,则程序不会再中断,程序完全运行起来。

可是,在调试阶段,如何从断点2~断点5处之间的任意一个断点跳到断点1处去重新执行呢?比如,程序已经执行到断点4处,现在程序员想回到断点1处,重新再查看(监视)每个断点处的情形(也许是他记性不好,也许是他眼花了,也许是他操作太快,比如多按了几下F5键(*^__^*)……,这种情况大家也碰到过吧,往往很多人选择了,停止调试,再重新开始进入调试,再重新来一遍,当然,这样可以,只是有点麻烦。。。)

现在,其实还有一种方法。。。我之前也没发现。。。--b。在这种情况下,就可以用重新开始调试了(注意,这个重新开始调试是指再不停止调试的情况下,重新开始调试),比如,现在在断点4处,想回到断点1处,就可以按Ctrl+Shift+F5(重新开始调试的快捷键)

①:Debug--àRestart

②:Ctrl+Shift+F5

6.单步调试

前提条件调试阶段

①:Debug--StepInto(F11)

逐语句。(例如,遇到函数调用时会进入被调函数)

②:Debug--StepOver(F10)

逐过程(例如,遇到函数调用语句时,不会进入被调函数)

③:Debug--StepOut(Shift+F11)

跳出过程调用(例如,当F11逐语句进入被调函数后,按Shift+F11会跳出被调函数)

④:Debug--àRuntoCursor(Ctrl+F10)

运行到光标所在位置。(注:貌似执行只能向前不能向后,即光标定位不能在已经执行过的代码里),经测试,如果光标在已执行的代码里,按Ctrl+F10则程序会完全执行起来,猜测。。。是不是执行完程序,再重新,从头开始执行到光标处,貌似显示的是没执行到光标处。。。--b欢迎批评补充。

7.变量监视

①:Debug--àQuickWatch(Shift+F9)

调出QuickWatch对话框,添加要监视查看(watch)的表达式(e*pression),然后

AddWatch,程序之后就会监视该表达式

②:View--DebugWindowsWatch(Alt+3)

监视你设置的需要被监视的变量。

③:View--àDebugWindowsàVariables(Alt+4)

监视所有变量。

注:View下的DebugWindows下的所有项均在Debug工具条中有。

注:在Debug下,可以将变量选中,直接拖到Variables的窗口中监视。。。,是不是很方便很HIGH功能测试主菜单和界面显示功能测试 这个演示主要是测试游戏的菜单和界面显示是否成功,其步骤如下。运行推箱子程序.e*e文件,如图6-1所示图6-1运行文件程序启动后,其菜单及界面如图6-2所示 图6-2界面效果键盘操作功能测试 键盘操作功能的演示,演示步骤如下:游戏开始后人物的位置,如图6-3所示 图6-3按下键盘上的“下”方向按键。查看任务是否向下移动,如图5-4: 图6-4箱子放置到指定位置时变色显示功能测试 将箱子放置到指定位置时,箱子会变色的功能,具体步骤如下推箱子游戏已经开始,如图6-5所示 图6-5推动箱子到指定位置后,显示如图5-6所示 图6-6支持地图扩展功能的演示推箱子游戏是否支持地图扩展功能,步骤如下:查看第一关地图文件,其容如下:与游戏显示的地图对照 图6-7第一关地图文件 图6-8修改后的地

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论