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

下载本文档

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

文档简介

1、MAZ郎统项目设计方案1引言1.1编写目的详细设计说明书对MAZE游戏的总体设计和各个模块的功能、性能、输入输出、算法、接口、程序逻辑、存储分配及其它给出了详细的设计方案,为软件开发制定详细的计划,同时也提交系统分析员,由其提出意见。这是程序员开发及未来测试烦人重要文档资料。1.2背景a. 开发软件名称:MAZES!统b. 用户:所有喜欢玩这个游戏的玩家c. 项目开发环境:WindowsXP+Eclipse+SDK。1.3定义MAZE®目详细设计方案。2程序系统的结构本次所设计MAZ崭戏的程序主结构如图2-1所示图2-1MAZE程序主结构3程序(标识符)设计说明从本章开始,逐个地给出

2、各个层次中的每个程序的设计考虑。以下给出的提纲是针对一般情况的。对于一个具体的模块,尤其是层次比较低的模块或子程序,其很多条目的内容往往与它所隶属的上一层模块的对应条目的内容相同,在这种情况下,只要简单地说明这一点即可。3.1程序描述主要功能:MAZE!统开发的是警匪对战游戏,玩家可以白由添加警察,小偷角色在任何游戏中任何位置,然后警察和小偷会白动在游戏中搜索对方并根据白身情况消灭敌人,游戏过程中队友之间可以相互通信,也可以在游戏中加入迷宫场地,增加游戏的趣味。可扩展性:能够适应应用要求的变化和修改,具有灵活的可扩充性。3.2功能游戏界面主框架主要包括游戏图形区域界面、菜单栏,状态栏,时间墙。

3、菜单栏中有菜单项:“游戏”,“绘图”,“添加人员”,“新功能”,“音乐”,“关于”,“帮助”等。游戏画布区主要应该包括游戏画布中警察,小偷,子弹,爆炸等图片出现的位置。按键说明:键值作用UP向上运动DOWN向下运动LEFT向左运动RIGHT向右运动SPACEFireSHIFTsuperfireF2重生F3Speed=15F4Speed+=5F5Speed-=5S保存游戏进度O打开历史记录简单布局:盘X图-1简单布局3.3性能3.3.1精度1、在执行游戏页面首次加载的时候,不允许出现因为程序的原因导致增加加载失败;2、在执行Agent删除操作的时候,不允许因为程序的原因发生多删除Agent、删除

4、失败的情况3.3.2时间特性要求把用户进入游戏界面的时间要求在3秒内,对鼠标点击添加人员,响应时间规定在2秒内。3.3.3灵活性A、操作方式程序在通常的应用环境下使用鼠标和键盘进行输入和输出操作,对于执行菜单项,通常使用鼠标的点击完成。B、运行环境WINDOWSXP作系统。3.4方法3.4.1PTClient主文件类类型方法名作用方法:Ss方法名iw属性:类型名称说明intF_EIDTH框架高度intF_HEIGHT框架宽度booleantPaint游戏开始控制booleanmousePaint鼠标绘图控制booleanaddp加入Policebooleanaddt加入Thiefboolean

5、me亲白参战booleanaddMy加入白己booleanisSpuer隐身booleanaddBackMusic1加入背景音乐booleanaddThiefTen加入十个ThiefbooleanisWall是古画出墙壁booleanisWin判断游戏是否结束booleanstopContinue暂停/继续booleanmyPolice绘制我的人物publicstaticvoidmain()主线程控制,建立主线程publicvoidPaint()绘图方法初始化游戏界面publicvoidUpdate()更新界面PublicvoidlauchFrame()设计外观布局,添加菜单项监听事件Publ

6、icvoidactionPerformed()行为事件实现类:类型类名说明PublicclassPaintThread开辟绘图线程ImplementsRunnable()外部类MonitorExtendsMouseAdapter鼠标监听外部类keyMonitorExtendskeyAdapter键盘监听PTClient算法核心:/启动主线程publicstaticvoidmain(Stringargs)(finalPTClienttc=newPTClient();tc.lauchFrame();/绘图线程publicclassPaintThreadimplementsRunnable(publ

7、icvoidrun()(while(tPaint)(if(0=second%10)time.timeUp();repaint();try(Thread.sleep(100);/每0.1秒绘制一次画面second+;catch(InterruptedExceptione)(e.printStackTrace();3.4.2Police类属性:类型名称说明PrivatestaticintP_W=30Police宽度为30PrivatestaticintP_H=30Police高度为30intxPolice在游戏中的横坐标intyPolice在游戏中的纵坐标intoldXPolice上个位置的坐标防

8、止粘墙intoldYPolice上个位置的纵坐标PrivateintspeedX=15Police在横坐标方向的速度Privateintspeedy=15Police在纵坐标方向的速度PrivatebooleanLive=true判断Police是否还活着PrivateBooleanbb=newBloodBar()Police的体力图形化表示,BloodBar()是个内部类PrivateBooleangood=true用于区分敌友PrivateintLife=200体力值PrivateintsafeL=30安全距离PrivatebooleanisRand=true判断是古要随机移动Privat

9、eintfireNum=7设置开火频率PrivateDirectiondir=Direction.STOP初始化Police方向为静止PrivateDirectionptdir=Direction.U初始化Police枪口方向,为向上PrivatebooleanbL=falsebU=falsebR=falsebD=false控制Police方向的改变PTClienttc引用PTClientPrivatebooleanisMe看是不是自己PrivatestaticToolkittk获得文件路径PrivatestaticImagepersonImage=null引入Police图片方法:类型名称说

10、明publicPolicePolice类的构造函数参数Police的坐标x,y方向dir,好坏good应用tc,区分白己的isMePublicvoiddraw(Graphicsg)Police的绘制函数用于绘制Police在各个方向的图像,g是传递而来的画笔voidmove()控制Police的八个方向的移动PublicRectanglegetRect()获得Police所占的区域,用于检测是否发生碰撞PublicvoidcollideWall(Wallw)处理Police的撞墙Publicvoidfire()控制Police的开火PublicvoidSuperfire()附加功能,控制白己的

11、人物一次朝八个方向开火PublicintgetLife()获取Police现有生命值PublicintsetLife(intlife)设定police的生命值为lifePublicbooleanisLive()判断Police是否活着PublicbooleanisGood()用于区分敌友PublicintgetX()getY()获取Police的坐标PublicbooleanSearch()搜索方法,当遇到敌人是判断是攻击,求救还是逃跑PublicvoidgetSpeedX()getSpeedY()获得Police的当前速度PublicvoidsetSpeedX(intspeedX)setSp

12、eedY(intspeedy)当中弹是改变Police的速度voidlocateDirection()根据bL,bU,bR,bD改变Police运动方向PublicvoidkeyReleased()重写键盘释放方法内部类:PublicclassBloodBar(设置Police头顶的血液条Police类的核心算法:/移动算法voidmove()(/在自由移动时撞到墙返回上一步,重选方向this.oldX=x;this.oldY=y;switch(dir)(/根据运动方向改变位置caseL:x-=speedX;break;caseLU:x-=speedX;y-=speedY;caseU:y-=s

13、peedY;break;caseRU:x+=speedX;y-=speedY;caseR:x+=speedX;break;caseRDx+=speedX;y+=speedY;caseD:y+=speedY;break;caseLD:x-=speedX;y+=speedY;caseSTOPbreak;if(true=isMe)if(dir!=Direction.STOPptdir=dir;/判断是否到达mapte界if(x<0)x=0;if(y<60)y=60;if(x+Police.P_V>PTClient.F_WIDTH110)x=PTClient.F_WIDTHPolic

14、e.P_W110;if(y+Police.P_H>PTClient.F_HEIGHTy=PTClient.F_HEIGHTPolice.P_Hif(false=isMe)(values();length);if(isRand)(Directiondirs=Direction.if(step=0)(intrn=r.nextInt(dirs.dir=dirsrn;step=r.nextInt(12)+3;step-;if(!isRand)(/控制开火if(fireNum=0)(fire();fireNum=7;fireNum-;isRand=true;search();/搜索search()

15、算法publicbooleansearch()intx1=x,y1=y;intx2,y2;intm=1000000000;Rectangler=newRectangle(x-200,y-200,400,400);for(inti=0;i<tc.thiefs.size();i+)/看敌人是否在Robberpt=tc.thiefs.get(i);if(pt.getRect().intersects(r)(攻击区域内isRand=false;/若在则不随机移动x2=pt.getX();y2=pt.getY();(m>this.distance(x,y,x2,y2)(x1=x2;y1=y2

16、;/ifelsecontinueifintrLife=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.Uptdir=Direction.Uelseif(y<y1&&t2>safeL)(dir=Direction.D;ptdir=Direction.D;elseif(y>y1)(p

17、tdir=Direction.Udir=Direction.STO;Pelseif(y<y1)(ptdir=Direction.D;dir=Direction.STO;P/if(this.life)else/否则逃跑(if(y>y1)(dir=Direction.D;ptdir=Direction.Uelseif(y<y1)(dir=Direction.Uptdir=Direction.D;if(0=t2)(/若在同一水平线上时if(this.life>=rLife)(if(x>x1&&t1>safeL)(dir=Direction.L;pt

18、dir=Direction.L;elseif(x<x1&&t1>safeL)(dir=Direction.R;ptdir=Direction.R;elseif(x>x1)(dir=Direction.STO;Pptdir=Direction.L;elseif(x<x1)(dir=Direction.STOPptdir=Direction.R;else(/t逃跑if(x>x1)(dir=Direction.R;ptdir=Direction.L;elseif(x<x1)(dir=Direction.L;ptdir=Direction.R;if(

19、t1!=0&&t2!=0&&t1>=t2)(/水平差距大if(this.life>=rLife)(/攻击if(x>x1)(dir=Direction.L;ptdir=Direction.L;elseif(x<x1)(dir=Direction.R;ptdir=Direction.R;else/逃跑(if(x>x1)(dir=Direction.R;ptdir=Direction.L;elseif(x<x1)(dir=Direction.L;ptdir=Direction.R;if(t1!=0&&t2!=0&am

20、p;&t1<t2)(/垂直距离大if(this.life>=rLife)(/攻击if(y>yi)(dir=Direction.Uptdir=Direction.Uelseif(y<y1)(dir=Direction.D;ptdir=Direction.D;elseif(this.life<rLife)/逃跑(if(y>y1)(dir=Direction.D;ptdir=Direction.Uelseif(y<y1)(dir=Direction.Uptdir=Direction.D;/for()returntrueBullet类属性:类型名称说明

21、Privateintx,y记录子弹的坐标PrivateintinitX,initY记录产生子弹的位置用于控制子弹的有效攻击距离PrivateintBlen=300初始化子弹的有效攻击距离为300PrivatestaticintB_W=10子弹宽度PrivatestaticintB_H=10子弹高度PrivateintspeedX=25speedy=25初始化子弹横纵坐标方向的速度为25Privatebooleangood判断子弹的好坏用于区分是敌方子弹还是己方子弹PrivateDirectiondir设置子弹力1可PTClienttcPTClient引用PrivatestaticImagebu

22、lletImage存放子弹各个方向的图片方法:类型名称说明publicBullet()子弹类的构造函数参数:子弹的横纵坐标x,y,子弹的方向dir子弹的好坏good,以及PTClient引用tcPublicvoiddraw(Graphicsg)子弹的绘图函数绘制子弹各个方向各个时刻的图像voidmove()控制子弹的八个方向的移动PublicBooleanisGood()用于区分敌我子弹己方子弹不伤害己方人员PublicbooleanisLive()判断子弹是否还活着若死亡则清理出屏幕PublicvoidcollideWall(Wallw)处理子弹撞墙PublicvoidcollidePoli

23、ce(Policepp)处理子弹撞击警察PublicvoidcollideThief(Robberpt)处理子弹撞击ThiefPublicintgetSpeedX()getSpeedY()获得子弹现有的速度PublicintsetSpeedX()setSpeedY()重设子弹的速度Bullet类的核心算法:/子弹撞击Police的处理publicvoidcollidePolice(Policepp)(if(this.live&&pp.isGood()!=this.good&&this.getRect().intersects(pp.getRect()&&

24、amp;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);Wall类属性:类型名称说明P

25、rivatestaticintWALL_W=20墙壁的宽度PrivatestaticintWALL_H=20墙壁的高度PrivateBooleanLive=true用于判断墙壁是否还存在intx,y记录墙壁的位置PrivatestaticImagewallImage=null存放墙壁的图片方法:类型名称作用PublicWall()Wall的构造函数参数:墙壁的位置坐标x,y及引用PTClienttcPublicvoiddraw(Graphicsg)绘制墙壁的方法G是传递而来的画笔PublicRectanglegetRect()获得墙壁现在的位置用于处理碰撞PublicbooleanisLive

26、()判断墙壁是否还活着来决定是否还要圆出这个墙壁PublicvoidsetLive()设尚壁的live3.4.3 Times类属性:类型名称说明PrivateintsOne=0sTwo=0初始化时间秒的个位和十位PrivateintmOne=0mTwo=0初始化时间分钟的个位和十位StaticImageimageMinitesimageSecond存放时间分,秒的图片PrivatestaticImagenumImage=null存放0-9十个数字的图片方法:类型名称作用PublicTimes()时间的构造方法Publicvoiddraw(Graphicsg)绘制各个时刻的时间数字换时间数字图像

27、核心算法:/控制时间的改变publicvoidtimeUp()(sOne+;/控制时间的增加及进位if(10=sOne)(sOne=0;sTwo+;if(6=sTwc)(sTwo=0;mOne+;if(10=mOnemOne=0;mTwo+;Music类属性:类型名称说明PrivateStringmidiFile设置获取文件资源路径PrivateSequenceSeqeuence=nullSeqeuencerPrivatebooleanPrivatevolatileThreadisPlaying=falsethread控制首乐的开关开辟子线程方法:类型名称作用PublicMusic()Musi

28、c类的构造函数PublicvoidloadMidi()读取文件资源PublicvoidPlay()开启音乐PublicvoidStop()停止音乐核心代码:/开启音乐publicvoidplay()(if(isPlaying)(/如果已经在播放,返回return;try(sequencer=MidiSystem.getSequencer();sequencer.open();sequencer.setSequence(sequence);sequencer.addMetaEventListener(this);catch(InvalidMidiDataExceptionex)(catch(Mi

29、diUnavailableExceptione)(thread=newThread(this);thread.start();/停止音乐publicvoidstop()(if(isPlaying)(sequencer.stop();isPlaying=false;if(thread!=null)(thread=null;/子线程运行publicvoidrun()(ThreadcurrentThread=Thread.currentThread();while(currentThread=thread&&!isPlaying)(sequencer.start();isPlayin

30、g=true;try(thread.sleep(1000l);catch(InterruptedExceptionex)(3.4.6 附加类AboutDialog类Explode类HelpDialog类Picture类Sound类3.4.7 方向枚举/枚举八个方向publicenumDirection(L,LUURURRDDLDSTOP3.4.8 ChatServer类/通信服务端publicclassChatServer(booleanstarted=false;ServerSocketss=null;List<Client>clients=newArrayList<Cli

31、ent>();/开辟客户端LIST/服务器端线程publicstaticvoidmain(Stringargs)newChatServer().start();/启动服务器端publicvoidstart()tryss=newServerSocket(8888);started=true;catch(BindExceptione)System.out.println("portisusing.");System.out.println("closeprocessrestarted!");System.exit(0);catch(IOExceptio

32、ne)e.printStackTrace();try(while(started)(Sockets=ss.accept();Clientc=newClient(s);System.out.println("aclientconnected;");newThread(c).start();clients.add(c);catch(IOExceptione)(e.printStackTrace();finally(try(ss.close();catch(IOExceptione)(e.printStackTrace();/接受客户端信息classClientimplement

33、sRunnable(/添加套接字,数据输入流,输出流privateSockets;privateDataInputStreamdis=null;privateDataOutputStreamdos=null;privatebooleanbConnected=false;publicClient(Sockets)(this.s=s;try(dis=newDataInputStream(s.getInputStream();dos=newDataOutputStream(s.getOutputStream();bConnected=true;catch(IOExceptione)(e.printS

34、tackTrace();publicvoidsend(Stringstr)(try(dos.writeUTF(str);catch(lOExceptione)(clients.remove(this);System.out.println("对方推出了");/e.printStackTrace();publicvoidrun()(try(while(bConnected)(Stringstr=dis.readUTF();/System.out.println(str);for(inti=0;i<clients.size();i+)(Clientc=clients.ge

35、t(i);c.send(str);catch(EOFExceptione)(System.out.println("Clientclosed");catch(lOExceptione)(e.printStackTrace();finally(try(/释放连接if(dis!=null)dis.close();if(s!=null)s.close();catch(IOExceptione)(e.printStackTrace();3.4.9ChatClient类/通信客户端代码publicclassChatClientextendsFrame(Sockets=nullData

36、OutputStreamdos=null;DataInputStreamdis=null;privatebooleanbConnected=false;/设置文本区,和输入区TextFieldtfTxt=newTextField();TextAreataContent=newTextArea();publicstaticvoidmain(Stringargs)newChatClient().launchFrame();/客户端布局publicvoidlaunchFrame()this.setLocation(400,300);this.setSize(300,300);add(tfTxt,Bo

37、rderLayout.SOUT)Hadd(taContent,BorderLayout.NORT)H;pack();/窗口监听处理this.addWindowListener(newWindowAdapter()publicvoidwindowClosing(WindowEvente)(disconnect();System.exit(0););tfTxt.addActionListener(newTFListener();this.setVisible(true);connect();newThread(newRecvThread().start();publicvoidconnect()(try(s=newSocket("",8888);dos=newDataOutputStream(s.getOutputStream();dis=newDataInputStream(s.getInputStream();System.out.println("connected&q

温馨提示

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

评论

0/150

提交评论