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

提交評論