课程设计报告坦克大战文档格式.docx
- 文档编号:22553396
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:74
- 大小:539.31KB
课程设计报告坦克大战文档格式.docx
《课程设计报告坦克大战文档格式.docx》由会员分享,可在线阅读,更多相关《课程设计报告坦克大战文档格式.docx(74页珍藏版)》请在冰豆网上搜索。
因为之前的学习,我具备了C++语言和面向对象的基础知识,在这个基础上按照实验指南的指导一步一步进行下去,把这款经典游戏做出来。
巩固之前所学知识也学习新的知识。
2.可行性研究
1.技术可行性
本游戏采用FunCode和VisualC++6.0进行开发,基于Windowsxp和Windows7操作系统。
Funcode软件提供了大量基础类库,可以快速方便地构造出游戏软件。
之前课程学习过C++,具有一定的C++语言开发基础,对面向程序设计有一定了解。
2.经济可行性
此次课程设计由我一人完成,只需装有Funcode及VisualC++的电脑一台,无资金需求;
且制作出来的游戏软件并不打算发行,也无后期资金需求,经济完全可行。
3.操作可行性
本游戏只需用W、A、S、D来移动,用J键进行攻击,操作十分简单,界面友好,符合用户操作习惯。
3.需求分析
1.游戏内容需求
在一个战场上,玩家控制坦克,消灭敌方坦克,并防止敌方坦克摧毁我方基地。
游戏的具体要求如下:
游戏有一个初始页面,如下图。
按下任意键开始游戏,玩家控制坦克在战场上穿梭,碰到墙时,不能通过。
敌方坦克自由移动,每隔2秒改变一个方向,每隔3秒发射一发子弹。
敌方坦克每隔5秒出现一辆,从屏幕上方的左、中、右三个位置依次出现。
当玩家被消灭或者我方基地被摧毁或者游戏时间大于30秒的时候,游戏结束。
图1游戏开始前
图2进入游戏
2.游戏规则
1.按下任意键游戏开始。
2.通过WSAD键控制玩家坦克上下左右移动,但不能走出边境。
3.通过J键控制玩家坦克发射子弹。
4.玩家坦克有三条生命,每条命有1点HP,每次被敌方坦克的子弹打到扣除1点HP,当HP=0时,如果玩家生命条数>
0,则玩家在初始位置复活,否则游戏结束。
5.游戏中的地形包括砖墙、海水、钢板、森林、地板5种。
6.敌人种类则包括装甲车、轻型坦克、宝物坦克、3种。
7.当关卡中的敌方坦克被全部消灭完,则进入下一个关卡,如果当前关卡为最后一关,则游戏通关。
8.在界面外用一个文本显示玩家生命条数,一个文本显示当前关卡,一个文本显示敌方坦克剩余数量。
4.游戏设计
1.类的设计
游戏中能直接看到的精灵:
玩家坦克、敌方坦克、子弹、地形、当前关卡文本精灵,当前玩家剩余生命条数文本精灵,当前敌方坦克剩余数量文本精灵。
其中,当前关卡文本精灵,玩家剩余生命条数文本精灵,当前敌方坦克剩余数量文本精灵只需要显示响应的数值,可以直接使用CTextSprite类。
玩家坦克、敌方坦克、子弹、地形创建相应的类。
可以从玩家坦克和敌方坦克抽象出一个坦克类,作为父类。
坦克类,子弹类,地形类继承CSprite类,通过CSprite类的方法操作精灵。
玩家坦克和敌方坦克被摧毁时,都要播放相应的爆炸动画,这些动画可直接使用CAnimateSprite类。
创建一个游戏类,各个类之间的通信在游戏世界类中进行。
该类采用“单例模式”,在程序中只能创建一个对象。
本游戏是坦克大战,该类称为坦克游戏类。
创建一个精灵工厂类,用来生成各种精灵类的对象。
这就是“工厂模式”。
游戏中还有其他类,详见下面类图:
图3类图
2.游戏流程
1.主流程
游戏分四个状态:
未开始、开始、运行和结束。
CGameMain类是控制游戏流程的类,游戏屏幕每刷新一次,调用一次该类的GameMainLoop方。
GameMainLoop根据m_iGameState的值分别调用该类的GameInit、GameRun和GameEnd方法。
这三个方法对应初始化游戏、游戏运行和游戏结束这三个状态。
GameInit只执行一次。
执行后修改游戏状态。
屏幕刷新后,进入状态2,开始执行GameRun方法。
当玩家HP>
0即玩家坦克不死的时候,GameRun一直被执行。
玩家坦克被摧毁后,调用GameEnd执行一次,清除本局游戏数据,恢复游戏未开始状态。
主流程图如下:
图4主流程图
2.游戏初始化
完成游戏初始工作,界面上的工作:
当前关卡初始化为1,创建玩家坦克并放置在指定位置。
此外,我们需要创建TankWorld对象,该对象采用单例模式,所以不管游戏运行多少次,TankWorld对象始终只有一个,并且把玩家飞机对象加入到TankWorld对象中。
图5初始化流程图
3.游戏运行
游戏运行中,每刷新一次屏幕,需要根据最新数据,更新玩家生命次数,设置玩家移动方向,删除被摧毁的敌方坦克和子弹,判断是否生产新的电脑坦克。
图6运行流程图
玩家坦克处理:
在游戏的运行中,玩家通过WSAD键改变了玩家坦克的移动速度及方向,我们在游戏运行中要实时的向FunCode接口更新玩家数据,达到在屏幕上更新玩家状态。
图7玩家坦克处理流程图
电脑坦克处理:
删除HP=0的电脑坦克,并播放爆炸动画,判断是否出战新的坦克。
图8电脑坦克处理流程图
文本精灵处理:
在游戏运行时玩家的生命条数以及当前关卡和敌方坦克剩余数量都会实时发生变化,所以文本精灵的数据也需要实时更新显示。
图9文本精灵处理流程图
地形及关卡处理:
在游戏运行时地形的属性也是会随着坦克子弹的击中而发生变化的,我们需要在此方法内实时更新地图中所有地形的信息,关卡也会发生变化,例如初始化关卡,或者销毁关卡等。
图10地形及关卡处理流程图
游戏结束:
将游戏中剩余的精灵删除,包括删除精灵本身和集合中对应的对象。
重新显示游戏开始的提示图片。
图11游戏结束流程图
键盘按下事件:
本游戏中,游戏状态为1时,按下任意键,游戏状态转为2。
游戏状态为2时,玩家按下了WSAD键,分别设置玩家坦克的上下左右速度,当按下的是J键,需要调用玩家坦克的射击方法。
图12键盘按下流程图
键盘弹起事件:
本游戏中,游戏状态为2时,玩家松开WSAD键,相应设置玩家坦克上下左右速度为0。
图13键盘弹起流程图
精灵之间的碰撞
本游戏中,坦克均为发送碰撞并且接收碰撞,子弹发送碰撞,地形接收碰撞,宝物接收碰撞。
图14精灵的碰撞流程图
玩家坦克发生碰撞:
玩家发生碰撞时,会撞到地形、电脑坦克、宝物。
图15玩家坦克碰撞流程图
玩家炮弹发生碰撞:
玩家炮弹发送碰撞会撞到地形、敌方坦克、敌方炮弹。
图16玩家炮弹碰撞流程图
电脑坦克发送碰撞:
电脑坦克会撞到玩家坦克、地形、撞到盟友。
图17电脑坦克碰撞
电脑坦克炮弹发送碰撞:
电脑坦克炮弹需要处理撞到玩家坦克、地形、盟友。
图18电脑坦克炮弹碰撞
世界边界碰撞事件:
本游戏中,游戏状态为2时,主要处理电脑坦克的世界边界碰撞事件。
图19世界边界碰撞
3.游戏序列图
游戏初始化
在CGameMain类的GameInit方法中完成游戏初始化。
图20游戏初始化
键盘按下事件
在CGameMain类的OnKeyDown方法中完成。
键盘按下处理三个事件:
一个是游戏的开始:
按下空格键;
一个是玩家坦克的上下左右移动:
当游戏状态为2时,且按下了WASD键;
一个是玩家坦克发射炮弹:
当按下J键。
完成该任务后,运行程序。
图21键盘按下事件
游戏运行
在CGameMain类的GameRun方法中完成游戏运行代码。
图22游戏运行
玩家坦克处理
主要更新玩家坦克移动方向及速度及是否发射子弹处理。
图23玩家坦克处理
电脑坦克处理
主要负责删除HP<
=0的电脑坦克,以及是否生产新的电脑坦克,设置电脑坦克移动速度及方向以及何时改变方向及发射子弹。
图24敌方坦克处理
炮弹碰撞处理
精灵与精灵的碰撞事件是在CGameMain类的OnSpriteColSprite方法中完成的。
该方法有两个参数,一个是szSrcName,表示发送碰撞的精灵的名称;
一个是szTarName,表示接受碰撞的精灵的名称。
根据这两个精灵的名称,可以判断碰撞的精灵是什么类型(因为创建精灵时,命名有规则)。
子弹只可能与地形、我方坦克、敌方坦克、世界边界等发生碰撞;
先判断子弹由敌方还是玩家坦克发出,两者子弹皆可击破地形。
图25炮弹碰撞处理
坦克碰撞处理
玩家坦克可能与敌方坦克、敌方子弹、地形及世界边界等发生碰撞,敌方坦克类似。
与子弹碰撞上面炮弹处理已经描述,坦克无法穿过地形、边界和对方坦克。
图26坦克碰撞处理
游戏结束
当玩家坦克的生命条数=0时,一局游戏结束。
对应的方法是CGameMain类的GameEnd方法。
游戏结束时,删除所有电脑坦克与地形还有玩家坦克,然后重新显示“空格开始”图片,游戏环境又重新回到未开始状态。
图27游戏结束
4.游戏用例图
玩家坦克用例图:
图28玩家坦克用例图
敌方坦克用例图:
图29敌方坦克用例图
5.游戏代码
CGameMain类
头文件
#ifndef_LESSON_X_H_
#define_LESSON_X_H_
//
#include<
Windows.h>
#include"
TankPlayer.h"
TankEnemy.h"
#include<
vector>
usingnamespacestd;
/////////////////////////////////////////////////////////////////////////////////
//游戏总管类。
负责处理游戏主循环、游戏初始化、结束等工作
classCGameMain
{
private:
intm_iGameState;
//游戏状态,0:
结束或者等待开始;
1:
初始化;
2:
游戏进行中
CSprite*m_pSplash;
CSprite*m_pStart;
CTankPlayer*m_pTankPlayer;
intm_iBulletNum;
//CTankEnemy*m_pTankEnemy;
vector<
CWeapon*>
m_vWeapon;
floatm_fTankEnemyTime;
intm_iTankEnemyNumber;
CWeapon*m_pAim_nor;
CTextSprite*m_pScore;
//表示分数的文本精灵
CTextSprite*m_pHight;
//表示最高分的文本精灵
CTextSprite*m_pEnemy;
//表示敌人数量的文本精灵
intm_iScore;
//分数
intm_iEnemy;
//敌人数量
intm_iHight;
//几局最高分
floatm_fDeltaTime;
//表示游戏时间
public:
CGameMain();
//构造函数
~CGameMain();
//析构函数
//Get方法
intGetGameState(){returnm_iGameState;
}
//Set方法
voidSetGameState(constintiState){m_iGameState=iState;
//游戏主循环等
voidGameMainLoop(floatfDeltaTime);
voidGameInit();
voidGameRun(floatfDeltaTime);
voidGameEnd();
voidOnKeyDown(constintiKey,constboolbAltPress,constboolbShiftPress,constboolbCtrlPress);
voidOnKeyUp(constintiKey);
voidOnSpriteColWorldLimit(constchar*szName,constintiColSide);
voidAddBullet(intiDir,floatfPosX,floatfPosY,intiOwner);
voidLoadMap();
CWeapon*FindWeaponByName(constchar*szName);
voidDeleteWeaponByName(constchar*szName);
voidAddTankEnemy(floatfDeltaTime);
voidOnSpriteColSprite(constchar*szSrcName,constchar*szTarName);
voidDeleteAllSprite();
};
//
externCGameMaing_GameMain;
#endif//_LESSON_X_H_
源文件
Stdio.h>
#include"
CommonClass.h"
LessonX.h"
Bullet.h"
////////////////////////////////////////////////////////////////////////////////
CGameMaing_GameMain;
CSprite*m_pSplash;
CSprite*m_pStart;
CTankPlayer*m_pTankplayer=newCTankPlayer("
myplayer"
);
/*intg_iMap[11][13]=
{
{0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,1,0,0,0,0,0,1,0,0,0},
{0,1,0,1,0,1,1,1,0,1,0,1,0},
{0,1,1,1,1,1,0,1,1,1,1,1,0},
{0,1,0,1,0,1,0,1,0,1,0,1,0},
{0,0,0,0,0,1,0,1,0,0,0,0,0},
//{0,0,0,0,0,1,0,1,0,0,0,0,0}
*/
intg_iMap[11][13]=
{0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,1,1,0,0,1,0,1,0,0,1,1,0},
{0,1,0,0,0,1,0,1,0,0,0,1,0},
{1,1,1,1,1,1,1,1,1,1,1,1,1},
{0,0,1,0,0,1,0,1,0,0,1,0,0},
{0,0,0,1,0,0,0,0,0,1,0,0,0},
{0,0,1,0,1,0,0,0,1,0,1,0,0},
{0,1,0,1,0,0,0,0,0,1,0,1,0},
{0,0,0,0,0,1,1,1,0,0,0,0,0},
{0,0,0,0,0,1,0,1,0,0,0,0,0}
//==============================================================================
//大体的程序流程为:
GameMainLoop函数为主循环函数,在引擎每帧刷新屏幕图像之后,都会被调用一次。
//构造函数
CGameMain:
:
CGameMain()
m_iGameState=0;
m_pSplash=newCSprite("
splash"
m_pStart=newCSprite("
start"
m_pTankPlayer=newCTankPlayer("
//m_pTankEnemy=newCTankEnemy("
enemy"
m_fTankEnemyTime=0;
m_iTankEnemyNumber=0;
m_pScore=newCTextSprite("
score"
m_pHight=newCTextSprite("
hight"
m_pEnemy=newCTextSprite("
enemyNum"
m_iScore=0;
m_iEnemy=0;
m_iHight=0;
m_fDeltaTime=0.f;
}
//析构函数
~CGameMain()
deletem_pSplash;
deletem_pStart;
deletem_pTankplayer;
//游戏主循环,此函数将被不停的调用,引擎每刷新一次屏幕,此函数即被调用一次
//用以处理游戏的开始、进行中、结束等各种状态.
//函数参数fDeltaTime:
上次调用本函数到此次调用本函数的时间间隔,单位:
秒
voidCGameMain:
GameMainLoop(floatfDeltaTime)
switch(GetGameState())
{
//初始化游戏,清空上一局相关数据
case1:
{
GameInit();
SetGameState
(2);
//初始化之后,将游戏状态设置为进行中
}
break;
//游戏进行中,处理各种游戏逻辑
case2:
//TODO修改此处游戏循环条件,完成正确游戏逻辑
if(!
m_pTankplayer->
IsDead()&
&
!
m_pAim_nor->
IsDead()&
m_fDeltaTime<
30)
{
GameRun(fDeltaTime);
}
else//游戏结束。
调用游戏结算函数,并把游戏状态修改为结束状态
{
SetGameState(0);
GameEnd();
//游戏结束/等待按空格键开始
case0:
default:
};
//=============================================================================
//每局开始前进行初始化,清空上一局相关数据
GameInit()
m_pSplash->
SetSpriteVisible(false);
m_pStart->
m_pTankPlayer=newCTankPlayer("
//新建一个名字是myPlayer的我方坦克对象
m_pTankPlayer->
CloneSprite("
player"
//我方坦克克隆在funcode模板中存在的名字为player的坦克,表示新建的坦克对象有现在精灵的所有属性
Init();
//m_pTankEnemy->
m_vWeapon.push_back(m_pTankplayer);
LoadMap();
m_pAim_nor=newCWeapon("
myaim_nor"
m_pAim_nor->
aim_nor"
m_vWeapon.push_back(m_pAim_nor);
SetSpriteCollisionReceive(true);
SetSpritePosition(0.f,20.f);
m_iBulletNum=0;
m_fTankEnemyTime=4.f;
m_iScore=0;
//m_iHight=0;
m_iEnemy=0;
FILE*fp=fopen("
save.dat"
"
r+"
if(fp){
fread(&
m_iHight,sizeof(int),1,fp);
fclose(fp);
m_pHight->
SetTextValue(m_iHight);
/
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 课程设计 报告 坦克 大战