西安科技大学软件工程课程设计之增强版坦克大战Word文件下载.docx
《西安科技大学软件工程课程设计之增强版坦克大战Word文件下载.docx》由会员分享,可在线阅读,更多相关《西安科技大学软件工程课程设计之增强版坦克大战Word文件下载.docx(27页珍藏版)》请在冰豆网上搜索。
5详细设计说明书16
5.1界面设计16
5.2出错信息处理17
5.3程序流程图17
5.4程序复杂度18
6系统实现18
6.1开发环境18
6.2关键技术18
6.2.1图像透明显示18
6.2.2碰撞检测18
6.2.3实现子画面动画18
6.2.4物理运动19
6.2.5爆炸效果19
6.2.6简单的AI20
6.2.7子画面创建子画面21
6.2.8滚动背景21
6.3运行结果22
7测试分析报告23
参考文献27
1绪论
1.1选题目的及意义
当下的学生们都比较喜欢玩游戏,随着玩游戏时间的增加,部分学生们便产生了自己编写游戏的念头。
所谓万丈高楼平地起,所以开发游戏要从基本技术开始练习,由于2D游戏开发较易学习和掌握,本学期,我阅读了一些关于2D游戏编程方面的书籍。
学习了一些游戏编程的基本技术,为了对所学内容进行实际练习,增强游戏编程的能力与问题分析的能力。
于是我决定开发一款2D游戏软件。
由于本人对当年非常火热的红白机上的经典游戏比较着迷,比如坦克大战,沙罗曼蛇,采金子,1945等。
所以我产生了重写这些经典游戏的想法。
这些游戏都属于2D游戏,而且涉及的基本游戏编程技术大都相同。
比如游戏子画面的管理,背景的滚动,游戏事件处理,分层图像绘制,简单的人工智能使用等。
而我这次开发的目的是练习相关技术,所以选择了重写坦克大战这款经典的红白机游戏,并对原版经典游戏在界面上和操作上进行了一定的改进从而达到练习以上技术的目的。
1.2系统概述
本系统属于游戏娱乐类型。
游戏中玩家控制一辆黄色坦克,通过方向键控制自己的坦克移动,其中玩家坦克可以进行屏幕环绕。
玩家通过空格键发射子弹。
游戏过程中会在随机位置生成敌方坦克,为了增加游戏难度我将敌方坦克发射的子弹设置为随机模式,即在随机的位置上产生子弹。
当玩家的被敌方坦克发生的子弹击中,或者与敌方坦克相撞则玩家死亡游戏结束。
当玩家坦克发射的子弹击中敌军坦克则敌军坦克爆破。
当敌军坦克相撞时则为二者交换速度。
其中为了增加趣味性还增加了一些音乐效果,比如爆炸声音,发生子弹的声音等。
2可行性研究报告
2.1系统分析
2.1.1系统流程图
2.1.2数据流图
2.1.3数据字典
名字:
子画面信息
别名:
SpriteInformation
描述:
与子画面有关的相关参数集合
定义:
子画面信息=位置+边界矩形+碰撞矩形+子画面速度+Z轴顺序
位置=X坐标+Y坐标
边界矩形=子画面的左上X坐标Y坐标
+子画面的右下上X坐标Y坐标
碰撞矩形=边界矩形
X坐标=整型数值
Y坐标=整型数值
子画面速度=在X轴和Y轴上单位时间移动的距离
Z轴顺序=绘制子画面的先后顺序,以无符号整型数值表示
位置:
子画面管理
按键信息
虚拟键码
标识所按下的键盘按键
虚拟键码=VK+下划线+英文单词
按键处理
控制信息
Controlinformation
布尔型数据,用来标识状态
布尔型数据=[true|false]
游戏循环控制
2.2经济可行性
本系统设计的代码量大约为2000行左右,由于开发本系统主要由我本人独立完成,不涉及雇佣其它人员所需花费。
而且该系统主要是面向课程设计,开发周期短,其中的开发消耗主要是本人日常起居所需的花费。
因此据我的估计单行代码的开发编写费用为0.05元。
(计算方法为开发阶段在校园内的开销除以代码总行数)。
因此总的开发费用不会超过50元。
由于校园中衣食住行等开销相对较低加之本人平日以来勤俭节约所以经济上完全可行。
2.3技术可行性
开发本系统所基于的平台为WindowsXP,所使用的开发语言为C++,通过系统调用(Win32API),实现主要的游戏功能。
开发该系统涉及到的主要技术C++基础语法知识,Win32API的使用,键盘控制,游戏子画面处理,碰撞检测,音效播放,游戏背景处理,简单的游戏AI,游戏流程控制等技术。
由于本人在前期的自学中已经熟练掌握这些基本技术,而且经过了一定的练习。
所以从技术角度来讲没有任何问题。
2.4操作可行性
本系统在使用过程中完全通过键盘操作。
由于当前很多2D游戏都是以此种模式进行控制,所以万家对此模式十分熟悉不存在适应上的问题。
加之本系统设计的键盘按键很少,所以记忆难度大大降低,极为容易上手。
综合以上因素得出此种操作模式完全行得通。
因此操作可行。
3需求规格说明书
3.1功能需求
坦克大战是一款经典的游戏,游戏的过程是玩家可以通过键盘控制坦克的移动,并能够发射子弹消灭屏幕上出现在随机位置上的坦克,当玩家的坦克与敌人的坦克或者是敌人坦克发出的子弹相撞则玩家输掉游戏,游戏结束。
反之当玩家消灭了所有敌人的坦克后则玩家获胜。
同时要求游戏中能对各个对象的碰撞做出正常的处理。
还有使得游戏画面较为流畅。
3.2性能需求
最低磁盘容量:
1G
CPU最低主频:
64MHZ
最低主存容量:
128M
3.3可靠性和可用性需求
游戏能够正常地运行,并且正常的对画面进行处理。
能够正确地响应键盘消息。
并且对于屏幕中的画面过多时可以流畅的显示,并保证有一定的错误处理功能。
3.4出错处理需求
当程序因为平台原因初始化失败以及相关API在其它的Windows平台下无法使用导致程序无法正常运行时,应给予玩家相关的提示,告知失败的其原因是因为与游戏运行的平台有关。
3.5接口需求
3.5.1用户接口需求
响应用户的方向键按键,应将方向键按键转换为坦克在对应方向上的行进速度。
响应用户的回车按键,以便正常开始游戏。
3.5.2软件接口需求
图形加载应将位图正常加载并保存位图句柄
Create(LPTSTRszFileName)
szFileName为位图文件名
图形绘制模块应根据传送的图形信息将图形绘制在屏幕上,格式为:
Draw(HDChDC,intx,inty,BOOLtrans,COLORREFcrTransColor)
hDC设备环境句柄,x,y为图像横坐标和纵坐标,trans是否绘制透明图形
crTransColor指定透明颜色
子画面添加应将子画面正确添加到子画面列表中
AddSprite(Sprite*pSprite)
pSprite为子画面对象指针
碰撞检测应对当前的子画面与子画面列表中的子画面逐个进行碰撞检测
CheckSpriteCollision(Sprite*pTestSprite)
Sprite*pTestSprite要检测的子画面指针
子画面信息控制应根据子画面类中的子画面信息正确的改变子画面的位置等信息。
3.6约束
程序需要在windows平台下才可正常运行。
3.7逆向需求
该程序属于纯键盘操控,因此游戏无需对非键盘事件做出响应。
3.8将来可能提出的需求
1.敌军坦克具有更高的智能。
2.炫目的游戏效果。
3.游戏杆控制接口。
4.网络联机游戏功能。
5.多人游戏玩家交互功能。
4总体设计说明书
4.1系统说明
在前期分析过程中所得到的结果为较合理方案,因此得出如下结果。
4.1.1系统流程图
4.1.2成本/效益分析
由代码行技术估算。
因为经我的分析单行代码的开发编写费用为0.05元。
代码总行数大约为2000行,因此总的开发费用不会超过50元。
本项目面向课程设计,不涉及任何经济收益问题。
4.1.3实现系统的进度计划
第一工作日:
可行性研究,并编写相关文档。
第二工作日:
总体设计,并编写相关文档。
第三工作日:
详细设计。
第四工作日:
系统实现
第五工作日:
系统实现。
第六工作日:
系统测试。
第七工作日:
4.1.4软件结构图
4.1.5IPO表
4.2用户手册
方向键控制坦克的移动
上:
向上移动
下:
向下移动
左:
向左移动
右:
向右移动
ESC:
推出游戏
Enter:
游戏开始
Space(空格键):
发射子弹
4.3测试计划
对系统进行白盒测试与黑盒测试。
并进行模块测试与系统测试。
4.4实现计划
5详细设计说明书
5.1界面设计
本游戏分为三个界面:
游戏开始界面,游戏进行界面、游戏结束界面;
在界面更新上为每秒25贞从而达到较为流畅的效果。
5.2出错信息处理
玩家错误,在开始界面时不满足输入规则发生错误,按Enter键开始游戏,其它无效;
运行时错误,游戏界面交互时,由于本游戏较稳定,基本不会崩溃,而且有各种游戏提示。
5.3程序流程图
5.4程序复杂度
复杂度=E-N+2=17-11+2=8
6系统实现
6.1开发环境
WindowsXPsp3
CPUIntelB9402.00GHZ
VC++6.0SP6
图像编辑器,MSPAINT
6.2关键技术
6.2.1图像透明显示
使位图可以透明显示主要使用的是TransparentBlt函数,通过设置函数中的参数“透明色”来实现透明效果。
6.2.2碰撞检测
对子画面设置一个矩形区域,通过判断矩形区域是否重叠来判断子画面是否发生碰撞。
6.2.3实现子画面动画
动画子画面需要包括
1.总贞数
2.当前贞
3.贞延迟
4.贞触发器
实现动画效果即制作一张联系图片然后逐个显示每个图片,这样在一定的速度下就产生了动画效果。
6.2.4物理运动
匀速运动:
物体运动时候对于2D上的物体而言,其速度为X轴分量与Y轴分量的和速度。
匀速运动各分量时刻不变,2D上的匀速运动在每次更新画面时,利用物体速度分量Vx,Vy的值来计算下次物体出现的位置,产生移动效果。
计算公式如下:
下一刻X位置=现在X位置+X轴速度分量
下一刻Y位置=现在Y位置+Y轴速度分量
加速运动:
表达式V=Vo+At
Vx1=Vxo+Ax(x方向加速度)
Vy1=Vyo+Ay(y方向加速度)
在求出物体下一刻的移动速度后,便可依此再去推算出加入加速度后,物体下一刻所在位置的公式为:
Sx1=Sxo+Vx1
Sy1=Syo+Vy1
6.2.5爆炸效果
爆炸子画面必须循环显示其动画贞,然后立即消失。
需要解决的问题是:
可以在游戏代码中删除一个子画面,即所需要实现的内容是允许子画面在一个周期中实现动画,然后消失。
通过增加新变量BOOLm_bDying;
BOOLm_bOneCyle;
。
来进行判断是否该删除图像。
m_bDying成员变量确定一个子画面是否被标记为将要删除。
换句话说,普通子画面的m_bDying设置为false,将要删除的设置为true.使用该变量的优点是它允许只需要将这个变量设置为true即可随时删除一个字画面。
6.2.6简单的AI
漫游AI是指模拟游戏对象的移动,即游戏对象作出在虚拟的世界中如何漫游的决定。
例如游戏中敌军追逐玩家。
实现漫游AI很容易,它通常需要根据一个对象的位置来改变另一个对象的速度或位置。
对象漫游移动还会受到随机模式或预定模式的影响。
存在三种基本的漫游AI:
追逐逃避和有模式漫游AI
1追逐AI:
一个对象跟踪并追逐另一个或多个游戏对象。
例:
If(iXAlian>
iXShip)
iXAlien--;
elseif(iXAlien<
iXAlien++;
if(iYAlien>
iYShip)
iYAlien--;
elseif(iYAlien<
iYAlien++;
缺点:
致使敌军过于强大可以轻易追上玩家所以添加一些随机因素这些随即因素可以自行更改
If((rand()%3)==0)
2逃避
算法与追逐思路一致
3有模式移动
通过一组预定义的移动的漫游AI
模式通常为一个预定义的行为
如intiZigZag[2][2]={{3,2},{-3,2}};
iXAlien+=iZigZag[iPatternStep][0];
iYAlien+=iZigZag[iPatternStep][1];
对象以之字形移动.
行为AI:
预先设定一组行为当产生某种行为时执行相应的动作。
intiBehavior=abs(rand()%100);
if(iBehavior<
50)
//追逐
elseif(iBehavior<
90)
//以某种模式移动
else
//随机移动
6.2.7子画面创建子画面
坦克子画面发射导弹就属于此问题。
子画面动作用来通知游戏引擎必须对一个子画采取某种特定的动作SA_ADDSPRITE动作只是导致在应用动作的Sprite对象上调用一个特殊方法。
这个方法名为AddSprite()VirtualSprite*AddSprite();
调用该方法向游戏引擎添加一个新的子画面。
该方法返回新创建的子画面的指针。
新子画面的具体情况完全取决于各个不同的游戏。
此方法是给给电脑子画面添加子画面用的。
而玩家子画面要创建子画面在按键盘时就可以创建了。
基类的该方法只是返回一个NULL子画面指针。
意思说更多功能由派生留给派生的类去完成。
因此需要派生类来完成该方法并重写。
SA_ADDSPRITE动作和AddSprite()方法在游戏引擎UpdateSprite()方法中输入图片,UpdateSprite()必须检查SA_ADDSPRITE子画面动作是否存在.若设置了此动作则在子画面上调用AddSprite()方法。
并将返回值传给游戏引擎的AddSprite()方法,然后将子画面插入子画面列表中。
因此开篇所需要的功能就可以实现了。
6.2.8滚动背景
滚动背景的工作原理:
横向和纵向的滚动其实就是图像的环绕。
所以图像的两侧必须进行良好的设计,以便完美结合在一起。
视口的理解:
好像望远镜提供了一个太空的视图,视口也提供了背景图像的一个视图。
所以滚动背景可以理解为移动视口。
背景可以任意大,视口提供了查看大背景的一个特定的部分的方法。
6.3运行结果
7测试分析报告
功能描述
测试坦克的移动
用例目的
功能是否相应实现
前提条件
游戏已开始
输入/动作
期望输出/相应
实际情况
按方向键"
→"
键
与期望结果一致
←"
↑"
↓"
除了空格键、Enter键和Esc键外的数字键和字母键
屏幕无反应
黑盒测试
白盒测试:
键盘控制相关代码
if(GetAsyncKeyState(VK_LEFT)<
0)
{………..
}
elseif(GetAsyncKeyState(VK_RIGHT)<
elseif(GetAsyncKeyState(VK_UP)<
elseif(GetAsyncKeyState(VK_DOWN)<
{…………
else
{
…………..
采用语句覆盖测试
测试用例为
方向按键:
上下左右
位置更新模块相关代码
if(m_baBoundsAction==1)//环绕动作,即从上到下,从左到右环绕
if((ptNewPosition.x+ptSpriteSize.x)<
m_rcBounds.left)
{…………….
}
elseif(ptNewPosition.x>
m_rcBounds.right)
{……………..
if((ptNewPosition.y+ptSpriteSize.y)<
m_rcBounds.top)
elseif(ptNewPosition.y>
m_rcBounds.bottom)
elseif(m_baBoundsAction==2)//反弹动作
if(ptNewPosition.x<
m_rcBounds.left)//已经超出左边界
{
}//子画面的最右边已经超出了右边界+ptSpriteSize.x
elseif((ptNewPosition.x+ptSpriteSize.x)>
m_rcBounds.right)
}//上边界
if(ptNewPosition.y<
}//下边界+ptSpriteSize.y
elseif((ptNewPosition.y+ptSpriteSize.y)>
if(bBounce)
elseif(m_baBoundsAction==3)//碰到边界需要撤销该子画面
if((ptNewPosition.x)<
m_rcBounds.left||
ptNewPosition.x+ptSpriteSize.x>
m_rcBounds.right||
(ptNewPosition.y)<
m_rcBounds.top||
ptNewPosition.y+ptSpriteSize.y>
{//ptNewPosition.y+ptSpriteSize.y
return0x0001L;
测试用例
m_baBoundsAction=1ptNewPosition.x+ptSpriteSize.x<
m_rcBounds.left
m_baBoundsAction=1ptNewPosition.x>
m_rcBounds.right
m_baBoundsAction=1ptNewPosition.x+ptSpriteSize.x>
m_baBoundsAction=1ptNewPosition.x<
m_rcBounds.right
m_baBoundsAction==2
ptNewPosition.x<
m_rcBounds.lef
ptNewPosition.x+ptSpriteSize.x>
ptNewPosition.y<
m_rcBounds.top
ptNewPosition.y+ptSpriteSize.y>
m_rcBounds.bottom
ptNewPosition.x>
ptNewPosition.x+ptSpriteSize.x<
ptNewPosition.y>
ptNewPosition.y+ptSpriteSize.y<
m_rcBounds.bottom
m_baBoundsAction==3
ptNewPosition.x+ptSpriteSize.x>
m_rcBounds.right
m_rcBounds.top
m_baBoundsAction==3
ptNewPosition.y+ptSpriteSize.y>
m_rcBounds.bottom
ptNewPosition.x+ptSpriteSize.x<
ptNewPosition.y+ptSpriteSize.y<
碰撞检测代码
m_rcCollision.left<
=rcTest.right&
&
rcTest.left<
=m_rcCollision.right&
m_rcCollision.top<
=rcTest.bottom&
rcTest.top<
=m_rcCollision.bottom;
=rcT