MAZE系统项目设计方案.doc_第1页
MAZE系统项目设计方案.doc_第2页
MAZE系统项目设计方案.doc_第3页
MAZE系统项目设计方案.doc_第4页
MAZE系统项目设计方案.doc_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

MAZE系统项目设计方案1引言1.1编写目的详细设计说明书对MAZE游戏的总体设计和各个模块的功能、性能、输入输出、算法、接口、程序逻辑、存储分配及其它给出了详细的设计方案,为软件开发制定详细的计划,同时也提交系统分析员,由其提出意见。这是程序员开发及未来测试烦人重要文档资料。1.2背景a. 开发软件名称:MAZE系统b. 用户:所有喜欢玩这个游戏的玩家c. 项目开发环境:Windows XP + Eclipse + SDK。1.3定义MAZE 项目 详细设计方案 。2程序系统的结构本次所设计MAZE游戏的程序主结构如图2-1所示。初始化进入事件等待状态初始化失败不正常退出开始请求相关事件返回暂停请求退出正常退出图2-1 MAZE程序主结构3程序(标识符)设计说明从本章开始,逐个地给出各个层次中的每个程序的设计考虑。以下给出的提纲是针对一般情况的。对于一个具体的模块,尤其是层次比较低的模块或子程序,其很多条目的内容往往与它所隶属的上一层 模块的对应条目的内容相同,在这种情况下,只要简单地说明这一点即可。3.1程序描述主要功能:MAZE系统开发的是警匪对战游戏,玩家可以自由添加警察,小偷角色在任何游戏中任何位置,然后警察和小偷会自动在游戏中搜索对方并根据自身情况消灭敌人,游戏过程中队友之间可以相互通信,也可以在游戏中加入迷宫场地,增加游戏的趣味。可扩展性:能够适应应用要求的变化和修改,具有灵活的可扩充性。3.2功能游戏界面主框架主要包括游戏图形区域界面、菜单栏,状态栏,时间墙。菜单栏中有菜单项:“游戏”,“绘图”,“添加人员”,“新功能”,“音乐”,“关于”,“帮助”等。游戏画布区主要应该包括游戏画布中警察,小偷,子弹,爆炸等图片出现的位置。按键说明: 键值作用UP向上运动DOWN向下运动LEFT向左运动RIGHT向右运动SPACEFireSHIFTsuperfireF2重生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.4.1 PTClient主文件类属性:类型名称说明intF_EIDTH框架高度intF_HEIGHT框架宽度booleantPaint游戏开始控制booleanmousePaint鼠标绘图控制booleanaddp加入Policebooleanaddt加入Thiefbooleanme亲自参战booleanaddMy加入自己booleanisSpuer隐身booleanaddBackMusic1加入背景音乐booleanaddThiefTen加入十个ThiefbooleanisWall是否画出墙壁booleanisWin判断游戏是否结束booleanstopContinue暂停/继续booleanmyPolice绘制我的人物方法:类型方法名作用public static voidmain()主线程控制,建立主线程public voidPaint()绘图方法初始化游戏界面public voidUpdate()更新界面Public voidlauchFrame()设计外观布局,添加菜单项监听事件Public void actionPerformed()行为事件实现类:类型类名说明Public classPaintThread开辟绘图线程Implements Runnable()外部类MonitorExtends MouseAdapter鼠标监听外部类keyMonitorExtendskeyAdapter键盘监听 PTClient 算法核心:/启动主线程 public static void main(String args) final PTClient tc = new PTClient();tc.lauchFrame();/绘图线程public class PaintThread implements Runnablepublic void run()while(tPaint)if(0 = second % 10)time.timeUp();repaint();try Thread.sleep(100);/每0.1秒绘制一次画面second + ; catch (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 在纵坐标方向的速度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 Directionptdir=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,区分自己的isMePublic 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(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()根据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 :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 = 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) int rn = r.nextInt(dirs.length); dir = dirsrn; step = r.nextInt(12) + 3; step -; if(!isRand)/控制开火if(fireNum = 0) fire(); 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;/ifelse continue;int rLife = pt.getLife();int 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;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 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 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 intB_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)子弹的绘图函数绘制子弹各个方向各个时刻的图像voidmove()控制子弹的八个方向的移动Public Boolean isGood()用于区分敌我子弹己方子弹不伤害己方人员Public booleanisLive()判断子弹是否还活着若死亡则清理出屏幕Public voidcollideWall(Wall w)处理子弹撞墙Public voidcollidePolice(Police pp)处理子弹撞击警察Public voidcollideThief(Robber pt)处理子弹撞击ThiefPublic intgetSpeedX()getSpeedY()获得子弹现有的速度Public intsetSpeedX()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类 属性: 类型名称说明Private static intWALL_W=20墙壁的宽度Private static intWALL_H=20墙壁的高度Private BooleanLive=true用于判断墙壁是否还存在intx,y记录墙壁的位置Private static ImagewallImage=null存放墙壁的图片方法: 类型名称作用Public Wall()Wall的构造函数参数:墙壁的位置坐标x,y及引用PTClient tcPublic voiddraw(Graphics g)绘制墙壁的方法G是传递而来的画笔Public RectanglegetRect()获得墙壁现在的位置用于处理碰撞Public booleanisLive()判断墙壁是否还活着来决定是否还要画出这个墙壁Public voidsetLive()设置墙壁的live3.4.5 Times类 属性: 类型名称说明Private intsOne=0sTwo=0初始化时间秒的个位和十位Private intmOne=0mTwo=0初始化时间分钟的个位和十位Static ImageimageMinitesimageSecond存放时间分,秒的图片Private static ImagenumImage=null存放0-9十个数字的图片方法: 类型名称作用Public Times()时间的构造方法Public voiddraw(Graphics g)绘制各个时刻的时间数字Public voidtimeUp()控制时间的增加来更换时间数字图像核心算法:/控制时间的改变public void timeUp() sOne +;/控制时间的增加及进位if(10 = sOne)sOne = 0;sTwo +;if(6 = sTwo)sTwo = 0;mOne +;if(10 = mOne)mOne = 0;mTwo +;3.4.5 Music类 属性: 类型名称说明Private StringmidiFile设置获取文件资源路径Private SequenceSeqeuence=nullSeqeuencerPrivate booleanisPlaying=false控制音乐的开关Private volatile Threadthread开辟子线程方法: 类型名称作用PublicMusic()Music类的构造函数Public voidloadMidi()读取文件资源Public voidPlay()开启音乐Public voidStop()停止音乐Public voidrun()线程方法核心代码:/开启音乐 public void play() if (isPlaying) /如果已经在播放,返回return;try sequencer = MidiSystem.getSequencer();sequencer.open();sequencer.setSequence(sequence);sequencer.addMetaEventListener(this);catch (InvalidMidiDataException ex) catch (MidiUnavailableException e) thread = new Thread(this);thread.start();/停止音乐public void stop() if (isPlaying) sequencer.stop();isPlaying = false;if (thread != null) thread = null;/子线程运行public void run() Thread currentThread = Thread.currentThread();while (currentThread = thread & !isPlaying) sequencer.start();isPlaying = true;try thread.sleep(1000l);catch (InterruptedException ex) 3.4.6 附加类 AboutDialog类Explode类HelpDialog类Picture类Sound类3.4.7 方向枚举/枚举八个方向 public enum Direction L,LU,U,RU,R,RD,D,LD,STOP3.4.8 ChatServer 类 /通信服务端 public class ChatServer boolean started = false;ServerSocket ss = null; List clients = new ArrayList();/开辟客户端LIST /服务器端线程public static void main(String args) new ChatServer().start();/启动服务器端public void start() try ss = new ServerSocket(8888);started = true; catch(BindException e)System.out.println(port is using .);System.out.println(close process restarted!);System.exit(0); catch (IOException e) e.printStackTrace(); try while(started)Socket s = ss.accept();Client c = new Client(s);System.out.println(a client connected;); new Thread(c).start(); clients.add(c); catch (IOException e) e.printStackTrace(); finallytryss.close(); catch(IOException e)e.printStackTrace(); /接受客户端信息class Client implements Runnable/添加套接字,数据输入流,输出流 private Socket s; private DataInputStream dis = null; private DataOutputStream dos = null; private boolean bConnected = false; public Client(Socket s) this.s = s; try dis = new DataInputStream(s.getInputStream();dos = new DataOutputStream(s.getOutputStream();bConnected = true; catch (IOException e) e.printStackTrace(); public void send(String str) try dos.writeUTF(str); catch (IOException e) clients.remove(this);System.out.println(对方推出了);/e.printStackTrace(); public void run() trywhile(bConnected)String str = dis.readUTF();/System.out.println(str); for(int i =0;i clients.size(); i+) Client c = clients.get(i); c.send(str); catch(EOFException e)System.out.println(Client closed); catch (IOException e) e.printStackTrace(); finallytry/释放连接if(dis != null) dis.close();if(s != null) s.close(); catch(IOException e)e.printStackTrace();3.4.9 ChatClient 类 /通信客户端代码public class ChatClient extends Frame Socket s = null;DataOutputStream dos = null;DataInputStream dis = null;private boolean bConnected = false;/设置文本区,和输入区TextField tfTxt = new TextField();TextArea taContent = new TextArea();public static void main(String args) new ChatClient().launchFrame(); /客户端布局public void launchFrame() this.setLocation(400, 300);this.setSize(300, 300);add(tfTxt, BorderLayout.SOUTH);add(taContent, BorderLayout.NORTH);pack(); /窗口监听处理this.addWindowListener(new WindowAdapter()public void windowClosing(WindowEvent e) disconnect();System.exit(0););tfTxt.addActionListener(new TFListener();this.setVisible(true);connect();new Thread(new RecvThread().start();public void connect()try s = new Socket(,8888);dos = new DataOutputStream(s.getOutputStream();dis = new DataInputStream(s.getInputStream();System.out.println(connected); bConnected = tru

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论