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

更新时间:2024-06-16 22:24:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

学号 武汉理工大学华夏学院

课程设计报告书

课程名称:

软件综合

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

系 名: 信息工程系

专业班级:

姓 名:

指导教师:

2013 年 元月 18日

课程设计任务书

学生姓名: 专业班级: 软件2101 指导教师: 工作单位: 信息系计算机教研室 设计题目: 基于VC++6.0的“推箱子”游戏软件的开发与测试 初始条件:

1. 已完成c语言程序设计、软件工程、数据库概论或数据库技术等课程的学习 2. 系统环境:Intel 奔腾4以上处理器,1G以上内存,40G以上硬盘,

Windows编程环境,Visual C++ 6.0编程工具

要求完成的主要任务:(在规定的时间内完成下列任务)

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

主要任务:

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

1. 按系统功能进行游戏背景区域(移动区域、围墙)的设计与绘制: 2. 根据系统实现的功能,绘出功能图、系统流程图 3. 模块调试,运行结果正确,并经教师检查及答辩;

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

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

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

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

附录:① 使用说明 ② 参考资料

时间安排:2012年12月29日---2013年元18日(共三周)

第1天 第2天~第5天 第6天~第9天 第10天 第11天~第14天 第15天 介绍本次课程设计的目的、要求,介绍MFC AppWizard应用程序框架的简介 介绍MFC中的窗口消息的创建及用,完成游戏背景区域(移动区域、围墙)的设计与绘制 完成目标区域、小人、箱子的绘制、绘制地图、加载/更新地图、关卡的设置及系统整合 系统运行与演示 系统测试与掌握调试的方法和技巧,撰写设计报告 按项目组进行演示与答辩,形成课程设计报告文档 指 导 教 师 签 字: 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 5 VC调试方法介绍 .................................................................... 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月由Thinking Rabbit 公司首次发行,名“仓库番”。箱子只可以推, 不可以拉, 而且一次只能推动一个,胜利条件就是把所有的箱子都推到目的地。

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

推箱子游戏是目前比较流行的游戏之一,很多操作系统或者流行软件都会带有这种游戏。它既能锻炼思维的严密性,又有很多乐趣。我们团队比较喜欢玩这个游戏,于是备采用c++编程语言进行实现。

2 项目需求分析

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

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

推箱子游戏的设计目标完成一个比较简单的游戏,使之能够实现推箱子游戏的基本功能,成为一个比较完整的游戏框架。在一个狭小的仓库中,要求把木箱放到指定的位置,稍不小心就会出现箱子无法移动或者通道被堵住的情况,所以需要巧妙的利用有限的空间和通道,合理安排移动的次序和位置,才能顺利的完成任务。

在游戏主界面中,会出现一个小人、若干个箱子和箱子放置点。玩家需要利用方向键控制小人上下左右移动,并推动界面中的箱子到达指定的箱子放置点。

3 系统概要设计

3.1 功能控制模块

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

1

功能控制模块 屏幕输出功能 游戏通关时的通关提示 3.2 系统流程图

系统流程如图3-2所示。指定位置状态判断功时刻判断游戏的小人物、箱子所能移动的方向位置和游戏能不能通关 图3-1 功能模块

2

关卡重置功能 倒回本关的初始状态和重新选择关卡

继续 进入上一次 离开游戏的 界面 返回 初始化主界面 退出 关闭游戏窗口 开始 关于推箱子游戏 选择关卡 游戏规则的说明 初始化进入新游戏 返回 是否是最后一关成成功提示 通关提示 进入下一关

图3-2 系统流程图

3.3 推箱子游戏具有的功能

3.3.1 能够显示主菜单和界面

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

3.3.2 能够实现键盘操作功能

能够接受到键盘驶入的方向键信息,并根据不同的方向键把游戏人物移动到相应的位置。例如,当玩家单机方向键向上“上”时,如果向上的位置是可以移动的,那么就当把游戏人物向上西东一个方格。

3

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

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

3.3.4 游戏胜负判断功能

在游戏中,当玩家把所有的箱子都推到指定点时,玩家胜利通过当前游戏关口,进行下一关口的游戏。如果玩家无法将箱子全部推到指定位置时,玩家失败,玩家可以选择重新开始进行当前关口的游戏,还是退出游戏。

3.3.5 支持关口选择功能

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

3.4 推箱子功能框架

推箱子游戏 初始化模块 画图模块 移动箱子模块 移动小人模块 功能控制模块

图3-3 功能框架

初始化模块。该模块包括屏幕初始化和游戏第一关到第最后一关的初始化。屏幕初始化用于输出操作信息,游戏每一关的初始化时构建每一关的关卡。

画图模块。该模块最要是被其他模块调用,用于画墙、在空地画箱子、画小人、和画目的地。 移动箱子模块。该模块用于移动箱子,包括目的地之间、空地之间和目的地与空地之间箱子的移动

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

4

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

3.5 游戏界面设计

3.5.1 游戏主界面

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

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

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

图3-5 游戏菜单结构

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菜单响应函数的实现,各类菜单调用响应,要运用到的代码如下:

void CBoxManDlg::OnExit() //退出游戏响应 {

int i=MessageBox(\退出游戏\提示\

类别 弹出菜单 菜单栏 菜单栏 菜单栏 说明 游戏的主菜单 重新开始 关卡选择 游戏退出 6

switch(i) { case 1:

CDialog::OnCancel(); break;

case 2: } }

void CBoxManDlg::OnSelect() //关卡选择 {

CSelect sel; sel.DoModal(); g_level=sel.m_level;; GameStart(); }

void CBoxManDlg::OnRestart() //重新开始 { }

GameStart();

break;

3.7 关卡选择对话框的实现

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

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

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

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

7

{ for (int i=0;i<14;i++) //遍历所有列 {

for (int j=0;j<16;j++) //遍历所有行 {

if (m_cMap[i][j]==MAP_BALL || m_cMap[i][j]==MAP_MANBALL) {

return FALSE; //有目标区域或人物站在目标区域上 } } }

return TRUE; }

//游戏结束

13

5 VC调试方法介绍

Visual C/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、 高级中断设置

14

5.3 异常调试

重试->取消->调试

函数堆栈,用variables或者call stack 窗口 VC6.0Debug调试总结

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

①:在任意工具栏的位置,单击鼠标右键,勾选Debug项 ②:Tools---->Customize--àToolbars--àDebug--àclose 引申:工具栏和工具条的区别? 一个工具栏可以放置多个工具条。 2.断点调试

F9:设置或去除断点。如果当前行未设置断点,按F9可在当前行设置断点,如果当前行已设置断点,按F9则为去除断点设置。 Alt+F9:调出断点设置窗口

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

①:Build--Start Debug--Go ②:F5

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

一旦按F5之后进入调试阶段,IDE编辑器上就会增加一个Debug菜单选项(里面包含一些常用调试手段) 这里列出不常见的两个,有Exceptions,Threads,Modules,可以通过点击Modules进入Module List对话框,在这里可以看到一些模块(Module),如kernel32.dll,可以Google kernel32.dll的一些信息。。。这里略过,我也不是很熟悉。。。--b,欢迎大牛补充。。。都说说是怎么用的。 ①:Debug--àStop Debugging ②: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(重新开始调试的快捷键)

15

①:Debug--àRestart ②: Ctrl+Shift+F5 6.单步调试

前提条件---调试阶段

①:Debug--Step Into (F11) 逐语句。(例如,遇到函数调用时会进入被调函数) ②:Debug--Step Over (F10)

逐过程(例如,遇到函数调用语句时,不会进入被调函数) ③:Debug--Step Out (Shift+F11)

跳出过程调用(例如,当F11逐语句进入被调函数后,按Shift+F11会跳出被调函数) ④:Debug--àRun to Cursor (Ctrl+F10) 运行到光标所在位置。(注:貌似执行只能向前不能向后,即光标定位不能在已经执行过的代码里),经测试,如果光标在已执行的代码里,按Ctrl+F10则程序会完全执行起来,猜测。。。是不是执行完程序,再重新,从头开始执行到光标处,貌似显示的是没执行到光标处。。。--b欢迎批评补充。 7.变量监视

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

调出QuickWatch对话框,添加要监视查看(watch)的表达式(expression),然后 Add Watch,程序之后就会监视该表达式 ②:View--Debug Windows---Watch (Alt+3) 监视你设置的需要被监视的变量。

③:View--àDebug Windows---àVariables (Alt+4) 监视所有变量。

注:View下的Debug Windows下的所有项均在Debug工具条中有。 注:在Debug下,可以将变量选中,直接拖到Variables的窗口中监视。。。,是不是很方便很HIGH

16

6 功能测试

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

这个演示主要是测试游戏的菜单和界面显示是否成功,其步骤如下。 (1) 运行推箱子程序.exe文件,如图6-1所示

图6-1 运行文件 (2) 程序启动后,其菜单及界面如图6-2所示

图6-2 界面效果

6.2 键盘操作功能测试

键盘操作功能的演示,演示步骤如下:

(1) 游戏开始后人物的位置,如图6-3所示

17

图6-3

(2) 按下键盘上的“下”方向按键。 (3) 查看任务是否向下移动,如图5-4:

图6-4

18

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

将箱子放置到指定位置时,箱子会变色的功能,具体步骤如下 (1) 推箱子游戏已经开始,如图6-5所示

图6-5

(2) 推动箱子到指定位置后,显示如图5-6所示

图6-6

19

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

推箱子游戏是否支持地图扩展功能,步骤如下: (1) 查看第一关地图文件,其内容如下: (2) 与游戏显示的地图对照

图6-8 修改后的地图文件

(3) 重新进行第一关游戏,地图显示

图6-7 第一关地图文件

图6-9

20

7

特殊问题及解决方法

1、 问题1 问题描述

记录所有走过的步数总是不成功 解决方案

设置变量sum 解决结果

可以记录所有走过的步数,当游戏重新开始的时候本关的步数清零。

2、问题2 问题描述

在初始化地图函数时,由于每加载地图均要将目的地存储于 POINT DE[]中,由于人物移动过程

中当人物占领目的地时,目的地POINT DE[]存储内容也会随之改变,事实上DE里面的值是不会变的 解决方案

对POINT DE[]的值只初始化一次,记在选关按钮按下时,或游戏结束时才初始化,当人物移动时,当加载目的地图片时,不再对 POINT DE[]进行赋值。 解决结果

目的地的图片正常显示,成功判断当前关是否成功

8 设计小结

从工程实践开始前两周,原计划使用MFC开发程序,因为较WIN32应用程序熟悉,但是后来考虑到运用WIN32应用程序能使得开发更为灵活,且文件不至于冗余。刚刚使用WIN32应用程序开发的时候,对整个开发框架和消息机制的不熟悉,走了很多弯路,花了不少时间实践,从最初的需求分析设计,概要设计,我们小组都会集中实验室进行详细的探讨,虽然在探讨过程中不免会有不同意见,但是都能很好的协商,调节过来,本次实践不仅在编程知识上有了更深的理解,也加深了我们对团队合作的重要性的认识。

虽然本款游戏与传统上的推箱子游戏大同小异,但是我们尽了自己最大的努力去完善和修正它,小组成员都尽力扮演好自己的角色,对自己的分工也是按时按量的完成。为了此次项目能按时按量的完成,我们在明确自己的方向后,不断地在百度,谷歌,图书馆寻求为我们的答案。本次实践,我们的美工也是异常幸苦,为了满足我们程序主题的要求,不断地更新图片,有时候也会连续制作图片达3,4个小时。虽然这次的游戏没有预想中的那么好,但是通过本次学习,下个作品将会更加出彩。

编程工作不是那么容易的,有时候为了找一个小小的错误,会耗上我们一整下午的时间,我们需要一点一点的排除,不停地分析和排除可能出错的原因,所以编程是需要很大的勇气和耐心。有人说这是在浪费我们的时间,其实事实上当你自己独立的解决完一个问题后,你会有很大的收获。可以说,结果固然重要,但在解决问题的过程中,我们学会了如何分析和解决问题不是更有意义吗?!

9 参考文献

[1] 王慧芳,毕建权. 软件工程

[2] 罗伟坚. Visual C++经典游戏程序设计. 人民邮电出版社

21

设计过程中质疑(或答辩)记载: 1、如何打开地图? 答:CString str; str.Format(\ FILE *pFile=fopen(\ 然后打开将读取的文件放入缓冲区中即可 指导教师评语: 签名: 2013年 1 月 日

22

本文来源:https://www.bwwdw.com/article/bzs3.html

Top