《C++语言程序设计》课程设计 推箱子.docx
《《C++语言程序设计》课程设计 推箱子.docx》由会员分享,可在线阅读,更多相关《《C++语言程序设计》课程设计 推箱子.docx(18页珍藏版)》请在冰豆网上搜索。
《C++语言程序设计》课程设计推箱子
辽宁工业大学
《C++语言程序设计》课程设计(论文)
题目:
推箱子
院(系):
软件学院
专业班级:
软件工程103班
学号:
*********
学生姓名:
11111111
**********************
教师职称:
讲师
起止时间:
2010.12.20-2010.12.31
课程设计(论文)任务及评语
院(系):
软件学院教研室:
软件教研室
学号
101301111
学生姓名
11111
专业班级
软件工程103
课程设计(论文)题目
推箱子
课程设计(论文)任务
(1).掌握面向对象程序设计语言C++的基本语法
(2).掌握C++面向对象设计的思想
(3).掌握VC++6.0与DEVC++开发工具的使用
(4).运用标准C++规范设计应用程序
设计过程中,要严格遵守设计的时间安排,听从指导教师的指导。
正确地完成上述内容,规范完整地撰写出设计报告。
指导教师评语及成绩
成绩:
指导教师签字:
年月日
第1章课程设计目的与要求
1.1课程设计目的
将理论教学中涉及到的知识点贯穿起来,对不同的数据类型、程序控制结构、数据结构作一比较和总结,结合设计题目进行综合性应用,对所学知识达到融会贯通的程度。
通过课程设计,学生在下述各方面的能力应该得到锻炼:
(1)进一步巩固、加深学生所学专业课程《C++语言教程》的基本理论知识,理论联系实际,进一步培养学生综合分析问题,解决问题的能力。
(2)全面考核学生所掌握的基本理论知识及其实际业务能力,从而达到提高学生素质的最终目的。
(3)利用所学知识,开发小型应用系统,掌握运用C++语言编写调试应用系统程序,训练独立开发应用系统,进行数据处理的综合能力。
(4)对于给定的设计题目,如何进行分析,理清思路,并给出相应的数学模型。
(5)掌握面向对象程序设计的方法。
(6)熟练掌握C++语言的基本语法,灵活运用各种数据类型。
(7)进一步掌握在集成环境下如何调试程序(单步调试,设置断点、观察表达式,分块调试)和修改程序。
1.2课程设计的实验环境
硬件要求能运行Windows操作系统的微机系统。
C++语言应用程序开发软件使用:
VC++系统,或其他C++语言应用程序开发软件。
1.3课程设计的预备知识
熟悉C++语言程序设计的基本知识及VC++编辑器的使用方法。
1.4课程设计要求
1.仔细分析设计题目,画出程序流程图,编写程序源代码。
2.积极上机调试源程序,增强编程技巧与调程能力。
3.认真书写课程设计预习报告,课程设计说明书。
4.遵守课程设计要求和机房管理制度,服从指导教师的安排,确保课程设计的顺利完成课程设计内容
第2章课程设计内容
2.1C++语言程序设计------《推箱子》问题分析
本游戏的目的就是把所有的箱子都推到目标位置上。
箱子只能推动而不能拉动。
一次只能推动一个箱子。
本程序支持键盘操作,可以给用户足够的思考空间,使用户的智力在游戏的乐趣中得到充分的锻炼。
此外还可以进行选关游戏。
根据难度的不同箱子的位置以及需要移动的数目也不同,在游戏中可以随意选择任何难度的关卡进行游戏。
2.1.1功能分析
游戏的功能描述如下:
首先运行游戏并载入相应的地图,屏幕中出现一个推箱子的工人,其周围是预制好的地图、围墙、人可以行走的通道、几个可以移动的箱子和游戏胜利结束时安放这些箱子的目标位置(用白色的球行标识)。
玩家先通过功能按键选择希望到达的关卡,再通过编辑区中的方向键操纵推箱子工人的位置。
当工人靠近箱子并朝箱子位置移动的时候,箱子在其移动方向没有被其他物件所阻碍的情况下可以被移动。
当所有箱子被工人移到指定的安放位置后,则胜利通关进入下一关的游戏。
2.1.2算法设计及程序设计中技术重点
大多数的游戏都是通过与用户的交互并根据具体情况来做相应的运算处理的,在整个推箱子的游戏过程中,用户总是通过键盘操作界面的显示来实现交互。
下面就从不同的角度来分析这个游戏的特性。
这里先做一个假设:
游戏过程中的某一瞬间,工人在某个区域,此时游戏接受到用户的按键动作指示并按照游戏规则判断出该动作应该做出的响应。
该响应是在没有违反游戏规则的情况下使工人执行用户指示的运动,对违反游戏规则的指示则不予以响应。
下面分析一下工人将会遇到的所有情况,以便归纳出动作的算法。
1.
前方是通道:
2.前方是墙:
3.前方是目的地:
4.前方是箱子:
?
图中符号的含义如下所示:
:
辅助查看的方块补充位,无任何物质含义。
:
工人。
:
墙。
:
箱子。
:
目的地。
假设移动趋势方向向右,其他方位移动趋势情况也可以变化坐标方向,转为上面向右的情况。
图2.1列出工人可能遇到的所有情况,在前面3种情况中,只要根据前方的物件就可以判断出工人是否可以移动了,而第4种情况是工人的前方为箱子,需要深入判断箱子前方的状态才能判断出工人是否可以移动,所以要完全判断出操作指示是否可执行,需要2个工人前方的位置状态值。
选关功能的实现:
对于关卡数目少的游戏可以通过快捷键去选关,如按“F1”跳到上一关,按“F2”则跳到下一关,但当游戏的关数相当大的时候,再使用这种方法选关就比较麻烦了,所以需要增加一个选关的功能。
其功能描述如下:
通过选取菜单栏目的“选关”选项,弹出一个提示对话框,用户可以在对话框里填入需要载入的关卡数,确定后即可载入该关的地图并开始游戏。
(1)选关功能对话框的设计
首先在项目里添加一个对话框资源IDD_DIALOAG_LOAD_NMU,并利用ClassWizard为它创建一个基于对话框类型的类CLoadMapDlg。
接下来在这个对话框中添加一个编辑框IDC_EDIT_LOAD_NUM,用于关数的填写,选框饿类型为数字,使得用户只能填入数字,通过ClassWizard为这个编辑框添加一个关联整形变量m_loadMapNum,这样就可以通过这个整形变量来获取用户的填入关数,从而实现交互。
并且在最大、最小值里面分别填写“100”和“1”作为范围限制,这样ClassWizard就会在代码区自动添加一个校验的机制功能的模块。
(2)对话框与主窗口的数据交互
接下来就可以为菜单栏中的“选关”选项填充实现函数OnMenuLoadMap()了,这里依旧是先创建一个CLoadMapDlg类型的临时变量loadMapDlg,然后调用DoModal()函数与前面在制作使用帮助对话框不同的是,还对DoModal()函数的返回进行了分析,当玩家点击“确定”的时候,就会从loadMapDlg里面提取与编辑框关联的变量数值,然后让m_boxMan调用ChangeMissionNum载入并改变当前关数。
经过一系列的处理后,还需要在对话框中添加一些提示性的文本,将机制自动增加的不必要的信息删除。
接着进行对齐排版等,最后编译运行,就可以实现选关功能了。
地图数据的导出:
对于编制好的地图数据进行存储并导出,首先要分析生成目标地图的固定格式规律,然后才能设计出符合需求的导出功能,以便推箱子游戏子项目的运行程序能顺利地对所生成的地图进行载入。
每个地图必须有一个地图的头部,其形态由3个部分标识,而对于地图的数据体,每行由固定长度为20的数字字符组成,冰球每个地图拥有固定的行数。
经过上面分析,可以设计出这样的文件存储流程,如图2.1所示。
图2.1文件存储流程图
2.2程序中涉及的类的UML类图和主要函数流程图或框图。
功能类的设计与实现:
由于跟推箱子游戏子项目是共同协作的关系,所以它们的框架大体是一致的,只是它们实现的功能不同,一个是用作生成地图,而另外一个则是使用地图。
这里设计一个类CBoxMan_Edit。
对于CBoxMan_Edit类的功能,这里可以明确的是,它必须含有具有相同位置的另一子项目的CBoxMan类对象的属性和操作,这些属性是所有绘图功能,地图的数据存储结构等。
只有这样,子项目间才能无缝隙地连接成整个物体。
至于地图状态等数据结构的设计,应该保持一致,以便数据的正确交互。
至此,就已经抽象出CBoxMan_Edit类的基本属性和操作了。
图2.2和图2.3是本程序中的主要UML类图。
CBoxMan
-cMap:
char
-iMissionNum:
int
+LoadMap():
void
+LoadMaxMisionNum():
void
图2.2CBoxMan类图
CFrameWnd
-WIDTH:
int
-HEIGHT:
int
-SMALL_SQUARE_SIZE:
int
+Load():
void
+Load():
void
图2.3CFrameWnd类图
综合分析,可以设计出整个游戏的实现流程,如图2.4所示。
图2.4系统流程图
2.3程序源代码
#include"stdafx.h"
#include"skyblue_BoxMan.h"
#include"BoxMan.h"
#include//音效Winmm.lib
#ifdef_DEBUG
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#definenewDEBUG_NEW
#endif
intMAX_MISSION_NUM=1;
CBoxMan:
:
CBoxMan()
{m_iMissionNum=1;
:
:
MAX_MISSION_NUM=LoadMaxMissionNum();
LoadMap(m_iMissionNum);
m_ptManPosition=GetManPosition();
}
CBoxMan:
:
~CBoxMan()
{
}
voidCBoxMan:
:
LoadMap(intiMissionNum)
{
CStringstr;
str.Format("[%d]",iMissionNum);
FILE*pFile=fopen("map.info","rb");
if(pFile==NULL)
{
AfxMessageBox("载入地图文件失败");
return;
}
charcTmp[M_TAB_WIDTH*2];
fgets(cTmp,M_TAB_WIDTH*2,pFile);
while(strncmp(cTmp,str,3)!
=0)
{
fgets(cTmp,M_TAB_WIDTH*2,pFile);
}
for(inti=0;ifgets(m_cMap[i],M_TAB_WIDTH*2,pFile);
fclose(pFile);
}
intCBoxMan:
:
LoadMaxMissionNum(void)
{
intiMissionNum=1;
CStringstr;
str.Format("[%d]",iMissionNum);
FILE*pFile=fopen("map.info","rb");
if(pFile==NULL)
{
AfxMessageBox("载入地图文件失败");
return-1;
}
charcTmp[M_TAB_WIDTH*2];
while(!
feof(pFile))//notendoffile
{
fgets(cTmp,M_TAB_WIDTH*2,pFile);
if(strncmp(cTmp,str,3)==0)
{str.Format("[%d]",++iMissionNum);
}
}
fclose(pFile);
returniMissionNum-1;
}
CPointCBoxMan:
:
GetManPosition()
{
CPointmanPosition(0,0);
for(inti=0;i{
for(intj=0;j{
if(m_cMap[i][j]==MAP_MANWALL||m_cMap[i][j]==MAP_MANBALL)
{
manPosition.x=j;
manPosition.y=i;
}
}
}
returnmanPosition;
}
voidCBoxManWnd:
:
OnMenuGameLevel()
{
CMissionLevelDlgmissionDlg;
missionDlg.m_iMisslionLev=m_boxMan.GetNowMissionNum();
if(missionDlg.DoModal()==IDOK)
{
intiMissionLev=1;
iMissionLev=missionDlg.m_iMisslionLev;
m_boxMan.ChangeMissionNum(iMissionLev);
Invalidate(FALSE);
}
}
if(m_bSound==TRUE)
{
m_pSubMenu->CheckMenuItem(ID_MENU_GAME_MUSIC,MF_CHECKED|MF_BYCOMMAND);
}
else
{
m_pSubMenu->CheckMenuItem(ID_MENU_GAME_MUSIC,MF_UNCHECKED|MF_BYCOMMAND);
}
}
voidCBoxMan:
:
BoxManPlaySound(void)
{
charstrFileName[30];
switch(m_soundState)
{caseSOUND_STATE_START:
strcpy(strFileName,"start.wav");
break;
caseSOUND_STATE_MOVE:
strcpy(strFileName,"move.wav");
break;
caseSOUND_STATE_PUSH:
strcpy(strFileName,"push.wav");
break;
caseSOUND_STATE_VICTORY:
strcpy(strFileName,"victory.wav");
break;
default:
return;
}
2.4程序的实现
运行skyblue_BoxMan.exe文件,出现游戏的开始界面,如图2.5所示。
图2.5游戏开始界面
点击游戏菜单栏,可以对游戏的难度进行选关操作,界面如图2.6所示。
图2.6选关界面
例如在选择关数栏中填写数字1,会出现游戏界面。
注意所填数字必须在“0~3”之间。
之后点击“OK”按钮以进行游戏,游戏规则就是将图中的方块移动到给定圆圈的位置,通过“上”、“下”、“左”、“右”键来进行移动工人。
当所给方块全部移动到指定位置时,代表成功完成游戏,之后会自动进入下一关的游戏。
如图2.7所示。
图2.7游戏进入下一关
当箱子推至墙角,无路可走时,代表玩家必须放弃本次游戏,因为箱子已经无法再移动,如图2.8所示。
图2.8放弃游戏
点击游戏菜单中的“帮助”,可以看到对游戏玩法以及各个按钮的功能进行解释,使用帮助可以对游戏的玩法更加简明易懂,对于初学者来说,这一功能是很重要的。
如图2.9所示。
图2.9游戏帮助界面
第3章课程设计总结
C++语言是一种优秀的面向对象程序设计语言,它在C语言的基础上发展而来,但它比C语言更容易为人们学习和掌握。
C++全面兼容了C语言,同事提供了比C语言更严格、更安全的语法。
C++以其独特的语言机制在计算机科学的各个领域中得到了广泛的应用。
面向对象的设计思想是在原来结构化程序设计方法基础上的一个质的飞跃,C++完美地体现了面向对象的各种特性。
本次课程设计所实现的推箱子游戏就是利用C++这种面向对象的程序设计语言实现的,通过这次设计,使我对C++程序设计语言的学习更具体化,对于UML类图也有了更进一步的了解,明白了UML类图展示的是软件模型的静态结构,UML语言是一种典型的面向对象的建模语言,而不是一种编程语言。
此外还对一些基本语法,算法有了更深入的理解,对于程序中出现的一些错误也能自己独立调试成功。
通过课程设计,使我学到了很多以前接触不到的知识,许多书本上的理论知识应用到了实际操作中,感觉受益匪浅。
在设计过程中,我更正了许多在学习上不认真,态度不严谨的错误,并圆满的完成了此次课程设计。
这次课程设计不仅让我学到了许多知识,还培养了团队合作的精神,要到问题大家一起研究,并在老师的帮助下成功完成,希望以后还会有更多的机会来锻炼自己,增加知识量的同时提高自己的技能,收获很多。
参考文献
[1]罗伟坚.VisualC++经典游戏程序设计.北京:
人民邮电出版社,2006.2
[2]郑莉,董渊,张瑞丰.C++语言程序设计.北京:
清华大学出版社,2008.10
[3]黄维通.VisualC++面向对象与可视化程序设计.北京:
人民邮电出版社,2006.11
[4]唐龙.C++语言程序设计案例教程.北京:
机械工业出版社,2003.2
[5]张曾科.计算机辅助设计基础.西安:
西安电子科技大学出版社,2005.4
[6]刘惠芬.数字媒体技术.北京:
清华大学出版社,2001.6
[7]和克智.VisualC++6.0应用与提高.北京:
科学出版社,2006.9
[8]BruceEckel.ThinkinginC++中文版.武汉:
华中科技大学出版社,2007.9
[9]ConorSexton,张红译.C++简明教程.北京:
机械工业出版社,1988.6
[10]徐士良.C++面向对象开发.西安:
西安交通大学出版社,2004.5