MAZE系统详细设计书.docx
《MAZE系统详细设计书.docx》由会员分享,可在线阅读,更多相关《MAZE系统详细设计书.docx(36页珍藏版)》请在冰点文库上搜索。
![MAZE系统详细设计书.docx](https://file1.bingdoc.com/fileroot1/2023-5/21/a6e5c5fc-d009-49f8-b812-3cbb9d3fb0e1/a6e5c5fc-d009-49f8-b812-3cbb9d3fb0e11.gif)
MAZE系统详细设计书
MAZE系统游戏
详细设计说明书
学院名称:
计算机学院
专业名称:
信管
组员:
信管学生
详细设计说明书
1引言
1.1编写目的
详细设计说明书对MAZE游戏的总体设计和各个模块的功能、性能、输入输出、算法、接口、程序逻辑、存储分配及其它给出了详细的设计方案,为软件开发制定详细的计划,同时也提交系统分析员,由其提出意见。
这是程序员开发及未来测试烦人重要文档资料。
1.2背景
a.开发软件名称:
MAZE系统
b.项目开发小组成员:
信管学生
c.用户:
所有喜欢玩这个游戏的玩家
d.项目开发环境:
WindowsXP+Eclipse+SDK。
1.3定义
MAZE项目详细设计方案。
1.4参考资料
(1)《软件工程案列开发与实践》,刘竹林等,清华大学出版社
(2)《Java课程设计案例精编》,张广彬、孟红蕊,张永宝,清华大学出版社
(3)《马士兵视频全集》,马士兵,北京尚学堂
2程序系统的结构
本次所设计MAZE游戏的程序主结构如图2-1所示。
3程序(标识符)设计说明
从本章开始,逐个地给出各个层次中的每个程序的设计考虑。
以下给出的提纲是针对一般情况的。
对于一个具体的模块,尤其是层次比较低的模块或子程序,其很多条目的内容往往与它所隶属的上一层模块的对应条目的内容相同,在这种情况下,只要简单地说明这一点即可。
3.1程序描述
主要功能:
MAZE系统开发的是警匪对战游戏,玩家可以自由添加警察,小偷角色在任何游戏中任何位置,然后警察和小偷会自动在游戏中搜索对方并根据自身情况消灭敌人,游戏过程中队友之间可以相互通信,也可以在游戏中加入迷宫场地,增加游戏的趣味。
可扩展性:
能够适应应用要求的变化和修改,具有灵活的可扩充性。
3.2功能
游戏界面主框架主要包括游戏图形区域界面、菜单栏,状态栏,时间墙。
菜单栏中有菜单项:
“游戏”,“绘图”,“添加人员”,“新功能”,“音乐”,“关于”,“帮助”等。
游戏画布区主要应该包括游戏画布中警察,小偷,子弹,爆炸等图片出现的位置。
按键说明:
键值
作用
UP
向上运动
DOWN
向下运动
LEFT
向左运动
RIGHT
向右运动
SPACE
Fire
SHIFT
superfire
F2
重生
F3
Speed=15
F4
Speed+=5
F5
Speed-=5
S
保存游戏进度
O
打开历史记录
简单布局:
图-1简单布局
3.3性能
3.3.1精度
1、在执行游戏页面首次加载的时候,不允许出现因为程序的原因导致增加加载失败;
2、在执行Agent删除操作的时候,不允许因为程序的原因发生多删除Agent、删除失败的情况
3.3.2时间特性要求
把用户进入游戏界面的时间要求在3秒内,对鼠标点击添加人员,响应时间规定在2秒内。
3.3.3灵活性
A、操作方式
程序在通常的应用环境下使用鼠标和键盘进行输入和输出操作,对于执行菜单项,通常使用鼠标的点击完成。
B、运行环境
WINDOWSXP操作系统。
3.4方法
3.4.1PTClient主文件类
属性:
类型
名称
说明
int
F_EIDTH
框架高度
int
F_HEIGHT
框架宽度
boolean
tPaint
游戏开始控制
boolean
mousePaint
鼠标绘图控制
boolean
addp
加入Police
boolean
addt
加入Thief
boolean
me
亲自参战
boolean
addMy
加入自己
boolean
isSpuer
隐身
boolean
addBackMusic1
加入背景音乐
boolean
addThiefTen
加入十个Thief
boolean
isWall
是否画出墙壁
boolean
isWin
判断游戏是否结束
boolean
stopContinue
暂停/继续
boolean
myPolice
绘制我的人物
方法:
类型
方法名
作用
publicstaticvoid
main()
主线程控制,建立主线程
publicvoid
Paint()
绘图方法初始化游戏界面
publicvoid
Update()
更新界面
Publicvoid
lauchFrame()
设计外观布局,添加菜单项监听事件
Publicvoid
actionPerformed()
行为事件实现
类:
类型
类名
说明
Publicclass
PaintThread
开辟绘图线程
ImplementsRunnable()
外部类
Monitor
ExtendsMouseAdapter{}
鼠标监听
外部类
keyMonitor
Extends
keyAdapter{}
键盘监听
PTClient算法核心:
//启动主线程
publicstaticvoidmain(String[]args){
finalPTClienttc=newPTClient();
tc.lauchFrame();
}
//绘图线程
publicclassPaintThreadimplementsRunnable{
publicvoidrun(){
while(tPaint){
if(0==second%10)time.timeUp();
repaint();
try{
Thread.sleep(100);//每0.1秒绘制一次画面
second++;
}catch(InterruptedExceptione){
e.printStackTrace();
}
}
}
}
3.4.2Police类
属性:
类型
名称
说明
Privatestaticint
P_W=30
Police宽度为30
Privatestaticint
P_H=30
Police高度为30
int
x
Police在游戏中的横坐标
int
y
Police在游戏中的纵坐标
int
oldX
Police上个位置的坐标防止粘墙
int
oldY
Police上个位置的纵坐标
Privateint
speedX=15
Police在横坐标方向的速度
Privateint
speedy=15
Police在纵坐标方向的速度
Privateboolean
Live=true
判断Police是否还活着
PrivateBoolean
bb=newBloodBar()
Police的体力图形化表示,BloodBar()是个内部类
PrivateBoolean
good=true
用于区分敌友
Privateint
Life=200
体力值
Privateint
safeL=30
安全距离
Privateboolean
isRand=true
判断是否要随机移动
Privateint
fireNum=7
设置开火频率
PrivateDirection
dir=Direction.STOP
初始化Police方向为静止
PrivateDirection
ptdir=Direction.U
初始化Police枪口方向,为向上
Privateboolean
bL=false
bU=false
bR=false
bD=false
控制Police方向的改变
PTClient
tc
引用PTClient
Privateboolean
isMe
看是不是自己
PrivatestaticToolkit
tk
获得文件路径
PrivatestaticImage[]
personImage=null
引入Police图片
方法:
类型
名称
说明
public
Police
Police类的构造函数
参数Police的坐标x,y
方向dir,好坏good
应用tc,区分自己的isMe
Publicvoid
draw(Graphicsg)
Police的绘制函数
用于绘制Police在各个方向的图像,g是传递而来的画笔
void
move()
控制Police的八个方向的移动
PublicRectangle
getRect()
获得Police所占的区域,用于检测是否发生碰撞
Publicvoid
collideWall(Wallw)
处理Police的撞墙
Publicvoid
fire()
控制Police的开火
Publicvoid
Superfire()
附加功能,控制自己的人物一次朝八个方向开火
Publicint
getLife()
获取Police现有生命值
Publicint
setLife(intlife)
设定police的生命值为life
Publicboolean
isLive()
判断Police是否活着
Publicboolean
isGood()
用于区分敌友
Publicint
getX()
getY()
获取Police的坐标
Publicboolean
Search()
搜索方法,当遇到敌人是判断是攻击,求救还是逃跑
Publicvoid
getSpeedX()
getSpeedY()
获得Police的当前速度
Publicvoid
setSpeedX(intspeedX)
setSpeedY(intspeedy)
当中弹是改变Police的速度
void
locateDirection()
根据bL,bU,bR,bD改变Police运动方向
Publicvoid
keyReleased()
重写键盘释放方法
内部类:
Publicclass
BloodBar{}
设置Police头顶的血液条
Police类的核心算法:
//移动算法
voidmove(){
//在自由移动时撞到墙返回上一步,重选方向
this.oldX=x;
this.oldY=y;
switch(dir){//根据运动方向改变位置
caseL:
x-=speedX;
break;
caseLU:
x-=speedX;
y-=speedY;
caseU:
y-=speedY;
break;
caseRU:
x+=speedX;
y-=speedY;
caseR:
x+=speedX;
break;
caseRD:
x+=speedX;
y+=speedY;
caseD:
y+=speedY;
break;
caseLD:
x-=speedX;
y+=speedY;
caseSTOP:
break;
}
if(true==isMe){
if(dir!
=Direction.STOP){
ptdir=dir;
}
}
//判断是否到达map边界
if(x<0)x=0;
if(y<60)y=60;
if(x+Police.P_W>PTClient.F_WIDTH-110)x=PTClient.F_WIDTH-Police.P_W-110;
if(y+Police.P_H>PTClient.F_HEIGHT)y=PTClient.F_HEIGHT-Police.P_H;
if(false==isMe){
if(isRand){
Direction[]dirs=Direction.values();
if(step==0){
intrn=r.nextInt(dirs.length);
dir=dirs[rn];
step=r.nextInt(12)+3;
}
step--;
}
if(!
isRand){//控制开火
if(fireNum==0)
{
fire();
fireNum=7;
}
fireNum--;
}
isRand=true;
search();
}
}
//搜索search()算法
publicbooleansearch(){
intx1=x,y1=y;
intx2,y2;
intm=1000000000;
Rectangler=newRectangle(x-200,y-200,400,400);
for(inti=0;iRobberpt=tc.thiefs.get(i);
if(pt.getRect().intersects(r)){//看敌人是否在攻击区域内
isRand=false;//若在则不随机移动
x2=pt.getX();
y2=pt.getY();
if(m>this.distance(x,y,x2,y2)){
x1=x2;
y1=y2;
}
}//if
elsecontinue;
intrLife=pt.getLife();
intt1=x-x1;
intt2=y-y1;
if(t1<0)t1=-t1;
if(t2<0)t2=-t2;
if(0==t1){//当在同一条垂直线上时
if(this.life>=rLife)//若强则进攻
{
if(y>y1&&t2>safeL){
dir=Direction.U;
ptdir=Direction.U;
}
elseif(ysafeL){
dir=Direction.D;
ptdir=Direction.D;
}elseif(y>y1){
ptdir=Direction.U;
dir=Direction.STOP;
}elseif(yptdir=Direction.D;
dir=Direction.STOP;
}
}//if(this.life)
else//否则逃跑
{
if(y>y1){
dir=Direction.D;
ptdir=Direction.U;
}
elseif(ydir=Direction.U;
ptdir=Direction.D;
}
}
}
if(0==t2){//若在同一水平线上时
if(this.life>=rLife)
{
if(x>x1&&t1>safeL){
dir=Direction.L;
ptdir=Direction.L;
}
elseif(xsafeL)
{
dir=Direction.R;
ptdir=Direction.R;
}
elseif(x>x1)
{
dir=Direction.STOP;
ptdir=Direction.L;
}
elseif(x{
dir=Direction.STOP;
ptdir=Direction.R;
}
}
else{//t逃跑
if(x>x1){
dir=Direction.R;
ptdir=Direction.L;
}
elseif(x{
dir=Direction.L;
ptdir=Direction.R;
}
}
}
if(t1!
=0&&t2!
=0&&t1>=t2){//水平差距大
if(this.life>=rLife){//攻击
if(x>x1){
dir=Direction.L;
ptdir=Direction.L;
}
elseif(x{
dir=Direction.R;
ptdir=Direction.R;
}
}
else//逃跑
{
if(x>x1){
dir=Direction.R;
ptdir=Direction.L;
}
elseif(x{
dir=Direction.L;
ptdir=Direction.R;
}
}
}
if(t1!
=0&&t2!
=0&&t1if(this.life>=rLife){//攻击
if(y>y1){
dir=Direction.U;
ptdir=Direction.U;
}
elseif(ydir=Direction.D;
ptdir=Direction.D;
}
}
elseif(this.life{
if(y>y1){
dir=Direction.D;
ptdir=Direction.U;
}
elseif(ydir=Direction.U;
ptdir=Direction.D;
}
}
}
}//for()
returntrue;
}
3.4.3Bullet类
属性:
类型
名称
说明
Privateint
x,y
记录子弹的坐标
Privateint
initX,initY
记录产生子弹的位置
用于控制子弹的有效攻击距离
Privateint
Blen=300
初始化子弹的有效攻击距离为300
Privatestaticint
B_W=10
子弹宽度
Privatestaticint
B_H=10
子弹高度
Privateint
speedX=25
speedy=25
初始化子弹横纵坐标方向的速度为25
Privateboolean
good
判断子弹的好坏
用于区分是敌方子弹还是己方子弹
PrivateDirection
dir
设置子弹方向
PTClient
tc
PTClient引用
PrivatestaticImage[]
bulletImage
存放子弹各个方向的图片
方法:
类型
名称
说明
public
Bullet()
子弹类的构造函数
参数:
子弹的横纵坐标x,y,子弹的方向dir
子弹的好坏good,以及PTClient引用tc
Publicvoid
draw(Graphicsg)
子弹的绘图函数绘制子弹各个方向各个时刻的图像
void
move()
控制子弹的八个方向的移动
PublicBoolean
isGood()
用于区分敌我子弹
己方子弹不伤害己方人员
Publicboolean
isLive()
判断子弹是否还活着
若死亡则清理出屏幕
Publicvoid
collideWall(Wallw)
处理子弹撞墙
Publicvoid
collidePolice(Policepp)
处理子弹撞击警察
Publicvoid
collideThief(Robberpt)
处理子弹撞击Thief
Publicint
getSpeedX()
getSpeedY()
获得子弹现有的速度
Publicint
setSpeedX()
setSpeedY()
重设子弹的速度
Bullet类的核心算法:
//子弹撞击Police的处理
publicvoidcollidePolice(Policepp){
if(this.live&&pp.isGood()!
=this.good&&this.getRect().intersects(pp.getRect())&&pp.isLive()){
this.live=false;
pp.setLife(pp.getLife()-50);
pp.setSpeedX(pp.getSpeedX()-3);
pp.setSpeedY(pp.getSpeedY()-3);
if(pp.getLife()<=0){
pp.setLive(false);
}
if(pp.getLife()<=100){
newSound(Sound.need_help);
}
Explodee=newExplode(x,y,tc);
tc.explodes.add(e);
tc.bullets.remove(this);
}
}
3.4.4Wall类
属性:
类型
名