官术网_书友最值得收藏!

4.3 系統功能技術實現

本節根據對系統的需求分析,對坦克大戰游戲的各功能界面進行詳細的描述與實現。

4.3.1 面板功能設計

面板功能的設計包括對基地、敵方坦克、河道和草坪、普通墻與鋼墻的設計及對界面窗口的創建。

1.基地的設計

Base類定義了幾個變量,通過構造器初始化基地的變量參數,使用g.drawImage( )方法設置一幅圖片來代表基地,通過public void move( )來處理基地受到鋼墻防護時的變化,使用if條件語句判斷鋼墻的保護時間。該游戲的核心重點自然就是基地,一旦基地被毀,則玩家失敗,游戲結束。游戲面板是游戲程序的關鍵,這里使用了方法paintComponent(Graphics g)來進行建立并設置其屬性。具體實現代碼如下:

2.敵方坦克的設計

Enemy類設置了敵方坦克的共同屬性,并根據不同外形的坦克設置了不同的屬性,如橢圓形坦克的移動速度會比較快,擁有多層顏色坦克的生命力與其擁有的顏色數量相吻合。利用隨機函數Math.random( )*4隨機生成一個隨機值,并轉換成整型數值,將此值賦予變量direction作為敵方坦克生成時的方向,再將Math.random( )*200生成的隨機值轉換成整型數值,賦予變量interval作為生成時的時間間隔,并且設置了敵方坦克的移動周期,在一個周期內將會朝著相同的方向繼續移動,還設置了其發射彈藥的時間間隔。而在特殊屬性中,分別設置敵方坦克的火力、速度、圖標等屬性,再使用方法draw(Graphics g)向地圖中加入敵方坦克。具體實現代碼如下:

3.河道和草坪的設計

Grass類繼承了Actor接口,通過Grass類構造器定義草坪的x軸、y軸坐標和矩形邊界及圖標,并通過public void draw(Graphics g)方法繪制草坪。游戲雙方坦克及其彈藥可以自由通過草坪。具體實現代碼如下:

River類繼承了Actor接口,用River類構造器定義河道的x軸、y軸坐標和矩形邊界及圖標,用g.drawImage(Image,int,int,ImageObserver)方法設置一幅圖片來代表河道。以前各個經典版本的坦克大戰游戲都將河道設置為不允許坦克經過,但彈藥可以自由通過,本程序為了遵循經典,也如此設計。具體實現代碼如下:

4.普通墻與鋼墻的設計

該模塊通過new Rectangle(int x,int y,int width,int height)完成了一個矩形的創建,然后將其具體值賦予變量數組border[數組索引]生成墻。坐標x和y為繪制矩形時的起始點,width和height分別為矩形的寬和高。通過構造器定義普通墻和鋼墻的矩形邊界及圖標。具體實現代碼如下:

5.界面窗口的創建

在該模塊中,在ServerView類的構造器中用super( )方法調用父類構造器設置窗口標題為“坦克大戰”,使用JButton(String)定義退出、幫助、發送、暫停/繼續、建立主機和隱藏6個鼠標單擊事件(即所謂的按鈕),用JTextField定義文本框并將其設置為不可編輯。使用new drawingPanel( )和setBackground(Color c)創建一個面板并設置背景顏色,再通過setBounds( )和setLayout( )方法定義界面的大小并將界面布局定義為空,并通過add( )方法向界面添加按鈕和文本框。使用setColor(Color c)方法設置面板顏色為指定顏色,再通過繼承自java.awt.Graphics類中的drawString(String,int,int)方法向面板添加并輸出當前關數及剩余敵人數,通過if條件語句進行判斷,如果消滅坦克數量大于敵方坦克數量則輸出勝利場景。

4.3.2 彈藥功能設計

該模塊用setColor( )方法設置彈藥顏色為淺灰色,使用g.fillRect(int,int,int,int)方法設置彈藥水平或垂直發射時的形狀,彈藥與什么物體相交通過if條件語句和equals( )方法來鑒定,然后處理相交時彈藥和其他對象的屬性變化。具體實現代碼如下:

4.3.3 坦克功能設計

坦克銷毀了什么特殊武器圖標通過if語句和equals( )方法來鑒定,如果銷毀TNT圖標,則已經出現的敵方坦克全部被炸毀;如果銷毀掉坦克圖標,玩家坦克加一條生命;如果銷毀掉五角星圖標,則提升玩家坦克彈藥火力并且速度加快,可以打破鋼墻;若是頭盔圖標,則玩家坦克獲得防護盾并且“免疫”敵方彈藥;如果銷毀掉鋼墻圖標,則基地由普通墻變為鋼墻,如果銷毀掉鐘表圖標,則時間停止,所有敵方坦克靜止。具體實現代碼如下:

4.3.4 服務器設計

服務器的設計包括對ServerModel類、FeedbackHandler類及其他各類的設計。

1.ServerModel類的設計

在ServerModel類中實現了ActionListener接口,具備監聽功能,然后創建一些連接變量和游戲變量的方法,設置布爾類型的服務器狀態變量,使用構造器完成消息隊列信息的設置;使用createServer( )方法建立主機,當布爾變量serverCreated的值為true時,主機創建成功,還設置了一個端口號,用try…catch語句處理代碼執行時發生的異常,并給出錯誤提示;服務器通過accept( )方法與客戶端建立連接,當端口號沒有被其他應用程序占用且IP地址正確時,則成功完成連接,載入游戲,否則就會顯示相應的錯誤提示。使用addMessage( )方法在屏幕上顯示消息,使用removeMessage( )方法刪除屏幕上的消息,通過addActor( )方法和remove( )方法完成了向地圖中增添新的物體對象和清除已經不存在物體對象的操作。具體實現代碼如下:

2.FeedbackHandler類的設計

FeedbackHandler類從客戶端程序解碼指令字符串,然后將字符串轉換為真正的指令。通過while(!instruction.substring(i,i+1).equals("?"))語句判斷其指令,并根據其指令來完成相對性的操作。

3.其他各類的設計

Lever類設置了不同的關卡,通過if(1+ (currentLevel-1)%8 == num)判斷語句來加入關卡。在進入下一關卡時,上一個關卡的所有東西都會被系統清理,并且增加了游戲難度,同時還設置了勝利場景。

Player類通過構造器設置了玩家坦克的生命數量、生成時的方向和無敵時間,以及健康狀態、彈藥數量等。通過if(type.equals("1P"))語句來判斷兩個玩家并設置其坦克的初始位置,用drawImage( )方法繪制玩家坦克。當玩家敲擊開火鍵時,會用if語句判斷是否滿足條件,若滿足就會生成一包彈藥,并且彈藥的位置、速度等屬性參數都會被設置好,再通過add( )方法添加彈藥。在坦克的下一個移動有效的前提下,根據玩家坦克的移動定義玩家坦克的下一個邊界,并判斷是否與地圖邊界和其他物體對象相交,設置相交時坦克與物體對象會發生的變化情況。當玩家坦克被擊毀時,其生命減少。使用reset( )方法將玩家坦克路徑重置為空,遺棄所有坐標和點類型,設置其位置為游戲開始時的位置。

在powerUp類中實現了對玩家坦克彈藥火力的增加。Ticker類運用構造器建立時間發生器,實現了runnable接口,并調用了其run( )方法。

ServerControler類處理來自服務器端視圖框架的輸入,實現了玩家消息互通功能。使用構造器view.buttonName.addActionListener( )方法完成按鈕功能的設計。使用addKeyListener (new KeyAdapter( ))方法增加鍵盤輸入的操作,再通過keyPressed(KeyEvent e)方法來實現,通過if(e.getKeyCode( ) == KeyEvent.VK_UP)語句來判斷并執行相應的方向移動操作,通過if(e.getKeyChar( ) == 's')判斷并執行“s”鍵的操作,if(e.getKeyCode( )==e.VK_ENTER)判斷是否單擊Enter鍵,再通過if(e.getKeyChar( ) ==?)來判斷輸入什么鍵并執行相應的操作。通過keyReleased(KeyEvent e)方法來釋放給定的鍵。具體實現代碼如下:

4.3.5 客戶端設計

客戶端的設計包括對ClientModel類、InstructionHandler類及其他各類的設計。

1.ClientModel類的設計

在ClientModel類中實現了ActionListener接口,具備監聽功能,然后創建一些連接變量和游戲變量,并設置布爾類型的客戶端狀態變量,使用構造器完成消息隊列信息的設置,用try…catch語句處理代碼執行時發生的異常,給出錯誤提示;使用add( )方法向地圖中添加對象。客戶端程序實際上不執行任何邏輯計算,它只接收指令,將指令字符串做出的反饋告知客戶端。具體實現代碼如下:

     public void connectServer(){
     addMessage("正在連接主機");
     try{
     serverIP = view.IPfield.getText();
     InetAddress addr = InetAddress.getByName(serverIP);
     clientSocket = new Socket(addr, 4321);
     out = new PrintWriter(clientSocket.getOutputStream(), true);
     in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
     }catch(Exceptione){
     t.stop();
     System.out.println(e);
     addMessage("連接出現錯誤,請確認1.輸入的IP是否正確 2.主機端已存在");
     return;
     }
2.InstructionHandler類的設計

InstructionHandler類只有客戶端可讀,它對從服務器程序反饋的指令字符串進行解碼,然后將字符串轉換為真正的指令,通過for循環語句和if判斷語句等來判斷指令,并執行相應的指令動作。具體實現代碼如下:

3.其他各類的設計

在Shield類中使用構造器,并實現玩家坦克銷毀掉頭盔圖標后獲得防護盾功能,通過draw(Graphics g)方法繪制防護盾,用方法setColor(Color c)設置其顏色,用drawRect( )設置防護盾的x軸、y軸坐標和高度、寬度。當防護盾時間結束時,通過removeActor( )方法去除防護盾。在Level類中,定義游戲正在玩的關數,設置不同的關卡,通過if(1+(levelIndex-1)%8 == num)判斷語句來加入關卡。在進入下一關卡時,上一個關卡的所有東西都會被系統清理,并且增加了游戲難度。此類只有一層對象,所以是一個靜態變量。NormalObject類代表所有其他對象。ClientControler類功能與ServerControler類相同,都是實現按鈕的功能和處理鍵盤輸入的操作。

主站蜘蛛池模板: 惠水县| 晋宁县| 陇南市| 连江县| 资阳市| 天镇县| 易门县| 平定县| 卢龙县| 海林市| 九江市| 商水县| 阆中市| 永吉县| 固原市| 仪陇县| 商水县| 漳州市| 安溪县| 三河市| 榆树市| 屏边| 贡觉县| 东兴市| 建阳市| 谢通门县| 丽江市| 寿宁县| 新竹市| 临高县| 利川市| 六枝特区| 东乌珠穆沁旗| 将乐县| 泾源县| 教育| 开原市| 湄潭县| 保德县| 云霄县| 自贡市|