版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p> 基于J2SE的網絡版坦克大戰(zhàn)游戲設計</p><p><b> 摘要</b></p><p> [摘要] :J2SE (Java 2 Standard Edition)就是Java2的標準版,主要用于桌面應用軟件的編程,是伴隨著計算機技術的飛速發(fā)展而誕生的一項新的開發(fā)技術。隨著個人電腦的日益普及、Java功能在個人電腦上的實現,Java應用程
2、序產生的單機增值服務逐漸體現出其影響力,對豐富人們的生活內容、愉悅身心、開發(fā)智力等起著不可忽視的作用。該論文通過總結和分析JAVA游戲的開發(fā)流程和代碼框架的設計,開發(fā)了一款基于J2SE架構的游戲——坦克大戰(zhàn)。本設計采用面向對象的設計模式,對游戲中的所有物體賦予對象的概念和屬性。運行程序后允許用戶選擇執(zhí)行選項菜單。在開始游戲后,啟動服務器和客戶端,對背景的所有物體進行繪圖。在主程序運行的線程中,畫面刷新將以一定的頻率采用雙緩沖技術對屏幕重
3、繪,實時反映整個游戲的進行狀態(tài)。用戶控制的坦克運行在主線程中,隨屏幕刷新的頻率而移動。坦克將在游戲開始時進行初始化,然后將坦克繪制在地圖的上層。本設計主要實現的功能是讓坦克能向八個方向移動,并且打出炮彈,子彈擊中敵人坦克,子彈和敵人坦克同時消失,產生爆炸,CPU坦克能智能的移動并且打出炮彈。能夠支持網絡對戰(zhàn)和單</p><p> Java良好的跨平臺特性在軟件的開發(fā)中顯示出了巨大的威力,“一次編寫,隨處運行”,
4、java系統可以運行在不同的操作系統和硬件上。隨著linux的持續(xù)增長以及MacOSX完全支持java技術,跨平臺的特性變得越來越有分量。</p><p> 由于免費、跨平臺、java語言本身技術先進,在高校中,java已經成為許多學科研究、課程和計算的首選語言,用java做上機作業(yè),一般都是鼓勵的。據我所知,北大、清華許多院系的研究生入學考試都可以用java語言答題。實際上,用java來完成這些工作,大多數情
5、況下要比用C或其他語言簡潔得多,你可以把注意力集中在算法等核心部分,從而獲得更高分數。</p><p> [關鍵詞] 面向對象 坦克大戰(zhàn) 游戲 J2SE Socket</p><p><b> [目錄]</b></p><p><b> 第1章 前言1</b></p><p>
6、1.1 游戲設計的需求分析1</p><p> 1.1.1 國內外電子網絡游戲的現狀1</p><p> 1.1.2 本系統的現實意義1</p><p> 1.1.3 本系統和其他開發(fā)游戲區(qū)別1</p><p> 1.2 開發(fā)技術概述2</p><p> 1.2.1 Java、C#語言、C
7、/C++主流編程語言比較2</p><p> 1.3 本章小結3</p><p> 第2章 相關技術理論4</p><p> 2.1 系統運行環(huán)境4</p><p> 2.1.1 系統運行的軟件環(huán)境4</p><p> 2.1.2 系統運行的硬件環(huán)境4</p><p>
8、; 2.2 相關理論4</p><p> 2.2.1 關于Eclipse的介紹4</p><p> 2.2.2 J2SE框架5</p><p> 2.2.3 聯機通信機制6</p><p> 2.2.4 Java圖形編程6</p><p> 2.3 本章小結7</p>&
9、lt;p> 第3章 系統設計8</p><p> 3.1 系統可行性分析8</p><p> 3.1.1 技術可行性8</p><p> 3.1.2 經濟可行性8</p><p> 3.1.3 操作可行性8</p><p> 3.2 系統需求分析8</p><p>
10、; 3.2.1 在人機對戰(zhàn)模式下實現的功能8</p><p> 3.2.2 在網絡對戰(zhàn)模式下實現的功能8</p><p> 3.3 系統功能設計9</p><p> 3.3.1 坦克大戰(zhàn)總體功能設計9</p><p> 3.3.2 GameWindow類基本功能分析10</p><p> 3
11、.3.3 TankClient類基本功能分析11</p><p> 3.3.4 Ball類基本功能分析11</p><p> 3.3.5 Explode類基本功能分析11</p><p> 3.3.6 服務器類基本功能分析12</p><p> 3.3.7 信息傳送類基本功能分析12</p><p>
12、 3.4 本章小結12</p><p> 第4章 系統實現13</p><p> 4.1 游戲主窗體實現13</p><p> 4.2 單機游戲的實現14</p><p> 4.3 聯機功能實現16</p><p> 4.4 本章小結18</p><p>
13、第5章 總結與展望19</p><p> 5.1 總結19</p><p> 5.2 設計中的不足之處19</p><p> 5.3 展望19</p><p><b> 致 謝20</b></p><p><b> 參考文獻21</b></
14、p><p><b> 附錄122</b></p><p><b> 第1章 前言</b></p><p> 1.1 游戲設計的需求分析</p><p> 1.1.1 國內外電子網絡游戲的現狀</p><p> 游戲本身就是一種娛樂方式。自有人類文明的時候,就有了游
15、戲,可以說游戲就是人們生活娛樂的一部分。在今天,借助于數字、電子、網絡、創(chuàng)意、編劇、美工、音樂……等等“先進”的道具,網絡游戲對于人們現實生活的虛擬達到了一個全新的境界,并且則在這新的境界上還原了游戲的本源--人與人的互動。網絡游戲滿足了現代社會必須的溝通需求,無疑它應該是適合所有人的。</p><p> 國內網絡游戲市場,已經坐擁了1000萬用戶且仍不斷增長的游戲玩家市場,百余款游戲也著實熱鬧,但也體現出國內
16、玩家的相對固定和游戲種類的相對單一,雖說運營商的推廣手法也各具特點,可本質上的大同小異使得競爭空前慘烈,而由此誘發(fā)的種種問題更是招致了社會與媒體的不滿,阻礙了游戲產業(yè)的發(fā)展。網絡游戲市場的重新定位是最迫切需要解決的問題。大型游戲機除了在大眾休閑娛樂方面,還在軍事、國防、醫(yī)療等方面有良好的發(fā)展前景。廣州大型游戲機所采用的尖端計算機圖形圖像技術、多樣化的軟件程序設計、成熟的機械和電子技術,被充分運用在軍事、國防及醫(yī)療等方面。例如,在軍事模擬
17、對抗演習中,大型游戲機既可以模擬作戰(zhàn)現場的地形、軍力部署、天氣等情況,還可以進行多兵種戰(zhàn)術技能對抗訓練;在國防訓練方面,大型游戲機可以模擬坦克操縱、導彈發(fā)射、飛機駕駛、艦艇巡航等多種訓練任務;在醫(yī)療培訓方面,大型游戲機擁有的全息三維立體投影技術,可以逼真地展示人體的各部分構造和器官,以上這些方面的應用,都顯示出大型游戲機在降低行業(yè)技能培訓成本的優(yōu)勢。</p><p> 1.1.2 本系統的現實意義</p
18、><p> 《坦克大戰(zhàn)》(Battle City)是1985年日本南夢宮Namco游戲公司在任天堂FC(FamilyComputer)平臺上,推出的一款多方位平面射擊游戲。游戲以坦克戰(zhàn)斗及保衛(wèi)基地為主題。大部分80后的青年人曾經都玩過這款FC平臺上的經典游戲,FC平臺上的坦克大戰(zhàn)只能兩個人協同作戰(zhàn)。本系統運用Java這個跨平臺的編程語言,在PC上重新實現這一款經典游戲,探究曾經這一款經典游戲的大概設計與實現,并且加
19、入坦克八個方向的行走,多人的局域網對戰(zhàn)模式,使游戲的玩法更豐富。</p><p> 1.1.3 本系統和其他開發(fā)游戲區(qū)別</p><p> 本系統的坦克大戰(zhàn)是基于Java語言設計開發(fā)的,具有高超的人工智能,精美的圖形處理,支持單機運行和網絡對戰(zhàn)的坦克射擊游戲。比之前網絡上實現的游戲更加方便,快捷,智能。游戲基本玩法較簡單,游戲可一人電腦作戰(zhàn),每次電腦方有坦克10輛,游戲以消滅全部敵方
20、坦克過關為目的。在這過程中,坦克有機會得到血塊來添加生命值,從而變得更加強大,也能利用各種有利地形來阻擊敵人。游戲設置了墻面,電腦方坦克不能穿越墻面射擊玩家坦克,而玩家坦克可隨意穿越墻面打擊電腦方坦克,這一游戲特權。還有給玩家坦克設置超級炮彈,當電腦方坦克數量過多時,玩家坦克可以發(fā)射超級炮彈打擊敵方。主要新增的功能簡單羅列如下:</p><p> 1、屏幕左上方顯示游戲狀態(tài),當玩家方坦克數全為零時則游戲結束;&
21、lt;/p><p> 2、一般坦克只可在空地中或草叢中行走,不可通過墻面等障礙物;</p><p> 3、游戲中打壞敵方坦克后,可能會在隨機位置隨機出現血塊獎勵,坦克經過該位置可獲得相應加生命值獎勵;</p><p> 4、玩家坦克的游戲資格和電腦坦克不同。</p><p> 1.2 開發(fā)技術概述</p><p>
22、; 1.2.1 Java、C#語言、C/C++主流編程語言比較</p><p> 簡單地說,它們不是同一種語言,語法有差別,編程時具體用到的類庫或者函數庫也不一樣。雖然它們不是同一種語言,不過它們卻也有所聯系。廣泛地說,C可以看作其他三種語言的源語言,因為其他三種語言幾乎都是從C而來的,無論從數據類型還是控制語句看,其他三種語言都有從C得來的跡象。</p><p> 其中C+
23、+則一般看作是對C語言的擴展。因為C語言沒有面向對象的語法結構,而當時業(yè)界又迫切需要面向對象的編程特性,所以貝爾實驗室的開發(fā)者就為C添加了面向對象的結構?,F在C++已經不只是C的擴展了,它已經完全可以被看作一種新的編程語言。雖然C的特性以及庫函數仍然被C++支持,不過C++擁有自己的獨立的類庫體系,功能相當強大。Java是一種可以撰寫跨平臺應用軟件的面向對象的程序設計語言,是由Sun Microsystems公司于1995年5月推出
24、的Java程序設計語言和Java平臺(即JavaSE, JavaEE, JavaME)的總稱。Java 技術具有卓越的通用性、高效性、平臺移植性和安全性,廣泛應用于個人PC、數據中心、游戲控制臺、科學超級計算機、移動電話和互聯網,同時擁有全球最大的開發(fā)者專業(yè)社群。在全球云計算和移動互聯網的產業(yè)環(huán)境下,Java更具備了顯著優(yōu)勢和廣闊前景。雖然它的底層(運行時庫)是用C語言開發(fā)的,可是并不依賴于C。因為Java的運行是在運行時庫的支持下進
25、行的,所以運行效率比起可以更接近底層的C/C++來說效率會有所影響,不過Java的類庫采用很好的設計理念設計,非</p><p> Java和C#都比較高級,可以看作高級語言的高級語言,優(yōu)點是開發(fā)容易,但運行效率不如更為底層的C/C++。具體選擇使用的時候,可以根據實際的項目需要選擇。運行效率要求高的,底層控制要求高的用C/C++,否則可以選擇Java或C#;跨平臺的要求高的可以用Java。關于跨平臺,
26、C/C++也是很好的語言,因為所有平臺都支持,不同的是,不同平臺支持的實現不同,類庫不同,要編寫跨平臺的程序,需要選擇跨平臺的類庫,如標準類庫,如果標準類庫的支持不夠也只需要附加編寫一個跨平臺的支持類庫。</p><p><b> 1.3 本章小結</b></p><p> 本章主要介紹了網絡游戲在國內外發(fā)展的現狀。本系統主要的現實意義,與其之前版本的區(qū)別和擴展
27、的一些功能。對Java、C#、C/C++幾種主流編程語言比較,闡述了使用Java語言編程的原因。</p><p> 第2章 相關技術理論</p><p> 2.1 系統運行環(huán)境</p><p> 2.1.1 系統運行的軟件環(huán)境</p><p> ?。?)網絡服務器操作系統:Windows XP;</p><p&g
28、t; ?。?)開發(fā)工具:eclipse3.6.2;</p><p> ?。?)運行環(huán)境:J2SDK 1.6;</p><p> ?。?)編程語言:Java語言;</p><p> 2.1.2 系統運行的硬件環(huán)境</p><p> (1)CPU:Intel或者兼容微處理器,奔騰166MHz及其以上;</p><p>
29、 ?。?)內存:最低32MB,可以運行圖形界面的Java Application;最低48MB,可以運行Java Applet;內存不足,將會導致系統(尤其是服務器)的性能大幅下降;</p><p> ?。?)硬盤:242 MB到80 GB及其以上;</p><p> ?。?)圖形顯示卡:無要求;</p><p> ?。?)網卡:普通網卡,3Com OfficeCo
30、nnect 10/100兆位網卡;</p><p><b> 2.2 相關理論</b></p><p> 2.2.1 關于Eclipse的介紹</p><p> Eclipse是著名的跨平臺的自由集成開發(fā)環(huán)境(IDE)。最初主要用來Java語言開發(fā),目前亦有人通過插件使其作為C++、Python、PHP等其他語言的開發(fā)工具。</
31、p><p> Eclipse的本身只是一個框架平臺,但是眾多插件的支持,使得Eclipse擁有較佳的靈活性。許多軟件開發(fā)商以Eclipse為框架開發(fā)自己的IDE。</p><p> Eclipse最初是由IBM公司開發(fā)的替代商業(yè)軟件Visual Age for Java的下一代IDE開發(fā)環(huán)境,2001年11月貢獻給開源社區(qū),現在它由非營利軟件供應商聯盟Eclipse基金會(Eclipse
32、Foundation)管理。 2003年,Eclipse 3.0選擇OSGi服務平臺規(guī)范為運行時架構。 2007年6月,穩(wěn)定版3.3發(fā)布;2008年6月發(fā)布代號為Ganymede的3.4版;2009年6月發(fā)布代號為Galileo的3.5版;2010年6月發(fā)布代號為Helios的3.6版</p><p> Eclipse的基礎是富客戶機平臺(Rich Client Platform,即RCP)
33、。RCP包括下列組件:</p><p> 核心平臺(啟動Eclipse,運行插件)</p><p> OSGi(標準集束框架)</p><p> SWT(可移植構件工具包)</p><p> JFace(文件緩沖,文本處理,文本編輯器)</p><p> Eclipse工作臺(即Workbench,包含視圖(
34、views)、編輯器(editors)、視角(perspectives)、和向導(wizards))</p><p> Eclipse采用的技術是IBM公司開發(fā)的(SWT),這是一種基于Java的窗口組件,類似Java本身提供的AWT和Swing窗口組件;不過IBM聲稱SWT比其他Java窗口組件更有效率。Eclipse的用戶界面還使用了GUI中間層JFace,從而簡化了基于SWT的應用程序的構建。</p
35、><p> Eclipse的插件機制是輕型軟件組件化架構。在富客戶機平臺上,Eclipse使用插件來提供所有的附加功能,例如支持Java以外的其他語言。已有的分離的插件已經能夠支持C/C++(CDT)、PHP、Perl、Ruby,Python、telnet和數據庫開發(fā)。插件架構能夠支持將任意的擴展加入到現有環(huán)境中,例如配置管理,而決不僅僅限于支持各種編程語言。</p><p> Eclip
36、se的設計思想是:一切皆插件。Eclipse核心很小,其它所有功能都以插件的形式附加于Eclipse核心之上。Eclipse基本內核包括:圖形API(SWT/Jface),Java開發(fā)環(huán)境插件(JDT),插件開發(fā)環(huán)境(PDE)等。</p><p> 2.2.2 J2SE框架</p><p> Java2平臺包括:標準版(J2SE)、企業(yè)版(J2EE)和微縮版(J2ME)三個版本。J2
37、SE,J2ME和J2EE,這也就是SunONE(Open NetEnvironment)體系。J2SE就是Java2的標準版,主要用于桌面應用軟件的編程;J2ME主要應用于嵌入式系統開發(fā),如手機和PDA的編程;J2EE是Java2的企業(yè)版,主要用于分布式的網絡程序的開發(fā),如電子商務網站和ERP系統。</p><p> Standard Edition(標準版) J2SE 包含那些構成Java語言核心的類。比如:
38、數據庫連接、接口定義、輸入/輸出、網絡編程</p><p> Enterprise Edition(企業(yè)版) J2EE 包含J2SE 中的類,并且還包含用于開發(fā)企業(yè)級應用的類。比如:EJB、servlet、JSP、XML、事務控制</p><p> Micro Edition(微縮版) J2ME 包含J2SE中一部分類,用于消費類電子產品的軟件開發(fā)。比如:呼機、智能卡、手機、PDA、機
39、頂盒</p><p><b> 簡單講就是:</b></p><p> J2SE: Java 2 Standard edition (Java 2 標準版)</p><p> J2EE: Java 2 enterprise edition( Java 2 企業(yè)版)</p><p> J2ME: Java 2 mi
40、cro edition (Java 2 微縮版)</p><p> 他們的范圍是:J2SE包含于J2EE中,J2ME包含了J2SE的核心類,但新添加了一些專有類</p><p> 應用場合,API的覆蓋范圍各不相同。</p><p> 籠統的講,可以這樣理解:J2SE是基礎;壓縮一點,再增加一些CLDC等方面的特性就是J2ME;擴充一點,再增加一些EJB等企業(yè)
41、應用方面的特性就是J2EE。</p><p> 補充一點J2EE更恰當的說,應該是JAVA2企業(yè)開發(fā)的技術規(guī)范,不僅僅是比標準版多了一些類。J2EE又包括許多組件,如Jsp, Servlet, JavaBean, EJB, JDBC, JavaMail等。</p><p> J2SE商業(yè)版本,標準版本 (Java2 Standard Edition) 定位
42、在客戶端,主要用于桌面應用軟件的編程。</p><p> J2SE 包含那些構成Java語言核心的類。</p><p> 比如:數據庫連接、接口定義、輸入/輸出、網絡編程</p><p> J2SE 是J2EE的基礎,他大量的JDK代碼庫是每個要學習J2EE的編程人員必須掌握的。</p><p> 從JDK 5.0開始,不再
43、叫J2SE,改名為 Java SE了,因為那個2已經失去了其應該有的意義。</p><p> 2.2.3 聯機通信機制</p><p> 網絡編程,簡單地理解就是兩臺計算機相互通信。其基本模型就是客戶機/服務器模型,也就是通信雙方中的一方必須提供一個固定的位置,而另一方只需要知道這個固定的位置,并且建立兩者之間的聯系,然后完成數據交換。這里提供固定位置的一方通常稱為服務器,
44、而建立聯系的一方稱為客戶端。Socket(中文意思為插座),基于客戶機/服務器的Socket通信模式如圖2.1所示:</p><p> 圖2.1 基于客戶機/服務器的Soctet通信模式圖</p><p> 當客戶程序需要與服務器程序通訊的時候,客戶程序在客戶機創(chuàng)建一個socket對象,Socket類有幾個構造函數。兩個常用的構造函數是 Socket(InetAddress addr,
45、 int port) 和 Socket(String host, int port),兩個構造函數都創(chuàng)建了一個基于Socket的連接服務器端流套接字的流套接字。兩個函數都通過參數port獲得服務器的端口號。假設已經建立連接了,網絡API將在客戶端基于Socket的流套接字中捆綁客戶程序的IP地址和任意一個端口號,否則兩個函數都會拋出一個IOException對象。如果創(chuàng)建了一個Socket對象,那么它可能通過調用Socket的 getI
46、nputStream()方法從服務程序獲得輸入流讀傳送來的信息,也可能通過調用Socket的 getOutputStream()方法獲得輸出流來發(fā)送消息。在讀寫活動完成之后,客戶程序調用close()方法關閉流和流套接字。</p><p> 2.2.4 Java圖形編程</p><p> Java中的Graphics類是用于繪圖和顯示格式化文本的工具類。在Java程序中繪圖必須在一個窗
47、口(容器)中進行,繪圖窗體經常被設計為一個組件容器。一般首先在一個面板中進行繪制,然后再將這個面板添加到顯示窗口中去。</p><p> Graphics類是在Java.awt包中申明,顯示格式化文本和繪圖時通過調用Graphics類的draw()方法實現的,例如drawString(String),drawLine()等。繪圖采用的坐標系是原點在左上角,縱軸向下以像素為單位的坐標系。</p>&
48、lt;p><b> 2.3 本章小結</b></p><p> 在本章節(jié)中首先介紹了該系統的運行環(huán)境,值的注意的是軟件環(huán)境的配置,因為整個系統都是在虛擬環(huán)境下運行的,所以虛擬環(huán)境對于整個設計的調試和運行至關重要;其次對開發(fā)工具Eclipse3.6.2的簡單介紹,利用eclipse開發(fā)項目,是可以提高項目的開發(fā)效率。還有是對一些技術理論,J2SE框架,Java語言,系統運行所支持的
49、操作系統,聯機通信機制及Java圖形編程等理論做了簡單的介紹,為本系統后期實現圖形化界面和網絡通信做了理論支持。</p><p><b> 第3章 系統設計</b></p><p> 3.1 系統可行性分析</p><p> 3.1.1 技術可行性</p><p> Java語言自Sun公司于1995年5月正式
50、發(fā)布以來,經歷了出生、成長、成熟壯大的幾個階段,逐漸發(fā)展成為IT領域里的主流計算模式,使用Java開發(fā)工具方便,容易實現。Java對開發(fā)網絡產品有它自己獨特的優(yōu)勢,網絡游戲也是其開發(fā)產物之一。本系統開發(fā)過程是利用Java編程語言和eclipse集成開發(fā)環(huán)境配合使用來實現的,它是基于TCP/UDP協議和Socket編程技術,建立以C/S為結構模式的娛樂性游戲平臺。</p><p> 3.1.2 經濟可行性<
51、/p><p> 本設計的開發(fā)是基于JDK1.6和eclipse3.6的,因為它們都是免費而且開源的軟件,所以實現本設計的成本就有所降低。隨著計算機、網絡通訊和信息技術的迅猛發(fā)展以及人類精神生活品質的提高,國際、國內的各種各樣的大型綜合游戲網站如雨后春筍般的發(fā)展起來。一款好的游戲帶來的經濟效益可以說是不可估量的,比如現在網上最流行的魔獸世界、征途等大型網絡版游戲。本游戲既可單機運行,也可以是聯機版多人同時在線對戰(zhàn)。&
52、lt;/p><p> 3.1.3 操作可行性</p><p> 本設計是一個網絡版的游戲平臺,只是模擬了現在社會上的一些網絡游戲的部分功能,所以操作簡易,玩家不需要了解內部流程,只是和一般其他的網絡游戲一樣的操作即可開始游戲。相對于開發(fā)者而言,整個系統形成主要由JDK5.0虛擬環(huán)境和eclipse3.2共同完成,無需更多復雜的工具和服務器支持。</p><p>
53、3.2 系統需求分析</p><p> 3.2.1 在人機對戰(zhàn)模式下實現的功能</p><p> 在單機模式下實現以下基本功能:</p><p> 坦克可以8個方向的行走,Z鍵打出子彈,S鍵超級炮彈,A鍵添加電腦坦克,F2復活。</p><p> 智能的敵方坦克,隨機移動,隨機打出子彈。</p><p> 加
54、入四面墻,子彈和敵方坦克不能穿墻。</p><p> 敵方坦克之間不重疊。</p><p> 子彈與坦克的碰撞檢測。</p><p> 加入主戰(zhàn)坦克的血條顯示,每顆炮彈減10點血,總共100點血,電腦坦克一顆子彈就死亡。</p><p> 使用配置文件可以配置敵方坦克出現的數量。</p><p> 菜單欄選項
55、,可以選擇單機模式或網絡模式,可以查看幫助信息,關于信息。</p><p> 加入坦克、子彈、墻的圖片,使界面看上去更美觀。</p><p> 3.2.2 在網絡對戰(zhàn)模式下實現的功能</p><p> 在人機對戰(zhàn)模式中實現功能基礎上,增加以下功能實現網絡對戰(zhàn)功能:</p><p> 創(chuàng)建一個游戲的服務器端程序,負責分配客戶端ID號和轉
56、發(fā)每一個客戶端的信息到其它客戶端,使用TCP協議接收客戶端的連接,使用UDP協議傳送坦克的各類數據</p><p> 客戶端需要配置服務器的IP地址,服務器TCP端口,服務器UDP端口,本機的UDP端口</p><p> 客戶端使用TCP連接服務器,服務器分配唯一的ID號給客戶端</p><p> 使用UDP協議向服務器發(fā)送本機坦克數據</p>
57、<p> 啟動服務器之后,客戶端坦克加入到服務器中,分紅方和藍方勢力互相對戰(zhàn)</p><p> 3.3 系統功能設計</p><p> 3.3.1 坦克大戰(zhàn)總體功能設計</p><p> 坦克大戰(zhàn)游戲主要實現玩家參加游戲的整個流程,用戶登陸游戲客戶端選擇游戲模式,可分為單機模式和網絡對戰(zhàn)模式,選擇單機模式可以直接進入游戲狀態(tài);選擇網絡對戰(zhàn)模式,
58、在啟動服務器后,玩家需要設置網絡參數,服務器的IP地址、服務器TCP端口、服務器UDP端口、本機的UDP端口,本機的UDP端口不能與其它客戶端相同,成功后服務器會分配指定的ID號給客戶端(只有成功連接上服務器的玩家才能參與網絡對戰(zhàn)游戲功能);連接上的玩家就可以通過控制鍵盤操作,加入對戰(zhàn)游戲。整個網絡版坦克大戰(zhàn)游戲流程圖如圖3.1所示:</p><p> 圖3.1 網絡坦克大戰(zhàn)游戲流程</p>&
59、lt;p> 3.3.2 GameWindow類基本功能分析</p><p> GameWindow類是整個系統的核心部分,它承擔整個系統的所有可實現功能的調度工作。 是整個游戲運行的場所。GameWindow類設計流程圖如圖3.2所示:</p><p> 圖3.2 GameWindow類設計流程</p><p> GameWindow類是主類,通過
60、調用其他類中封裝的方法來使整個系統運行起來,下面顯示GameWindow與其它各類之間的關系如圖3.3所示:</p><p> 圖3.3 游戲系統類關聯圖</p><p> 3.3.3 TankClient類基本功能分析</p><p> TankClient(坦克)類中,封裝了一些變量屬性,包括坦克自己的大?。╓IDTH,HRIGHT),運動速度(SPRR
61、D_X:在x軸方向的速度;SPEED_Y:在Y軸方向的速度)、生命值控制(life)、坦克編號(ID)、坦克名(name)、方向控制(dir)、生死控制(live)、好壞控制(good)的變量等。TankClient類中沒有main函數,不是主類,它當中只封裝一些變量屬性和靜態(tài)方法,被TankClient類調用來實現坦克的一系列動作。TankClient類中的主要方法羅列如下:</p><p> ?。?)publ
62、ic Rectangle getRectange() {</p><p> return new Rectangle(TankClientX, TankClientY,</p><p> images[0].getWIDth(null), images[0].getWIDth(null));</p><p><b> } </b><
63、/p><p> Rectangle類是碰撞檢測的輔助類,通過得到坦克和子彈的矩形,檢測兩個矩形是否碰撞(相交);</p><p> (2)draw()方法:負責將自己坦克所有的活動在屏幕上畫出來;</p><p> ?。?)move()方法:主要負責控制坦克的移動,包括8個方向(左,左上,上,右上,右,右下,下,左下)的控制及坦克對于邊界的處理</p>
64、<p> ?。?)keyPreesed()方法:設定使用鍵盤的“↑”“↓”“←”“→”“A”“S”F2”鍵控制坦克移動及發(fā)炮,并且網絡對戰(zhàn)中向服務器發(fā)送消息等操作;</p><p> ?。?)keyReleased ()方法:處理按鍵抬起事件,抬起“Z”鍵時,發(fā)射炮彈并加入新炮彈,能夠逐一發(fā)射每一發(fā)炮彈、抬起“S”鍵可以發(fā)射超級炮彈等功能,并向服務器發(fā)送消息;</p><p>
65、 (6)locateDireaction()方法:判斷坦克及炮筒方向,并且換方向時候向服務器發(fā)送一條消息</p><p> ?。?)fire() 方法:處理發(fā)送子彈的方法,并向服務器發(fā)送添加一顆子彈的消息;</p><p> ?。?)collIDesWithWall()方法:主要負責處理坦克撞墻事件;</p><p> 3.3.4 Ball類基本功能分析<
66、/p><p> Ball(子彈)類和Tank類一樣,只封裝一些變量屬性和靜態(tài)方法,主要變量包括:子彈自己的大?。╓IDTH,HRIGHT),運動速度(SPRRD_X:在x軸方向的速度;SPEED_Y:在Y軸方向的速度)、子彈標示(ID)、所屬坦克的ID號(TankID用于網絡版)等。Misslie類持有一個TankClient類(大管家)的引用tc,TankClient類要執(zhí)行發(fā)射炮彈操作時調用Missile類中的
67、方法。Misslie類中的主要方法如下:</p><p> draw()方法:負責畫出子彈的所有活動;</p><p> move()方法:先判斷方向再移動,并給它一定的移動速度;</p><p> getRect()方法:負責取得子彈的外切方形,為碰撞檢測做準備;</p><p> hitTan()方法:檢測子彈是否撞到坦克,若撞到
68、返回true,否則返回false;</p><p> hitTanks()方法:檢測是否撞到一系列坦克中的一個;</p><p> hitWall()方法:檢測子彈和墻是否相撞。</p><p> 3.3.5 Explode類基本功能分析</p><p> Explode(爆炸)類也是一個只封裝自己的變量和方法的外部包裝類,沒有mai
69、n方法,供TankClient主類需要時調用它的draw()方法,當子彈擊中坦克時需要產生爆炸。使用11張圖片重疊現實爆炸效果如3.4圖所示:</p><p><b> 圖3.4 爆炸圖</b></p><p> 3.3.6 服務器類基本功能分析</p><p> TankServer(服務器)類主要負責在網絡對戰(zhàn)游戲時維護各個在線玩家
70、的基本信息,并動態(tài)的維護玩家列表。聯機模式下類關系圖如圖3.5所示:</p><p> 3.5 聯機模式類關聯圖</p><p> 3.3.7 信息傳送類基本功能分析</p><p> 信息傳送類就是用來封裝客戶端和服務器端的交互信息。將網絡中傳遞的眾多信息封裝成可序列化的類,將會使程序有很好的可擴展性。</p><p><b&
71、gt; 3.4 本章小結</b></p><p> 本章首先對整個游戲設計進行了可行性分析,其次對游戲要達到怎么樣的需求,要實現哪些功能做以及實現這些功能設計到的類,最后再詳細的介紹了系統要實現這些功能所涉及到的各個類之間的關系。</p><p><b> 第4章 系統實現</b></p><p> 4.1 游戲主窗體
72、實現</p><p> GameWindow類負責畫出游戲主窗體,它是整個游戲運行和所有活動的場所。登陸主窗口后,主界面上包括兩個下拉菜單條,“游戲”和“幫助”,玩家點擊“游戲”菜單條下可以選擇游戲模式;“幫助”下拉菜單條中有游戲說明和游戲操作,方便用戶了解游戲規(guī)則。為了游戲不至于太單調,還配置了背景音樂。除此之外,本設計優(yōu)點是GameWindow類還封裝了一個update()方法,使用雙緩沖消除閃爍現象。因為
73、刷新重畫頻率太快,paint()方法還沒有完成,會造成逐條顯示,影響系統的運行,所以解決辦法是創(chuàng)建一個虛擬屏幕,在屏幕的后面,在要畫的將所有的東西畫在虛擬屏幕上,也就是內存上,畫完之后一次性將虛擬屏幕上的內容貼到屏幕上,這樣就消除了閃爍現象,用戶的眼睛便感覺不到閃爍了。GameWindow類是整個系統的“大管家”,當要執(zhí)行某動作時,“大管家”只需要調用各個類中封裝好的方法,讓被調用的類自己去執(zhí)行它自己的方法,這更體現了面向對象的思想。游
74、戲主窗體界面如圖4.1所示:</p><p> 圖4.1 游戲主窗口預覽效果圖</p><p> 實現虛擬屏幕消除閃爍的關鍵代碼如下:</p><p> public voID update(Graphics g) {</p><p> if(null==img){</p><p> img = this
75、.createImage(gameWIDth,gameHeight);</p><p><b> }</b></p><p> Graphics imgGraphics = img.getGraphics();</p><p> Color c=g.getColor();</p><p> imgGraphics
76、.setColor(Color.black);</p><p> imgGraphics.fillRect(0, menuHeight, gameWIDth, gameHeight);</p><p> g.setColor(c);</p><p> paint(imgGraphics);</p><p> g.drawImage(i
77、mg,0,0,null);}</p><p> 4.2 單機游戲的實現</p><p> 游戲運行主界面,在下拉菜單中選擇單機游戲進入單機模式,通過鍵盤控制坦克運動,相互對戰(zhàn),當被打中時產生一個爆炸,屏幕左上方顯示游戲信息:子彈數目(出界就死亡)、爆炸數目、CPU坦克數目(網絡模式下不顯示)、玩家坦克生命值、您擊毀的坦克數量、當前ID(單機模式下不顯示)。其效果圖如圖4.2所示:&l
78、t;/p><p> 圖4.2 單機游戲模式主界面圖</p><p> CPU敵人坦克智能移動、開炮的關鍵代碼如下:</p><p> public static Random random = new Random();//隨機數</p><p> static private int step = random.nextInt(12)
79、+3;;//坦克移動的步數</p><p> //設定移動的方向,移動步數,開炮概率</p><p> private voID locateDirection(){</p><p> if(step==0){</p><p> int randomNumber = random.nextInt(directions.length);
80、</p><p> direction = directions[randomNumber];</p><p> gunbarrelLocateDirection();</p><p> step= random.nextInt(12)+3;//隨機產生移動的步數,最少為3</p><p> if(step==3){//隨機開炮<
81、;/p><p> GameWindow.getBalls().add(fire());</p><p><b> }</b></p><p><b> }</b></p><p><b> step--;</b></p><p><b>
82、 }</b></p><p> 當玩家在單機模式下按A鍵可以使用超級炮彈,可同時向八個方向發(fā)射炮彈,效果如圖4.3所示:</p><p> 圖4.3 發(fā)射超級炮彈</p><p> 超級炮彈的關鍵代碼如下:</p><p> private Direction[] directions = Direction.values
83、();// 得到方向數組</p><p><b> // 八個方向開炮</b></p><p> private voID superFire() {</p><p> if (!isLive()) {//如果坦克是死亡的</p><p><b> return;</b></p>
84、<p><b> }</b></p><p> if (GameWindow.getNc() != null) {//如果網絡模式已經打開</p><p><b> return;</b></p><p><b> }</b></p><p> int
85、x = this.TankClientX + this.CLIENTTANKWIDTH / 2;// 子彈出現的X坐標</p><p> int y = this.TankClientY + this.CLIENTTANKHEIGHT / 2;// 子彈出現的y坐標</p><p> for (int i = 0; i < 8; i++) {//從方向類的數組里依次取8個方向&l
86、t;/p><p> GameWindow.getBalls().add(</p><p> new Ball(this.ID, directions[i], good, x, y, GameWindow));</p><p><b> }</b></p><p><b> }</b></p
87、><p> 當玩家被擊中一次扣10點血,當100點血全部扣完,提示游戲結束,并顯示死亡的次數,按F2可以滿血原地復活,繼續(xù)戰(zhàn)斗,效果如圖4.4 所示:</p><p> 圖4.4 玩家死亡時游戲界面</p><p> 4.3 聯機功能實現</p><p> 在本系統的實現過程中,在支持網絡對戰(zhàn)的服務器類的定義中需要使用ServerSo
88、cket類來響應多個客戶端連接請求,server服務器上需要兩大協議,一個是TCP,用來接收客戶端;另一個是UDP,用來轉發(fā)游戲的數據。Server類系統模型圖如圖4.5所示:</p><p> 圖4.5 Server類系統簡單模型圖</p><p> 網絡游戲模式下,游戲主要在客戶端運行,啟動客戶端時玩家首先要填寫信息之后才能加入到游戲中去,先啟動服務器,紅色小方塊表示確定服務器已
89、連接。如圖4.6所示:</p><p> 圖4.6 啟動服務器</p><p> 進入網絡模式,輸入網絡配置信息:服務器IP、服務器TCP端口、服務器UDP端口、自己本機的UDP端口,端口不能與其它客戶端的相同。網絡配置界面如圖4.7所示:</p><p> 圖4.7 網絡版游戲玩家信息欄</p><p> 填寫好網絡配置信息,單
90、機YES,連接上服務器后,進入游戲主界面,服務器為玩家指定勢力和ID號,進入游戲后,通過坦克顏色來區(qū)分敵對勢力和同盟坦克。游戲界面左上角顯示游戲的基本信息,包括玩家ID號,玩家的血量,所擊毀的敵方坦克等,如圖4.8所示:</p><p> 圖4.8 登陸網絡模式主界面</p><p> 多個玩家加入后,開始對戰(zhàn),在此模式中沒有超級炮彈功能,但是被擊毀之后允許按F2滿血原地復活,但是會被
91、記錄死亡的次數,各個玩家游戲界面上都能顯示實時動態(tài),效果如圖4.9和5.0所示:</p><p> 圖4.9 網絡版游戲對戰(zhàn)實時顯示圖</p><p> 圖5.0網絡版死亡之后復活顯示圖</p><p> 網絡模式設計主要代碼如下:</p><p><b> 請參見附錄1</b></p><p
92、><b> 4.4 本章小結</b></p><p> 本章主要介紹了該系統的實現和運行,分別敘述了在單機模式和網絡對戰(zhàn)模式下游戲的運行和調試過程。在單機模式下,玩家的游戲發(fā)射火力要比電腦隨機產生的坦克能力稍強一些。網絡模式下,注意一定要先啟動服務器,只有啟動服務器后,各個玩家才能加入游戲。到此為止,本設計基本完成預期效果。</p><p> 第5章
93、總結與展望</p><p><b> 5.1 總結</b></p><p> 本次設計已是大學最后一次對專業(yè)知識的綜合實踐活動,同時也是我所做的工作量最大的一次作業(yè),因此從一開始我對本次畢業(yè)設計就給予了高度重視。從選題、收集資料、學習相關技術到實際編程,我都一絲不茍的對待了。當然其間我也走了不少彎路,有時甚至需要推倒重來,但同時我也多次體會過克服困難后的成就感。
94、</p><p> 通過這次畢業(yè)設計以及撰寫本畢業(yè)論文,我學會了一些編程技巧,而且對調試的錯誤有進一步的認識,有時候就一個小小的語法錯誤就會導致程序調試不通過。所以每個字符,每句程序都要認真對待。使用不同的編程環(huán)境,其效率完全不一樣,所以我選擇了Eclipse,它自動找錯/糾錯功能、Debug調試和代碼自動生成等一些重要的功能大大提高了我的設計效率。對于設計論文,一定要注意格式,認識事情都有它的規(guī)則、規(guī)范,不能
95、按個人喜好隨意改變。</p><p> 5.2 設計中的不足之處</p><p> 本系統實現了坦克游戲所應有的基本功能,但是由于時間和能力有限,還有一部分功能未能實現,例如:服務器處理不夠高效、協議不夠精細、線程需要同步(確定本機坦克在其它客戶端顯示的位置準確)、客戶端退出時候服務端的處理、服務器一段時間內沒有接收到數據的處理、地圖設定、升級、坦克的高級人工智能控制等,不能和現在I
96、nternet上各種坦克大戰(zhàn)游戲相媲美。還有就是對部分功能在設計過程中未能做到更加完善,稍有瑕疵,但是已經盡力改善了。還有就是當運行網絡模式時,必須專門啟動服務器,而不是一鍵啟動。對于玩家里來說有點麻煩。</p><p><b> 5.3 展望</b></p><p> 本系統基本實現了坦克游戲所應有的基本功能,在大學中最后一次專攻式的學習了Java語言,使我對
97、Java語言有了更深層次的理解,通過該游戲設計,提高了我的編程能力,也讓我養(yǎng)成了良好的編程習慣。希望在今后自己能繼續(xù)對J2SE等技術進行深入的學習和研究。</p><p><b> 致 謝</b></p><p> 首先我要感謝我的指導老師張曉獻老師,感謝她在整個畢業(yè)設計過程中的指導,為我提示游戲設計的邏輯思路;為我提供參考書籍;為我提供了技術方面資料,而且在遇到
98、問題的時候,總是鼓勵我去解決;尤其在論文格式的修改方面,讓我明白了要寫出一個標準的論文,它的格式的重要性,哪怕就算是一個標點符號都要符合其標準和格式要求。在設計的整個過程中從開題報告的確定到初稿的修改,以及中期檢查,以及定稿的過程中都給予了我細心的指導。</p><p> 其次還要特別感謝大學三年來所有的老師,為我們打下計算機專業(yè)知識的基礎。以前總是覺得學的課程沒有什么用處,但是當真正用計算機來解決實際問題的時
99、候,才知道每門課程的重要性,甚至覺得所學習的那些課程還遠遠不夠,所以以后還應該不斷的學習。</p><p> 感謝學校對我的培育,讓我從思想上素質上知識上得到很大的提高。學習中的各科老師的悉心教導讓我掌握了基本知識.</p><p> 感謝我的同學在設計完成前后對我的得力幫助,沒有同學的共同學習進步也許就沒法完成設計,沒有同學對程序的測試,也許就難以發(fā)現一些潛在的錯誤,在此一并表示感謝
100、。</p><p> 在此一并祝愿學校領導、老師、同學工作順利,事業(yè)更上一層樓;同時也祝愿學校更加輝煌。</p><p><b> 參考文獻</b></p><p> [1] 姜志強. Java語言程序設計[M]. 北京:電子工業(yè)出版社,2007</p><p> [2] Bruce Eckel. Java編程思
101、想[M]. 北京:機械工業(yè)出版社,2007</p><p> [3] Sierra,Bates. Head First Java[M]. 北京: 中國電力出版社,2007</p><p> [4] 葉核亞. Java程序設計實用教程[M]. 北京:電子工業(yè)出版,2010</p><p> [5] 卡爾弗特,多納霍. Java TCP/IP Socket編程[M
102、]. 北京:機械工業(yè)出版社,2009</p><p> [6] 哈諾德. java網路編程[M]. 北京:中國電力出版社,2005</p><p> [7] 杜佳榮,馬建紅,騰振宇. Java網絡編程技術與實踐[M]. 北京:清華大學出版社,2008</p><p> [8] 閻宏. Java與模式[M]. 北京:電子工業(yè)出版社,2002</p>
103、<p><b> 附錄1</b></p><p> import Java.io.DataInputStream;</p><p> import Java.io.DataOutputStream;</p><p> import Java.io.IOException;</p><p> impo
104、rt Java.net.DatagramPacket;</p><p> import Java.net.DatagramSocket;</p><p> import Java.net.InetSocketAddress;</p><p> import Java.net.ServerSocket;</p><p> import
105、Java.net.Socket;</p><p> import Java.net.SocketException;</p><p> import Java.util.ArrayList;</p><p> import Java.util.List;</p><p><b> //服務器類</b></p
106、><p> public class TankServer {</p><p> public static int ID = 100;// 分配給客戶端的ID號(用UUID或GUID實現)</p><p> public static final int TCP_PORT = 4444;// TCP端口號</p><p> public
107、 static final int UDP_PORT = 5555;// UDP占用的端口號</p><p> List<Client> clients = new ArrayList<Client>();// 保存客戶端連接信息的列表</p><p> public voID start() {</p><p> new Thread
108、(new UDPThread()).start();// 啟一個線程監(jiān)聽接收到的UDP數據</p><p> ServerSocket ss = null;// 服務器TCPsocket類</p><p><b> try {</b></p><p> ss = new ServerSocket(TCP_PORT);// 服務器占用的端口
109、號</p><p> } catch (Exception e) {</p><p><b> }</b></p><p> while (true) {</p><p> Socket s = null;</p><p><b> try {</b></p&
110、gt;<p> s = ss.accept();// 接受一個socket連接</p><p> DataInputStream dis = new DataInputStream(s.getInputStream());// 創(chuàng)建數據輸入流</p><p> String IP = s.getInetAddress().getHostAddress();// 根據so
111、cket拿到IP地址</p><p> int UDPPort = dis.readInt();// 讀出客戶端發(fā)送過來的UDP的端口號</p><p> Client c = new Client(IP, UDPPort);// 創(chuàng)建客戶端信息類</p><p> clients.add(c);// 儲存進列表</p><p> D
112、ataOutputStream dos = new DataOutputStream(s.getOutputStream());// 創(chuàng)建數據輸出流</p><p> dos.writeInt(ID++);// 向客戶端發(fā)送一個ID號</p><p> // 打印出客戶端的IP地址,客戶端的TCP端口號,客戶端的UDP端口號</p><p> System.o
113、ut.println("A Client Connect! Addr- "</p><p> + s.getInetAddress() + ":" + s.getPort()</p><p> + "---UDPPort:" + UDPPort);</p><p> } catch (Exceptio
114、n e) {</p><p> } finally {</p><p> if (null != s) {</p><p><b> try {</b></p><p> s.close();// 關閉</p><p> } catch (IOException e) {</p&g
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 坦克大戰(zhàn)畢業(yè)設計
- 畢業(yè)設計---java編寫的坦克大戰(zhàn)的游戲設計
- 坦克大戰(zhàn)游戲畢業(yè)設計
- java版坦克大戰(zhàn)
- 畢業(yè)設計---基于java的網絡版坦克大戰(zhàn)游戲設計
- 坦克大戰(zhàn)--java課程設計
- 畢業(yè)設計----基于java的網絡版坦克大戰(zhàn)游戲設計
- java坦克大戰(zhàn)課程設計報告
- java坦克大戰(zhàn)課程設計報告
- 畢業(yè)論文---基于java的網絡版坦克大戰(zhàn)游戲設計
- java課程設計---基于java的坦克大戰(zhàn)
- 基于java坦克大戰(zhàn)課程設計
- java坦克大戰(zhàn)課程設計報告
- java課程設計----基于java的坦克大戰(zhàn)
- java版坦克大戰(zhàn)論文正式版.doc
- 基于java語言的坦克大戰(zhàn)
- 基于java的游戲坦克大戰(zhàn)
- java坦克大戰(zhàn)課程設計報告.doc
- java語言程序課程設計-- 坦克大戰(zhàn)
- 基于java語言的坦克大戰(zhàn)
評論
0/150
提交評論