当前位置:文档之家› 面向对象的分析与设计

面向对象的分析与设计

《面向对象的分析与设计》

指导老师:

组员:

组长:

目录

第1章绪论 (3)

1.1项目背景 (3)

1.2设计游戏的必备知识 (3)

1.2.1 面向对象分析与设计基本知识点 (3)

1.2.2 UML的基本知识点 (4)

第2章分析篇(OOA) (5)

2.1 说明 (5)

2.2用况建模 (5)

2.3发现对象 (11)

2.3.8静态结构图 (21)

2.4辅助模型 (22)

第3章设计篇(OOD) (29)

3.1 问题域部分设计 (30)

3.2 人机交互部分设计 (30)

3.5 界面设计 (32)

3.4 构件化与系统部署 (33)

第4章实现篇(OOP) (34)

4.1 开始游戏 (34)

4.2 主类模块 (35)

4.3 墙类模块 (36)

4.4 爆炸类模块 (37)

4.5 游戏菜单模块 (37)

4.6 道具模块 (37)

第5章完结篇 (37)

第1章绪论

1.1项目背景

早期的坦克大战想必大家一定玩儿过,我也是其中的玩家之一,小的时候我就很好奇,这个游戏到底是怎么做出来的。那个时候有种我们成为游戏卡的东西,把卡插进卡槽,就可以运行坦克大战这个游戏。

但是传统的坦克大战有不好的地方,就是玩家永远得保护司令,司令死了自己也就死了。我认为这是传统的游戏不足,我们需要的是一款更接近现实世界的坦克大战游戏。

这学期刚好学了面向对象这门课程,也学了UML。作为学计算的学生。我们都很想自己写一个属于自己的坦克大战。刚好老师最后又布置了大作业,我们的想法就是借助老师讲的面向对象知识,开发一款简单的坦克大战游戏。

1.2设计游戏的必备知识

1.2.1 面向对象分析与设计基本知识点

1.面向对象程序语言的三个关键特性

(1)封装

将对象的数据与操作数据的方法相结合,通过方法将对象的数据和实现的细节保护起来。

(2)继承

当一个类是另一个类的特例时,这两个类之间具有父子关系。子类就可以继承了父类的状态(量)和行为(方法),子类可以重用父类的这部分代码。继承关系减少了程序中相似代码的重复说明。程序员可以再父类中对一些共同操作与属性只说明一次,而在子类中,基于子类的特性再进行扩展或是改变。并且继承具有传递性。

(3)多态

多态可以表达为,对外一个接口,内部多重实现。Java语言支持2种形式的多态。运行时多态,和编译时多态是通过方法的重载实现编译时的多态,而遇到类之间的继承性,方法的重实现运行时多态。

2.类和对象的基本概念

类和对象是java中的基本组成要素。类描述了同一类对象都举要的数据和行为。创建

一个新类,就是创建了一种新的数据类型。

类有两种基本成分:变量和方法,成为成员变量和成员方法。

子类和父类,而没有说明抽象类的作用。抽象类是据有一个或多个抽象方法的类,必须声明为抽象类。抽象类的特点是,不能创建实例上面讲的只是子类和父类。而没有说明抽象类的作用。抽象类是据有一个或多个抽象方法的类,必须声明为抽象类。

1.2.2 UML的基本知识点

1.UML基本概念

Unified Modeling Language (UML)又称统一建模语言或标准建模语言,是始于1997年一个OMG标准,它是一个支持模型化和软件系统开发的图形化语言,为软件开发的所有阶段提供模型化和可视化支持,包括由需求分析到规格,到构造和配置。面向对象的分析与设计(OOA&D,OOAD)方法的发展在80年代末至90年代中出现了一个高潮,UML是这个高潮的产物。它不仅统一了Booch、Rumbaugh和Jacobson的表示方法,而且对其作了进一步的发展,并最终统一为大众所接受的标准建模语言

2. UML五种类图定义

类图:描述系统中类的静态结构

用例图:从用户角度描述系统功能,并指各功能的操作者。

静态图:包括类图,包图,对象图

行为图:描述系统动态模型和对象组成的交换关系。包括状态图和活动图

交互图:描述对象之间的交互关系

UML提供的基本模型图包括

(1)、用例图: 展示系统外部的各类执行者与系统提供的各种用例之间的关系

(2)、类图: 展示系统中类的静态结构(类是指具有相同属性和行为的对象,类图用来

描述系统中各种类之间的静态结构)

(3)、对象图:是类图的一种实例化图(对象图是对类图的一种实例化)

(4)、包图:是一种分组机制。在UML1.1版本中,包图不再看作一种独立的模型图)

(5)、状态图:描述一类对象具有的所有可能的状态及其转移关系(它展示对象所具有的

所有可能的状态以及特定事件发生时状态的转移情况)

(6)、顺序图:展示对象之间的一种动态协作关系(一组对象组成,随时间推移对象之间

交换消息的过程,突出时间关系)

(7)、合作图:从另一个角度展示对象之间的动态协作关系(对象间动态协作关系,突出

消息收发关系)

(8)、活动图:展示系统中各种活动的执行流程(各种活动的执行顺序、执行流程)

(9)、构件图:展示程序代码的物理结构(描述程序代码的组织结构,各种构件之间的依

赖关系)

(10)、配置图:展示软件在硬件环境中(特别是在分布式及网络环境中)的配置关系(系

统中硬件和软件的物理配置情况和系统体系结构)

第2章分析篇(OOA)

需求分析即是分析用户的需求,是软件计划时建立的可行性进行细化与精确,分配软件元素,是软件定义时期的最后一个阶段,它的基本任务是确定系统必须做什么。是对要做的系统确定一个完整的、具体的、清晰的、准确的要求。可以分为需求的提出,需求的描述,需求的评审等阶段。需求分析也是设计数据库的起点,需求分析的结果是否准确地反映了用户的实际要求,将直接影响到后面各个阶段的设计,并影响到设计结果是否合理和实用。

需求分析的任务是通过详细调查现实世界要处理的对象(坦克、子弹、墙等),充分了解游戏的运行概况,明确开发游戏的各种需求,然后在此基础上确定游戏的功能。调查的重点是“数据”和“处理”,通过调查、收集与分析,获得开发游戏的如下要求:信息要求、处理要求、安全性与健壮性要求。

2.1 说明

坦克大战主要需要我方坦克和对方坦克。与传统游戏不同的是我方坦克也有队友,而不是孤立无援。还有墙,开始背景,游戏胜利背景,游戏结束背景。我方坦克和对方坦克都可以上下左右移动,游戏的玩家通过相应的键来控制坦克的移动和发射子弹,对方坦克在创建的时候就能够发出子弹。当我方子弹与敌军坦克相碰时会有爆炸效果产生。敌方坦克和我方坦克都有血量,不是打到一颗子弹就会爆炸。而且为了接近现实世界,坦克只要吃了对应的道具之后可以发射导弹,敌方坦克和我方坦克都可以发射特殊的子弹。比如闪弹和能够穿墙的子弹。当我方坦克获得胜利时,会提示玩家是否进入下一关。如果玩家不想就不进入下一关。

2.2用况建模

2.2.1确定参与者

参与者是指与系统交互的人、组织或其它系统,参与者代表一种角色,而不是具体的人,可分成主参与者和辅助参与者:

●主参与者是用例的直接执行者,例如保险系统中业务员处理保险的注册和管理

●辅助参与者对于用例的执行起辅助作用,例如保险系统中管理员负责分配业务员权

既然我们设计的是一个坦克大战游戏,那么很显然我们的参与者就是游戏玩家。下面是参与者的简要描述:

●游戏玩家:打开游戏之后,可以选择关卡,游戏之中可以暂停游戏,继续游戏,

退出游戏与保存游戏,当然也可以保存游戏。也可以适当的对游戏难度进行设定

等等。

2.2.2确定用例

在确定用例之前,我们先来看看面向对象方法中用例的特征:

●用例总是由参与者启动的

●执行者必须直接或间接地指示系统去执行用例

●用例向参与者提供服务或返回结果,这些结果必须是可识别的

●用例是完整的,一个用例必须是一个完整的描述

在确定参与者后,结合经典的坦克大战实现以及我们团队成员的游戏体验经验,可以确定系统的用况有:

游戏主循环:此时参与者进入游戏,可以通过预设的各种动作键来移动坦克,攻击敌人,捕获道具,同时也可以暂停游戏,退出游戏等,玩家的主要时间都会停留在这里

场景设定:主要用来设定游戏的场景,比如说墙的个数,样式等

游戏难度设定:可以用来设定生成坦克的速度,以及坦克运行速度,子弹发射速度等

坦克设定:设定玩家自己的坦克造型,坦克类型(初始坦克的强大程度)

装备设定:设定玩家坦克的子弹装备,以及游戏中允许出现的装备(比如敌方只允许出现较低级的坦克)

道具设定:设定道具出现的频率,以及允许出现的道具等

游戏帮助:主要是给玩家提供操作上的提示

关卡选择:进入游戏时供玩家选择,相当于“无需配置”的选择难度

界面设计:本游戏的界面

2.2.3 得到用例图

根据我们以上的分析,得到最终用例图如下:

图2-1 系统用例图2.2.4用况描述

1.

表2-1 系统用况表

事件流:

1.当玩家开始游戏时用例开始

2.玩家识别己方坦克与敌方坦克

3.玩家控制坦克,开始游戏。

4.玩家坦克是否已经死亡,如果是询问玩家是否复活不是转5步。

5.道具是否存在,如果是坦克可以吃道具,不是继续

6.玩家坦克攻打敌方坦克

7.敌方坦克是否已经消灭完,如果是继续,不是转6步。

8.是否进入下一关,如果是转3步,不是转9步

9.玩家结束游戏,用例结束

后置条件:玩家结束游戏,或者玩家坦克死亡。

2.

用况名称:游戏主循环

参与的执行者:玩家(Player)

前置条件:玩家经过各种设置(游戏的各种参数或默认或已经设定)开始游戏

事件流:

用户点击开始游戏

初始化场景,玩家坦克,敌人坦克,设置事件监听,只要有键盘

输入转向键盘事件处理

For;; do

用户输入

If 有键盘事件产生then

If 是退出游戏then

Break;

If 是暂停游戏then

暂停

Else if then

根据键盘事件对玩家的坦克进行相应设置

End if;

End if;

对敌人坦克的参数进行设置

根据玩家坦克和敌人坦克的参数,以及游戏中的道具,计算相应位置并进行显示If 玩家血量已经<0

Break;

End if;

End for;

提示游戏结束,询问玩家意愿

玩家输入退出/重来

If 退出then

关闭程序

Else if

回到主界面

End if;

3.

用况名称:场景设定

参与的执行者:玩家(Player)

前置条件:玩家选择设置场景,并进一步选择设置墙样式事件流:

输入开始设置场景

做好场景设置准备,初始化墙样式为默认。

输出对话框

For 用户可以设置的每个参数do

输入期望值

If 该期望值合法then

设置相应变量为该值

Else if

输出出错信息,返回主界面

End if;

End for;

询问玩家是否确定修改参数

输入交互信息

If 确认修改then

保存修改参数

Else if

重置所有参数为默认值

End if;

跳回至主界面。

4.

用况名称:游戏难度设定

参与的执行者:玩家(Player)

前置条件:玩家选择设置难度,并进一步选择生成速度事件流:

输入开始设置场景

做好设置准备,初始化默认值。

输出对话框

For 用户可以设置的每个参数do

输入期望值

If 该期望值合法then

设置相应变量为该值

Else if

输出出错信息,返回主界面

End if;

End for;

询问玩家是否确定修改参数

输入交互信息

If 确认修改then

保存修改参数

Else if

重置所有参数为默认值

End if;

跳回至主界面。

5.

用况名称:子弹设定

参与的执行者:玩家(Player)

前置条件:玩家选择设置子弹类型

事件流:

输入开始设置场景

做好子弹设置准备,初始化子弹样式为默认。

输出对话框

For 用户可以设置的每个参数do

输入期望值

If 该期望值合法then

设置相应变量为该值

Else if

输出出错信息,返回主界面

End if;

End for;

询问玩家是否确定修改参数

输入交互信息

If 确认修改then

保存修改参数

Else if

重置所有参数为默认值

End if;

跳回至主界面。

6.

用况名称:血块设定

参与的执行者:玩家(Player)

前置条件:程序在随机时间、随机坐标出形成血块

事件流:

输入开始设置场景

做好坦克接受血块准备。

IF 玩家坦克坐标与血块坐标相等

玩家坦克血条值增加

ELSE

玩家血条值不变

End if;

跳回至游戏界面

2.3发现对象

2.3.1. 说明

进过需求分析,之后进行系统分析发现系统中的对象,进而发现类。

我们设定的主要类有

1.TankClient类(负责对所有的坦克进行集中管理)

2.坦克类(包括玩家坦克,机器人坦克)

3.射击类(负责控制射击的动作)

4.子弹类(包括不同种类的子弹)

5.管理类(负责提供对整个游戏流程的控制,以及参数的设定)

6.道具类(包括各种类型的道具,用来加血量)

7.血类(负责对玩家的血进行检测,以及血量的增加等)

8.墙壁节点类(负责对墙壁节点的建模)

9.墙壁类(对整个场景中的墙壁障碍进行控制)

2.3.2 Tank类

从用例来看,首先坦克是一个必不可少的类。有了坦克玩家才能进行一些列的操作,也才能进行游戏。根据前面的分析,我们的坦克大战是一群坦克对战一群坦克,这不同于以前那个经典的坦克大战,随意我们必须首先设置一个最基本的坦克类。然后有一个玩家控制的坦克,有一种机器人坦克,还有高级的智能坦克,还有一个最终的Boss坦克。通过上面的分析,我最终得到以下类图:

图2-2 坦克类图

坦克类可以说是本游戏中最要的一个类,因为游戏名字都交坦克大战嘛,没有了坦克类

表2-2坦克类表

下面我将会详细的解释每个类里面属性和操作,首先是Tank类:

表2-4坦克操作

表2-5玩家坦克属性表

表2-6坦克操作

表2-7坦克属性

表2-8电脑坦克属性

表2-9 智能机器人(1)

表2-10 智能机器人(2)

表2-11 Boss tank(1)

表2-12 Boss tank(2)2.3.3 Bomb类

图2-3 Bomb类图

Bomb类图说明

1)Bomb类:Bomb是基类,并且是一个抽象类,内部封装的成员函数有Bomb(),draw(),数据成员有x,y,step,static final Toolkit TLK,均为public。由于是抽象类,所以draw()函数需要子类来具体实现。

2)TankBomb类:TankBomb是继承于Bomb的一个子类,内部封装的成员函数是TankBomb(),draw(),数据成员有init,final Image[]TBIMGS,Tank tk,均为public。该类的主要功能是利用draw函数绘制坦克爆炸的效果。

3)ShotBomb类:ShotBomb是继承于Bomb的一个子类,内部封装的成员函数是ShotBomb(),draw(),数据成员是init,final Image[]SBIMGS,Shot s,其中,init,ShotBomb(),draw()是public,Shot s是private。该类的主要功能是完成子弹爆炸的效果。

4)SuperShotBomb类:SuperShotBomb类是继承于ShotBomb的一个子类,内部封装的成员函数是SuperShotBomb(),Rectangle getRect(),draw(),数据成员是static final Image[]SUPERBOMBING,Snit,均为public。该类的主要功能是完成闪弹爆炸的效果。2.3.3 TankClient类

图2-4 TankClient类

TankClient类共有六个子类,主要为玩家提供有好的登陆界面。玩家可以进行设置游戏参数、自己设计游戏界面,同时系统通过TankClient类为用户初始化界面、反馈游戏过程中的参数和结果,给玩家提供给直观的游戏参数。(例:我们可以通过添加障碍物、添加机器人等操作进行增加游戏难度:也可以更改游戏休眠时间;游戏失败后会给玩家进行相应的提示。)除了这些,TankClient类还定义了机器人的的基本类,为玩家提供了最基本的初始设置。在玩家本关卡结束时,对玩家提供相应提示。

TankClient类主要为玩家提供友好界面,负责采集玩家游戏信息,对玩家提供各类提示和有好的设置界面。

2.3.4 Wall类

图2-5墙壁类

Wall类图说明:

Wall是基类,内部封装的成员函数有Wall(),creat(),isHits(),draw(),其中creat()是private,其余均为public。该类的主要功能有绘制墙体,检测是否有碰撞发生,以及碰撞发生之后墙体的状态。

WallNode类:WallNode类是继承于Wall类的子类,内部封装的成员函数有WallNode(),draw(),Rectangle getRect(),均为public。该类的主要功能有绘制墙体。

2.3.5子弹类:

图2-6子弹类

该类实现在屏幕上画出子弹和子弹的移动轨迹以及实现了坦克攻击墙壁与攻击敌方坦克的功能,而且我们设计的是各种各样的子弹,比如我方就有闪弹,敌方除了普通的子弹外还有能够穿墙的子弹。

Supershot 超级炮弹类,此类的功能包括:移动位移;爆炸前后位移;起始坐标

Hydrashot 闪弹类,此类实现包括:炮弹是否击中对方Tank当撞到墙或Tank时子弹才爆炸

Normalshot 普通子弹类,与其他子弹功能主要区别为:普通子弹不可穿墙;并且判断子弹每发一枚就减一

SpecialShot 增强的炮弹,只要增加的功能为自己发射的子弹不打自己人

Shot类所有的子弹类都继承shot类。都包括包括子弹移动速度,子弹大小(半径),子弹威力Tank的中心坐标,s表示炮弹坐标(初始时为炮筒端点),弹每次移动的步长,死时是否产生爆炸。以及函数检查子弹是否跃出边界;碰撞检测。

2.3.6血块类:

图2-7血块类

表2-13血块属性表2.3.7游戏菜单类

图2-8游戏菜单类

相关主题
文本预览
相关文档 最新文档