C++推箱子课程设计报告.docx

上传人:b****7 文档编号:9171748 上传时间:2023-02-03 格式:DOCX 页数:24 大小:90.37KB
下载 相关 举报
C++推箱子课程设计报告.docx_第1页
第1页 / 共24页
C++推箱子课程设计报告.docx_第2页
第2页 / 共24页
C++推箱子课程设计报告.docx_第3页
第3页 / 共24页
C++推箱子课程设计报告.docx_第4页
第4页 / 共24页
C++推箱子课程设计报告.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

C++推箱子课程设计报告.docx

《C++推箱子课程设计报告.docx》由会员分享,可在线阅读,更多相关《C++推箱子课程设计报告.docx(24页珍藏版)》请在冰豆网上搜索。

C++推箱子课程设计报告.docx

C++推箱子课程设计报告

学号

武汉理工大学华夏学院

课程设计报告书

课程名称:

软件综合

题目:

基于VC++6.0的“推箱子”游戏软件的开发与测试

系名:

信息工程系

专业班级:

姓名:

指导教师:

2013年元月18日

课程设计任务书

学生姓名:

专业班级:

软件2101

指导教师:

工作单位:

信息系计算机教研室

设计题目:

基于VC++6.0的“推箱子”游戏软件的开发与测试

初始条件:

1.已完成c语言程序设计、软件工程、数据库概论或数据库技术等课程的学习

2.系统环境:

Intel奔腾4以上处理器,1G以上内存,40G以上硬盘,

Windows编程环境,VisualC++6.0编程工具

要求完成的主要任务:

(在规定的时间内完成下列任务)

(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)

主要任务:

系统完成用户登录及管理员增加、删除、修改、查询功能

1.按系统功能进行游戏背景区域(移动区域、围墙)的设计与绘制:

2.根据系统实现的功能,绘出功能图、系统流程图

3.模块调试,运行结果正确,并经教师检查及答辩;

设计报告撰写格式要求:

(课程设计报告按统一通用格式书写)具体内容如下:

①设计任务与要求②总体方案与说明

③程序主要模块的流程图④问题分析与解决方案的设计思想和改进设想

⑤系统的调试记录、调试报告(即在调试中遇到的主要问题、解决方法及改进设想)

⑥小结与体会

附录:

①使用说明

参考资料

时间安排:

2012年12月29日---2013年元18日(共三周)

第1天

介绍本次课程设计的目的、要求,介绍MFCAppWizard应用程序框架的简介

第2天~第5天

介绍MFC中的窗口消息的创建及用,完成游戏背景区域(移动区域、围墙)的设计与绘制

第6天~第9天

完成目标区域、小人、箱子的绘制、绘制地图、加载/更新地图、关卡的设置及系统整合

第10天

系统运行与演示

第11天~第14天

系统测试与掌握调试的方法和技巧,撰写设计报告

第15天

按项目组进行演示与答辩,形成课程设计报告文档

指导教师签字:

2012年12月28日

系主任签字:

年月日

1引言1

2项目需求分析1

3系统概要设计1

3.1功能控制模块1

3.2系统流程图2

3.3推箱子游戏具有的功能3

3.3.1能够显示主菜单和界面3

3.3.2能够实现键盘操作功能3

3.3.3能够把放置到位置的箱子进行变色显示4

3.3.4游戏胜负判断功能4

3.3.5支持关口选择功能4

3.4推箱子功能框架4

3.5游戏界面设计5

3.5.1游戏主界面5

3.5.2游戏菜单与帮助结构设计5

3.5.3游戏中关卡选择对话框设计6

3.6游戏的界面实现6

3.7关卡选择对话框的实现7

4详细设计10

4.1地图文件读取模块的设计与实现10

4.2地图绘制模块的设计与实现10

4.3键盘操作模块的设计与实现12

4.4游戏规则模块设计与实现12

5VC调试方法介绍14

5.1调试快捷键14

5.2跟踪调试14

5.3异常调试15

6功能测试17

6.1主菜单和界面显示功能测试17

6.2键盘操作功能测试17

6.3箱子放置到指定位置时变色显示功能测试19

6.4支持地图扩展功能的演示20

7特殊问题及解决方法21

8设计小结21

9参考文献21

1引言

最经典的推箱子游戏,类似的游戏你一定早就玩过。

要控制搬运工上下左右移动,来将箱子推到指定地点

 记得几年前,《推箱子》在PC机上刮起了一股不小的益智类游戏的旋风,现在许多资深玩家也都对《推箱子》赞不绝口,可见有深度的益智类游戏是非常受大家欢迎的。

 推箱子游戏1981年由日本人今林宏行首创,是在1982年12月由ThinkingRabbit公司首次发行,名“仓库番”。

箱子只可以推,不可以拉,而且一次只能推动一个,胜利条件就是把所有的箱子都推到目的地。

  推箱子游戏是一种老少皆宜的益智游戏,既可以开发青少年学生的智力,又可以防止老年痴呆症,全家一起攻关还可以促进家庭和睦,何乐而不为?

推箱子游戏是目前比较流行的游戏之一,很多操作系统或者流行软件都会带有这种游戏。

它既能锻炼思维的严密性,又有很多乐趣。

我们团队比较喜欢玩这个游戏,于是备采用c++编程语言进行实现。

2项目需求分析

用户可以进行开始游戏,退出游戏,选关,重新开始游戏等操作。

有结束提示。

作为一款极为经典的游戏,推箱子吸引了一代代玩家乐此不疲,通过使用VisualC++6.0进行设计,将学习过的知识应用到实际程序中,以便于为以后的进一步学习奠定基础。

推箱子游戏的设计目标完成一个比较简单的游戏,使之能够实现推箱子游戏的基本功能,成为一个比较完整的游戏框架。

在一个狭小的仓库中,要求把木箱放到指定的位置,稍不小心就会出现箱子无法移动或者通道被堵住的情况,所以需要巧妙的利用有限的空间和通道,合理安排移动的次序和位置,才能顺利的完成任务。

在游戏主界面中,会出现一个小人、若干个箱子和箱子放置点。

玩家需要利用方向键控制小人上下左右移动,并推动界面中的箱子到达指定的箱子放置点。

3系统概要设计

3.1功能控制模块

系统功能如图3-1所示。

图3-1功能模块

3.2系统流程图

系统流程如图3-2所示。

图3-2系统流程图

3.3推箱子游戏具有的功能

3.3.1能够显示主菜单和界面

游戏需要一共主菜单让玩家进行游戏设置,同时能够把地图文件中的信息转换成为图像显示在游戏界面上。

3.3.2能够实现键盘操作功能

能够接受到键盘驶入的方向键信息,并根据不同的方向键把游戏人物移动到相应的位置。

例如,当玩家单机方向键向上“上”时,如果向上的位置是可以移动的,那么就当把游戏人物向上西东一个方格。

3.3.3能够把放置到位置的箱子进行变色显示

当玩家把箱子推到指定位置的格子时,需要把这个箱子进行变色,这样就能明确的现实出该箱子已经放置到指定位置。

3.3.4游戏胜负判断功能

在游戏中,当玩家把所有的箱子都推到指定点时,玩家胜利通过当前游戏关口,进行下一关口的游戏。

如果玩家无法将箱子全部推到指定位置时,玩家失败,玩家可以选择重新开始进行当前关口的游戏,还是退出游戏。

3.3.5支持关口选择功能

玩家在游戏中可以自行选择需要挑战的关口。

当玩家点击菜单中的“关卡选择”,并在对话框中输入所需要挑战的关口,设置完毕后点击开始即可打开所需关口。

3.4推箱子功能框架

图3-3功能框架

初始化模块。

该模块包括屏幕初始化和游戏第一关到第最后一关的初始化。

屏幕初始化用于输出操作信息,游戏每一关的初始化时构建每一关的关卡。

画图模块。

该模块最要是被其他模块调用,用于画墙、在空地画箱子、画小人、和画目的地。

移动箱子模块。

该模块用于移动箱子,包括目的地之间、空地之间和目的地与空地之间箱子的移动

移动小人模块。

该模块用于移动人物,包括目的地之间、空地之间和目的地与空地之间人物的移动

功能控制模块。

该模块是几个功能函数的集合,包括屏幕输出功能、指定位置状态功能和关卡重置功能。

3.5游戏界面设计

3.5.1游戏主界面

推箱子游戏主界面设计如图3-4所示

图3-4设计的游戏主界面

3.5.2游戏菜单与帮助结构设计

图3-5游戏菜单结构

图3-6帮助结构设计

3.5.3游戏中关卡选择对话框设计

图3-7关卡选择对话框

当玩家在对话框中输入关口数字,并重新点击开始游戏时,游戏会自动选择对应关口的地图级别开始新游戏。

3.6游戏的界面实现

在推箱子游戏中,通过如下几步即可实现游戏的菜单

在推箱子游戏工程的资源中添加一个菜单资源,其属性如表3-1所示:

表3-1资源属性

ID

类别

说明

IDR_MAINFRAME

弹出菜单

游戏的主菜单

IDR_RESTART

菜单栏

重新开始

IDR_SELECT

菜单栏

关卡选择

IDR_EXIT

菜单栏

游戏退出

1给每个菜单栏添加相应函数到CboxManDlg类中。

2菜单响应函数的实现,各类菜单调用响应,要运用到的代码如下:

voidCBoxManDlg:

:

OnExit()//退出游戏响应

{

inti=MessageBox("退出游戏","提示",MB_OKCANCEL);

switch(i)

{

case1:

CDialog:

:

OnCancel();

break;

case2:

break;

}

}

voidCBoxManDlg:

:

OnSelect()//关卡选择

{

CSelectsel;

sel.DoModal();

g_level=sel.m_level;;

GameStart();

}

voidCBoxManDlg:

:

OnRestart()//重新开始

{

GameStart();

}

3.7关卡选择对话框的实现

推箱子游戏关口选择对话框的实现,分为如下几步:

(1)创建一个对话框资源,并添加相应的控件,如图:

图3-8关口选择对话框资源

(2)在资源视窗中,Menu一项,双击IDR_MAINFRAME弹出菜单编辑框,添加一个“选关”选项,随便修改一个ID

(3)“查看->建立类向导”(Ctrl+W),第一个选项卡,找到“选关”选项的ID,选中COMMAND消息,点右边按钮添加函数。

图3-9添加函数图1

(4)接下来资源视窗,Bitmap下插入Dialog对话框并编辑,添加一个编辑框,修改编辑框ID“查看->建立类向导”,添加新类,填好类名就会自动生成.cpp文件和.h文件。

基类选CDialog,对话框ID选上面建好的对话框。

OK

图3-10添加函数图2

(5)为编辑框添加一个变量,用来存储编辑框获得的数据。

选项卡MemberVariables,类名选上面那个对话框的类名,选中编辑框的ID,增加变量

图3-11变量设置

(6)要想在CBoxManDlg类中使用这个对话框类,必须包含头文件:

#include"MapSelect.h"

最后,选项卡关联函数中调用这个对话框类:

voidCBoxManDlg:

:

OnSelect()//关卡选择

{

//TODO:

Addyourcommandhandlercodehere

CSelectsel;

sel.DoModal();

g_level=sel.m_level;

//CStringstr;

//str.Format("%d",g_level);

//MessageBox(str);

GameStart();

}

选关功能完成

4详细设计

4.1地图文件读取模块的设计与实现

地图文件读取模块,主要负责将对地图文件读取,并把相应的文件数据转换成地图显示出来。

其设计步骤如下:

(1)读取当前文件夹中的地图文件。

(2)判断当前选择关口是否在文件夹中存在。

(3)如果存在则把当前关口的地图信息放置到地图数组中。

其实现代码如下所示:

voidCBoxManDlg:

:

loadMap(intnum)

{

CStringstr;

str.Format("[%d]",num);//格式化字符串,即将关卡编号变成[X]

FILE*pFile=fopen("./Debug/map.txt","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.2地图绘制模块的设计与实现

地图绘制模块主要将地图数组中的数据绘制成地图图像。

其设计分为如下几步。

(1)格局要求,实现不同类型格子的绘制函数。

地图数组及地图文件中各字符代表的意思如表4-1所示:

表4-1地图数组及地图字符代表的意思

数据

图像

说明

0

背景

MAP_BACK

填充背景

1

MAP_WHITEWALL

地图边框

2

地板

MAP_BLUEWALL

可移动的空间

3

目标

MAP_BALL

放箱子的位置

4

箱子

MAP_BOX

初始箱子的位置

5

目标与箱子重合

MAP_REDBOX

箱子到达目标位置

6

MAP_MAN

人的位置

7

人和目标重合

MAP_MANBALL

人站在目标上

(2)读取地图数据,根据不同的数据调用不同的绘图函数。

地图绘制,模块的实现代码如下:

voidCBoxManDlg:

:

drawMap(CDC*pDC)//绘地图接口函数

{

inti,j,x,y;

for(i=0;i<14;i++)//遍历行

{

for(j=0;j<16;j++)//遍历列

{

x=j*29;

y=i*29;

switch(m_cMap[i][j])//根据数组中的数据进行绘图

{

caseMAP_BACK:

//0绘制背景

drawBack(x,y,pDC);

break;

caseMAP_WHITEWALL:

//1绘制地图边框

drawWhiteWall(x,y,pDC);

break;

caseMAP_BLUEWALL:

//2绘制地板

drawBlueWall(x,y,pDC);

break;

caseMAP_BALL:

//3绘制目标

drawBall(x,y,pDC);

break;

caseMAP_BOX:

//4绘制箱子

drawBox(x,y,pDC);

break;

caseMAP_REDBOX:

//5绘制箱子与目标重合

drawRedBox(x,y,pDC);

break;

caseMAP_MAN:

//6绘制人

drawMan(x,y,pDC);

break;

caseMAP_MANBALL:

//绘制人和目标重合

drawManBall(x,y,pDC);

break;

}

}

}

}

4.3键盘操作模块的设计与实现

键盘操作模块主要负责接收玩家键盘输入并进行箱子移动等处理,其设计比较简单,只需要通过如下几步即可实现。

(1)通过截获当前窗口中键盘按下消息来判断玩家按下的按键。

(2)根据玩家按下的按键把人的相关坐标进行加减。

例如:

当玩家按下方向键“右”时,把人的X坐标增加,反之,把人的X坐标减少。

(3)把增加后的数据与地图数组中的数据进行比较,只要不是地图边框就可以移动,如果是箱子就还需要将箱子的坐标进行移动。

(4)但是要注意,要判断箱子移动后的坐标是否可以移动。

键盘操作模块的实现,主要代码如下:

BOOLCBoxManDlg:

:

PreTranslateMessage(MSG*pMsg)

{

if(pMsg->message==WM_KEYDOWN)

{

updateMap(pMsg->wParam);//根据按下的按键进行判断

Invalidate(FALSE);

if(isFinish())//调用规则模块函数,判断是否胜利

{

AfxMessageBox("恭喜你!

过关!

");

g_level=g_level+1;//胜利后将当前关口加1

if(g_level>g_maxlevel)

{

g_level=1;//如果大于最大关口编号,重新开始

}

GameStart();

}

}

returnCDialog:

:

PreTranslateMessage(pMsg);

}

4.4游戏规则模块设计与实现

游戏规则模块,主要负责游戏规则的判断。

其设计方法需要在每次玩家移动人物后,对当前地图数组进行判断。

如果当前地图中存在单独的“目标区域”或者“人物站在目标上”两种情况,就说明玩家未过关,放置就死过关。

游戏规则模块的实现,代码如下:

BOOLCBoxManDlg:

:

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;//游戏结束

}

5VC调试方法介绍

VisualC/C++是众多C/C++编译器中,调试功能较为强大的编译器之一。

调试程序是每个初学者必须经历的过程,只有不断发现自己的错误,才能减少编程错误,提高编程能力。

当然我们不建议一遇到错误就调试,我希望大家先用眼睛看,把常见的错误都改正后,最后不行再调试,这样编程能力才会进步。

要做到十分钟上百行无错代码的能力,不下苦功是练不成的。

常用的调试快捷键有:

F10单步运行,不进入函数。

F11单步运行,进入函数。

如果是自定义函数,则进入自定义函数。

如果是系统函数,如scanf,printf,return等等,则进入汇编,当然这不是我们期望的。

单步运行的同时,左下方会自动显示当前被改变值的变量,右下方则可以输入自定义变量。

一般F10,F11结合使用。

F9设置断点。

光标所在行设置断点。

F5运行到断点处暂停。

为了更快运行到我们关心的地方,避免F10一步一步的运行浪费时间。

F9,F5一般结合使用,到我们关注的地方后,我们可以继续F10。

设断点的另外一大好处,是在递归程序中设置断点,可以很快运行到下一层中。

写程序要养成良好代码风格,没有人会喜欢看别人错误的代码,尤其是那些没有分行缩进,一律左对齐的代码。

养成分行缩进的风格在检查括号匹配的时候,也非常方便。

运行时错误:

一运行就弹出窗口,或在某些输入数据的情况下,弹出“内存出错警告”的窗口。

多数是由于指针访问非法空间造成的,比如未动态开辟就访问,释放后再次访问或释放等等。

数组下标越界,开辟极大空间等也有可能导致此类错误。

解决方法,可以通过单步运行F10或运行到断点处F5,确定出错行,然后仔细检查代码,加以修正

5.1调试快捷键

F5:

?

开始调试

Shift+F5:

停止调试

F10:

?

?

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

F11:

?

?

调试到下一句,跟进函数内部

Shift+F11:

?

?

从当前函数中跳出

Ctrl+F10:

?

?

调试到光标所在位置

F9:

?

?

?

?

?

?

设置(取消)断点

Alt+F9:

?

?

?

?

高级断点设置

5.2跟踪调试

1、?

尽量使用快捷键时行调试

2、?

观察调试信息

3、?

高级中断设置

5.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菜单选项(里面包含一些常用调试手段)

这里列出不常见的两个,有Exceptions,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)

运行到光标所在位置。

(注:

貌似执行只能向

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1