1、MAZE系统详细设计书MAZE系统游戏详细设计说明书学院名称: 计算机学院专业名称: 信 管组 员: 信管学生详细设计说明书1引言1.1编写目的详细设计说明书对MAZE游戏的总体设计和各个模块的功能、性能、输入输出、算法、接口、程序逻辑、存储分配及其它给出了详细的设计方案,为软件开发制定详细的计划,同时也提交系统分析员,由其提出意见。这是程序员开发及未来测试烦人重要文档资料。1.2背景a. 开发软件名称:MAZE系统b. 项目开发小组成员:信管学生c. 用户:所有喜欢玩这个游戏的玩家d. 项目开发环境:Windows XP + Eclipse + SDK。1.3定义MAZE 项目 详细设计方案
2、 。1.4参考资料(1) 软件工程案列开发与实践,刘竹林等,清华大学出版社(2) Java课程设计案例精编,张广彬、孟红蕊,张永宝,清华大学出版社(3) 马士兵视频全集 ,马士兵 ,北京尚学堂2程序系统的结构本次所设计MAZE游戏的程序主结构如图2-1所示。3程序(标识符)设计说明从本章开始,逐个地给出各个层次中的每个程序的设计考虑。以下给出的提纲是针对一般情况的。对于一个具体的模块,尤其是层次比较低的模块或子程序,其很多条目的内容往往与它所隶属的上一层 模块的对应条目的内容相同,在这种情况下,只要简单地说明这一点即可。3.1程序描述主要功能:MAZE系统开发的是警匪对战游戏,玩家可以自由添加
3、警察,小偷角色在任何游戏中任何位置,然后警察和小偷会自动在游戏中搜索对方并根据自身情况消灭敌人,游戏过程中队友之间可以相互通信,也可以在游戏中加入迷宫场地,增加游戏的趣味。可扩展性:能够适应应用要求的变化和修改,具有灵活的可扩充性。3.2功能游戏界面主框架主要包括游戏图形区域界面、菜单栏,状态栏,时间墙。菜单栏中有菜单项:“游戏”,“绘图”,“添加人员”,“新功能”,“音乐”,“关于”,“帮助”等。游戏画布区主要应该包括游戏画布中警察,小偷,子弹,爆炸等图片出现的位置。按键说明: 键值作用UP向上运动DOWN向下运动LEFT向左运动RIGHT向右运动SPACEFireSHIFTsuperfir
4、eF2重生F3Speed=15F4Speed+=5F5Speed - =5S保存游戏进度O打开历史记录简单布局:图-1 简单布局3.3性能3.3.1精度1、在执行游戏页面首次加载的时候,不允许出现因为程序的原因导致增加加载失败;2、在执行Agent删除操作的时候,不允许因为程序的原因发生多删除Agent、删除失败的情况3.3.2时间特性要求把用户进入游戏界面的时间要求在3秒内,对鼠标点击添加人员,响应时间规定在2秒内。3.3.3灵活性A、操作方式程序在通常的应用环境下使用鼠标和键盘进行输入和输出操作,对于执行菜单项,通常使用鼠标的点击完成。B、运行环境WINDOWS XP操作系统。3.4方法3
5、.4.1 PTClient主文件类属性:类型名称说明intF_EIDTH框架高度intF_HEIGHT框架宽度booleantPaint游戏开始控制booleanmousePaint鼠标绘图控制booleanaddp加入Policebooleanaddt加入Thiefbooleanme亲自参战booleanaddMy加入自己booleanisSpuer隐身booleanaddBackMusic1加入背景音乐booleanaddThiefTen加入十个ThiefbooleanisWall是否画出墙壁booleanisWin判断游戏是否结束booleanstopContinue暂停/继续boole
6、anmyPolice绘制我的人物方法:类型方法名作用public static voidmain()主线程控制,建立主线程public voidPaint()绘图方法初始化游戏界面public voidUpdate()更新界面Public voidlauchFrame()设计外观布局,添加菜单项监听事件Public void actionPerformed()行为事件实现类:类型类名说明Public classPaintThread开辟绘图线程Implements Runnable()外部类MonitorExtends MouseAdapter鼠标监听外部类keyMonitorExtendsk
7、eyAdapter键盘监听 PTClient 算法核心:/启动主线程 public static void main(String args) final PTClient tc = new PTClient(); tc.lauchFrame(); /绘图线程 public class PaintThread implements Runnable public void run() while(tPaint) if(0 = second % 10)time.timeUp(); repaint(); try Thread.sleep(100);/每0.1秒绘制一次画面 second + ; c
8、atch (InterruptedException e) e.printStackTrace(); 3.4.2 Police类属性: 类型名称说明Private static intP_W=30Police 宽度为 30Private static intP_H=30Police 高度为30int xPolice在游戏中的横坐标intyPolice 在游戏中的纵坐标intoldXPolice上个位置的坐标防止粘墙intoldYPolice上个位置的纵坐标Private intspeedX=15Police 在横坐标方向的速度Private intspeedy=15Police 在纵坐标方向的
9、速度Private booleanLive=true判断Police是否还活着Private Boolean bb=new BloodBar()Police的体力图形化表示,BloodBar()是个内部类Private Boolean good=true用于区分敌友Private intLife=200体力值Private intsafeL=30安全距离Private booleanisRand=true判断是否要随机移动Private intfireNum=7设置开火频率Private Directiondir=Direction.STOP初始化Police方向为静止Private Dire
10、ctionptdir=Direction.U初始化Police枪口方向,为向上Private booleanbL=falsebU=falsebR=falsebD=false控制Police方向的改变PTClienttc引用PTClientPrivate booleanisMe看是不是自己Private static Toolkittk获得文件路径Private static ImagepersonImage=null引入Police图片方法: 类型名称说明publicPolicePolice类的构造函数参数Police的坐标x,y方向dir,好坏 good应用 tc,区分自己的isMePubl
11、ic voiddraw(Graphics g)Police的绘制函数用于绘制Police在各个方向的图像,g是传递而来的画笔voidmove()控制Police的八个方向的移动Public RectanglegetRect()获得Police所占的区域,用于检测是否发生碰撞Public voidcollideWall(Wall w)处理Police的撞墙Public void fire()控制Police的开火Public voidSuperfire()附加功能,控制自己的人物一次朝八个方向开火Public intgetLife()获取Police现有生命值Public intsetLife(
12、int life)设定police的生命值为lifePublic booleanisLive()判断Police是否活着Public booleanisGood()用于区分敌友Public intgetX()getY()获取Police的坐标Public booleanSearch()搜索方法,当遇到敌人是判断是攻击,求救还是逃跑Public voidgetSpeedX()getSpeedY()获得Police的当前速度Public voidsetSpeedX(int speedX)setSpeedY(int speedy)当中弹是改变Police的速度voidlocateDirection(
13、)根据bL,bU,bR,bD改变Police运动方向Public voidkeyReleased()重写键盘释放方法内部类:Public classBloodBar设置Police头顶的血液条Police类的核心算法:/移动算法void move()/在自由移动时撞到墙返回上一步,重选方向 this.oldX = x; this.oldY = y; switch(dir)/根据运动方向改变位置 case L : x -= speedX; break; case LU : x -= speedX; y -= speedY; case U : y -= speedY; break; case RU
14、 : x += speedX; y -= speedY; case R : x += speedX; break; case RD : x += speedX; y += speedY; case D : y += speedY; break; case LD : x -= speedX; y += speedY; case STOP : break; if(true = isMe) if(dir != Direction.STOP) ptdir = dir; /判断是否到达map边界 if(x 0) x = 0; if(y PTClient.F_WIDTH - 110) x = PTClie
15、nt.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) int rn = r.nextInt(dirs.length); dir = dirsrn; step = r.nextInt(12) + 3; step -; if(!isRand)/控制开火 if(fireNum = 0) fire
16、(); fireNum = 7; fireNum -; isRand = true; search(); /搜索search()算法public boolean search() int x1 = x,y1 = y; int x2,y2; int m = 1000000000; Rectangle r = new Rectangle(x-200,y-200,400,400); for(int i = 0;i this.distance(x, y, x2, y2) x1 = x2; y1 = y2; /if else continue; int rLife = pt.getLife(); int
17、 t1 = x - x1; int t2 = y - y1; if(t1 0)t1 = -t1; if(t2 = rLife)/ 若强 则进攻 if(y y1 & t2 safeL) dir = Direction.U; ptdir = Direction.U; else if(y safeL) dir = Direction.D; ptdir = Direction.D; else if(y y1) ptdir = Direction.U; dir = Direction.STOP; else if(y y1 ) dir = Direction.D; ptdir = Direction.U;
18、 else if(y = rLife) if(x x1 & t1 safeL) dir = Direction.L; ptdir = Direction.L; else if(x safeL) dir = Direction.R; ptdir = Direction.R; else if(x x1) dir = Direction.STOP; ptdir = Direction.L; else if(x x1) dir = Direction.R; ptdir = Direction.L; else if(x = t2)/水平差距大 if(this.life = rLife)/攻击 if( x
19、 x1 ) dir = Direction.L; ptdir = Direction.L; else if( x x1) dir = Direction.R; ptdir = Direction.L; else if( x x1) dir = Direction.L; ptdir = Direction.R; if(t1 != 0 & t2!= 0 & t1= rLife)/攻击 if(y y1) dir = Direction.U; ptdir = Direction.U; else if(y y1) dir = Direction.D; ptdir = Direction.D; else
20、if(this.life y1) dir = Direction.D; ptdir = Direction.U; else if(y y1) dir = Direction.U; ptdir = Direction.D; /for() return true; 3.4.3 Bullet类属性: 类型名称说明Private intx,y记录子弹的坐标Private intinitX,initY记录产生子弹的位置用于控制子弹的有效攻击距离Private intBlen=300初始化子弹的有效攻击距离为300Private static intB_W=10子弹宽度Private static int
21、B_H=10子弹高度Private int speedX =25speedy=25初始化子弹横纵坐标方向的速度为25Private booleangood判断子弹的好坏用于区分是敌方子弹还是己方子弹Private Directiondir设置子弹方向PTClienttcPTClient 引用Private static ImagebulletImage存放子弹各个方向的图片方法: 类型名称说明publicBullet()子弹类的构造函数参数:子弹的横纵坐标x,y,子弹的方向dir子弹的好坏good,以及PTClient引用tcPublic voiddraw(Graphics g)子弹的绘图函数
22、绘制子弹各个方向各个时刻的图像voidmove()控制子弹的八个方向的移动Public Boolean isGood()用于区分敌我子弹己方子弹不伤害己方人员Public booleanisLive()判断子弹是否还活着若死亡则清理出屏幕Public voidcollideWall(Wall w)处理子弹撞墙Public voidcollidePolice(Police pp)处理子弹撞击警察Public voidcollideThief(Robber pt)处理子弹撞击ThiefPublic intgetSpeedX()getSpeedY()获得子弹现有的速度Public intsetSpe
23、edX()setSpeedY()重设子弹的速度Bullet类的核心算法:/子弹撞击Police的处理 public void collidePolice(Police pp) 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) new Sound(Sound.need_help); Explode e = new Explode(x,y,tc); tc.explodes.add(e); tc.bullets.remove(this); 3.4.4 Wall类 属性: 类型名
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2