还剩17页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
辽宁工业大学《C++语言程序设计》课程设计(论文)题目一个简单的飞行射击游戏院(系)软件学院专业班级学号学生姓名指导教师教师职称起止时间
2011.
12.12-
2011.
12.25课程设计(论文)任务及评语院(系)软件学院教研室软件教研室学号学生姓名专业班级课程设计(论文)题目一个简单的飞行射击游戏课程设计(论文)任务程序设计的任务与要求掌握面向对象程序设计语言C++的基本语法掌握C++面向对象设计的思想掌握VC++
6.0与DEVC++__工具的使用4).运用标准C++规范设计应用程序设计过程中,要严格遵守设计的时间安排,听从指导教师的指导正确地完成上述内容,规范完整地撰写出设计报告指导教师评语及成绩成绩指导教师签字年月日目录TOC\o1-3\h\z\u第1章课程设计目的与要求
11.1设计目的
11.2实验环境
11.3预备知识
11.4设计要求1第2章课程设计内容
22.1课题描述
22.2系统设计2功能分析3面向对象设计5类成员描述
62.3程序实现7源码分析7运行结果14第3章课程设计总结15____16第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.1课题描述项目选题为做一个飞行射击游戏游戏中有各总各样的敌机和武器,敌机按一定的几率出现,玩家消灭敌机后可得分数奖励,达到一定分数后会升级,游戏难度随着玩家级数的增加而增大游戏有很多__场面,增加了__性屏幕上有各种各样的战斗机、子弹,他们的行为各异面向对象允许各种角色的特性、行为等封装在各种各样的角色类中,作为游戏的其它功能模块,它不必关心角色是怎样运动的,而只需简单地让它自己去走,也即是把所有角色对象的Update()函数调用一次,简单得很
2.2系统设计系统流程图说明程序初始化后,开始登陆系统或者选择退出系统系统登录成功后选择游戏级别,初玩者是从最低级别开始随着游戏的进行,屏幕上显示各种详细的数据包括帧速率,生命值,武器,杀敌,分数,级数等玩家胜利晋级,失败死亡可以选择继续游戏或者退出系统飞行射击游戏的系统流程图如下所示图
2.1飞行射击游戏系统流程图功能分析游戏中有子弹系统、敌机系统、碰撞系统、图像显示等各个模块,将来还可能加入背景渲染、图形菜单、声音等功能模块尽管各个模块均有复杂的功能,利用面向对象,我可以把各个模块功能的内部实现封装在一个个类中,只提供外部接口这样,就可以做到各个模块只进行必要的通讯、交互,内部__运作,互不干扰操作方法:按方向键飞行,按Tab键武器,按空格键开火根据正常帧速率和当前帧速率的比例关系来重新计算角色的__速度,使游戏在较低配置的电脑上也能按正常的速度运行
(一)根据系统功能要求,可以将问题解决分为以下步骤
(1)分析系统中的各个实体之间的关系及其属性和行为;
(2)根据问题描述,设计系统的类层次;
(3)完成类层次中各个类的描述(包括属性和方法);
(4)完成类中各个成员函数的定义;
(5)完成系统的应用模块;
(6)功能调试;
(二)在程序设计中,重点考虑的问题有
(1)数据类型的定义;
(2)自定义构造函数的初始化与析构函数的调用;
(3)数组与指针的使用;
(4)虚函数的恰当运用;
(4)每个类提供给外部函数的权限控制;
(5)类的派生与继承的合理使用,友元函数的使用,还要重点考虑链表的正确运用
(三)本程序涉及了面向对象的设计过程中的类的概念,其中有
(1)类的定义类(Class)实际上是对某种类型的对象定义变量和方法的原型示对现实生活中一类具有共同特征的事物的抽象,是面向对象编程的基础
(2)类的构造函数的定义与类名称具有一样名称的成员函数是构造函数构造函数不能有返回值甚至不能有return语句说明一个有返回值的构造函数是错误的取构造函数的地址也是错误的如果一个类有构造函数在程序中每个该类类型的对象在使用之前由此构造函数进行初始化,构造函数是在对象的创建点上被调用的
(3)析构函数的定义析构函数是“反向”的构造函数它们在对象被销毁回收时调用设计一个函数为类的析构函数只要在类名之前加上(~)号
(4)内联函数的定义内联函数在调用时不是像一般的函数那样要转去执行被调用函数的函数体,执行完成后再转回调用函数中,执行其后语句,而是在调用函数处用内联函数体的代码来替换,这样将会节省调用开销,提高运行速度面向对象设计Sprite-xy:double-sxsywh:int-cxcy__ch:int-dxdy:double-Used:Bool-ExplosionFrameCount:int-LifeAtackness:int+Update:void+AdjustPosition:void+OutOfClient:bool+OutOfSight:boolFighterPlane-LastFireTime:int-Firing:bool+LastFireTime:int+Firing:bool+SetLastFireTime:void+Update:void+Fire=0:virtualvoid+StartFiring:void+StopFiring:voidEnermySystem-EnermyIndex:void-EnermyCount:void-Difficulty:void+EnermyIndex:void+EnermyCount:void+Difficulty:void+CreateEnermyintxinty:void+ResetDifficulty:void+Update:void+AddDifficulty:voidEnermySystem-EnermyIndex:int-Difficulty:int-EnermyCount:int+CreateEnermyintxinty:void+AddDifficulty:void+Update:void+ResetDifficulty:voidGameWorld-Width:int-Height:int-PI:int+ShowInfo__tion:void+Update:void+KeyDownWPARAMKeyCode:void+KeyUpWPARAMKeyCode:void+EnermyFireEnermy*pEnermy:void+PlayerFirePlayer*pPlayer:void+ResetPlayer:void+DrawSpriteSprite*pSprite:voidPlayer-speed:double-KillEnermyScore:int+Update:void+ActionACTIONNewActi:void+ChangeWeapon:void图
2.2程序中的UML类图类成员描述图
2.3类成员描述图Sprite类描述:所有角色类的基类主要数据成员:doubley;//X坐标和Y坐标intsxsywh;//在素材位图中的位置矩形intcxcy__ch;//碰撞检测用矩形doubledxdy;//速度intLifeAtackness;//生命攻击力intExplosionFrameCount//__动画帧数ExplosionFrameIndex;//__动画当前帧BoolUsed;//标记是否应被丢弃Bullet类描述:由Sprite类派生所有子弹类的基类主要成员函数:BulletGameWorld*pgwintx_valueinty_valuedoublesprite_vxdoublesprite_vy;//构造函数voidSetMovementdoublespeedintangle;//根据速率和角度计算分速度voidUpdate;//刷新staticintGetFireIntervalBULLET_TYPEBulletType;//返回给定类型的子弹的发射时间间隔描述:由Bullet类派生的子弹类PlayerBullet_Fire类PlayerBullet_Missile类PlayerBullet_RoundBullet类EnermyBullet1类EnermyBullet2类EnermyBullet3类FighterPlane类描述:由Sprite类派生的抽象战斗机类主要数据成员:boolFiring;//是否正在开火intLastFireTime;//上一次开火的时间主要成员函数:voidSetLastFireTime;//设置一个随机的上次开火时间voidUpdate;//刷新增加__、开火voidStartFiring;//开始开火voidStopFiring;//停止开火virtualvoidFire=0;//开火纯虚函数Enermy类描述:由FighterPlane类派生的敌机类主要成员函数:voidUpdate;//刷新增加检测是否可见、自动开火voidFire;//开火Enermy_Tom类描述:由Enermy类派生的敌机类会自动改变运动方向Enermy_Jack类描述:由Enermy类派生的敌机类斜向发生子弹成群结队出现Enermy_Mimi类描述:由Enermy类派生的敌机类横着发射子弹,运动速度快
2.3程序实现源码分析#ifndefGAMEWORLD_H#defineGAMEWORLD_HclassGameWorld//游戏类,控制整个游戏过程{friendclassDisplay;friendclassSprite;friendclassCollisionSystem;HWNDGameWindow;staticconstintMsPerFrame;doublekFPS;struct{intLastTimeFrameCountFPS;}FPS;intBufKeyCurKey;intLevel;Display*pScreen;Player*pPlayer;BulletSystem*pPlayerBulletSystem*pEnermyBulletSystem;EnermySystem*pEnermySystem;CollisionSystem*pCollisionSystem;voidDrawSpriteSprite*pSprite;voidUpdateFPS;voidShowInfo__tion;doubleGetKFPS{returnkFPS;}public:staticconstintWidthHeight;staticconstdoublePI;intTime;GameWorldHWND;~GameWorld;voidUpdate;voidKeyDownWPARAMKeyCode;voidKeyUpWPARAMKeyCode;voidEnermyFireEnermy*pEnermy;voidPlayerFirePlayer*pPlayer;voidResetPlayer;};#endif#includestdafx.h//常数定义constintGameWorld::Width=640;constintGameWorld::Height=480;constintGameWorld::MsPerFrame=20;//构造函数GameWorld::GameWorldHWNDhwnd:GameWindowhwnd{Time=GetTickCount;ZeroMemoryFPSsizeofFPS;FPS.LastTime=Time;kFPS=
1.0;srandtime0;BufKey=0;CurKey=0;Level=1;pScreen=newDisplaythis;pPlayer=newPlayerthisWidth/2Height/2;pPlayerBulletSystem=newBulletSystemthis;pEnermyBulletSystem=newBulletSystemthis;pEnermySystem=newEnermySystemthis;pCollisionSystem=newCollisionSystemthis)}//释构函数GameWorld::~GameWorld{deletepScreen;}//刷新游戏voidGameWorld::Update{intt=GetTickCount;ift-TimeMsPerFramereturn;Time=t;//难度升级ifpPlayer-Score=Level*300{pEnermySystem-AddDifficulty;Level++;}//清空屏幕pScreen-Clear;pCollisionSystem-Update;pEnermyBulletSystem-Update;pPlayerBulletSystem-Update;pEnermySystem-Update;pPlayer-Update;UpdateFPS;ShowInfo__tion;pScreen-DrawAllToScreen;}//刷新帧速率voidGameWorld::UpdateFPS{FPS.FrameCount++;ifTime-FPS.LastTime=1000{FPS.FPS=FPS.FrameCount;FPS.FrameCount=0;FPS.LastTime=Time;kFPS=double1000/MsPerFrame*FPS.FPS}}//显示信息voidGameWorld::ShowInfo__tion{HDChdc=pScreen-GetOffscreenDC;ostringstreaminfo;info帧速率:FPS.FPS__x:50k=kFPS;info生命:pPlayer-Life武器:;switchpPlayer-BulletType{case0:info机关炮;break;case1:info导弹 ;break;case2:info___;break;}info杀敌:pPlayer-KillEnermy分数:pPlayer-Score;info级数:Level;SetBkModehdcTRANSPARENT;SetTextColorhdcRGB100100100;TextOuthdc77info.str.c_strinfo.str.length;SetTextColorhdcRGB0255255;TextOuthdc55info.str.c_strinfo.str.length;SetTextColorhdcRGB000;}//发射子弹voidGameWorld::EnermyFireEnermy*pEnermy{pEnermyBulletSystem-FireHappenedpEnermy-BulletTypepEnermy-GetX+pEnermy-w/2pEnermy-GetY+pEnermy-h/2pEnermy-dxpEnermy-dy;}voidGameWorld::PlayerFirePlayer*pPlayer{pPlayerBulletSystem-FireHappenedpPlayer-BulletTypepPlayer-GetX+pPlayer-w/2pPlayer-GetY+pPlayer-h/2pPlayer-dxpPlayer-dy;}//画角色voidGameWorld::DrawSpriteSprite*pSprite{pScreen-DrawToOffscreenpSprite-GetXpSprite-GetYpSprite-wpSprite-hpSprite-sxpSprite-syfalse;}//KeyDownvoidGameWorld::KeyDownWPARAMKeyCode{switchKeyCode{caseVK_RIGHT:caseVK_UP:caseVK_DOWN:ifKeyCode==CurKey||KeyCode==BufKeyreturn;//重复的键盘消息,忽略ifBufKeyCurKeyreturn;//同时按3个方向键,非法输入,忽略BufKey=CurKey;CurKey=KeyCode;ifBufKey==VK_LEFTCurKey==VK_UP||BufKey==VK_UPCurKey==VK_LEFTpPlayer-ActionPlayer::GO_LEFT_UP;elseifBufKey==VK_LEFTCurKey==VK_DOWN||BufKey==VK_DOWNCurKey==VK_LEFTpPlayer-ActionPlayer::GO_LEFT_DOWN;elseifBufKey==VK_RIGHTCurKey==VK_UP||BufKey==VK_UPCurKey==VK_RIGHTpPlayer-ActionPlayer::GO_RIGHT_UP;elseifBufKey==VK_RIGHTCurKey==VK_DOWN||BufKey==VK_DOWNCurKey==VK_RIGHTpPlayer-ActionPlayer::GO_RIGHT_DOWN;elsepPlayer-ActionPlayer::ACTIONPlayer::GO_LEFT+KeyCode-VK_LEFT;break;caseVK_SPA__:pPlayer-ActionPlayer::START_FIRING;break;caseVK_TAB:pPlayer-ActionPlayer::CHANGE_WEAPON;break;}}//KeyUpvoidGameWorld::KeyUpWPARAMKeyCode{ifKeyCode==CurKey{CurKey=0;ifBufKey{CurKey=BufKey;BufKey=0;pPlayer-ActionPlayer::ACTIONCurKey-VK_LEFT;}Else{pPlayer-ActionPlayer::STOP_MOVING;}}elseifKeyCode==BufKeyBufKey=0;elseifKeyCode==VK_SPA__pPlayer-ActionPlayer::STOP_FIRING;}//重置角色voidGameWorld::ResetPlayer{deletepPlayer;pPlayer=newPlayerthisWidth/2Height/2;Level=1;pEnermySystem-ResetDifficulty;}运行结果图
2.4运行结果图第3章课程设计总结C++是从C语言发展演变而来的一种面向对象的程序设计语言C++语言主要特点表现在两个方面,一是全面兼容C,二是支持面向对象的方法由于面向对象方法的突出优点,目前它已经成为__大型软件采用的主要方法,C++语言是应用最广泛的面向对象的程序设计语言之一这次课程设计基本上含盖了大学一年级学习到的C++语言知识点,课设题目要求不仅要求对课本知识有较深刻的了解,同时要求程序设计者有较强的思维和动手能力这次课设使我了解我编程思想和编程技巧,也认识了软件生命周期的各个环境,包括构思、设计、编写、调试、发布、文档化、维护和修订编程的风格也很重要,同学只关心程序运行的结果,而对程序代码的结构的良好丝毫不在意这是非常不可取的,如果我们希望将来从事编程工作,在这一点上该引起足够的重视这是严谨的态度,很重要做课设不仅让我修补了以前学习的漏洞,也让我知道一个道理编程需要兴趣和实际动手这应该可以借鉴在老师的教学工作上创新思维至关重要,这不仅让我们写出精简的代码,也有助于__出高效的程序有些判断条件没有想全,当执行某些操作时就出现异常,比如___方块的停止条件的判断,如果判断条件不完整就会出现下落的方块遇到已经存在的方块后还继续下落通过这次课程设计,我对游戏编程有了初步认识,对游戏算法有了一定了解从游戏的需求分析,系统设计,再到游戏代码实现每一步都对自己是一个挑战,虽然参考了书上的系统设计和一定代码,但是真的__到游戏编程的快乐,也学习到不少东西,主要是实现需求分析的能力以及算法地描述在这次的设计过程中,我学到的不仅是知识,我还认识到许多事情这次设计使我的编程水平提高了一大步,使我充分的认识到合作的可贵这次设计对我的综合能力是一次很好的锻炼,但是我必须承认自己的能力和知识还很肤浅所以今后我的学习道路还是很漫长的由于我水平有限,加之时间短暂,故学籍管理系统中还有许多不足之处,请老师批评指正,我会在以后的制作中不断改进,不断完善____
[1]赵福生.C++语言程序设计基础.北京:水利出版社.2003年1月
[2]张岫.C++程序指导.北京:机械工业出版社.2005年7月
[3]李新.C++语言编程向导.北京:清华大学出版社.2007年6月
[4]
[5]杜明.C++程序设计基础.北京:清华大学出版社.2005年4月
[6]张__.C++语言及其程序设计教程.北京:电子工业出版社.2004年8月
[7]吴访升.C++程序设计.北京:机械工业出版社.2001年5月
[8]黄迪明.C++语言程序设计基础.北京:电子工业出版社.2006年3月
[9]钱能.C++程序设计教程.北京:清华大学出版啥.2004年11月
[10]刘丽.C++实战练习.北京:机械工业出版社.2004年6月程序初始化登陆或者退出从相应级别开始射击详细数据显示晋级或者死亡退出系统fighterplanebulletspritePlayerBullet_RoundBulletPlayerBullet_MissilePlayerBullet_FireenermyEnermy_MimiEnermy_JackEnermy_Tom。