基于java語(yǔ)言的網(wǎng)絡(luò)聊天系統(tǒng)開(kāi)發(fā)與實(shí)現(xiàn)_第1頁(yè)
基于java語(yǔ)言的網(wǎng)絡(luò)聊天系統(tǒng)開(kāi)發(fā)與實(shí)現(xiàn)_第2頁(yè)
基于java語(yǔ)言的網(wǎng)絡(luò)聊天系統(tǒng)開(kāi)發(fā)與實(shí)現(xiàn)_第3頁(yè)
基于java語(yǔ)言的網(wǎng)絡(luò)聊天系統(tǒng)開(kāi)發(fā)與實(shí)現(xiàn)_第4頁(yè)
基于java語(yǔ)言的網(wǎng)絡(luò)聊天系統(tǒng)開(kāi)發(fā)與實(shí)現(xiàn)_第5頁(yè)
已閱讀5頁(yè),還剩21頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、.摘要編程語(yǔ)言從機(jī)器語(yǔ)言,匯編語(yǔ)言,再到現(xiàn)在的高級(jí)語(yǔ)言,一步步發(fā)展到現(xiàn)在已經(jīng)形成了一個(gè)完善語(yǔ)言的體系。就像是各個(gè)國(guó)家都有自己的語(yǔ)言一樣,編程語(yǔ)言也有許多不同的語(yǔ)言,而每種語(yǔ)言的出現(xiàn)都是為了迎合不同的需求,也都有自己獨(dú)特的語(yǔ)言魅力,Java也不例外,它的出現(xiàn)迎合了人們對(duì)應(yīng)用程序跨平臺(tái)運(yùn)行的需求。而且Java現(xiàn)在是全球流行的開(kāi)發(fā)工具之一,它擁有了一套龐大且完善的類(lèi)庫(kù),內(nèi)置了其他語(yǔ)言需要靠庫(kù)甚至是操作系統(tǒng)才能支持的功能,擁有一個(gè)虛擬機(jī)。本文在開(kāi)始先對(duì)Java語(yǔ)言做了初步的介紹,即針對(duì)Java的特點(diǎn)做了詳細(xì)的描述,同時(shí)也針對(duì)Java程序的運(yùn)行機(jī)制做了描述;開(kāi)發(fā)環(huán)境做了簡(jiǎn)單的介紹。接下來(lái)是對(duì)編寫(xiě)的軟件的

2、描述,對(duì)Java API的應(yīng)用,對(duì)Java語(yǔ)言的繼承、方法的重寫(xiě)、接口和抽象類(lèi)的使用。 緒論第一章系統(tǒng)開(kāi)發(fā)環(huán)境1.1開(kāi)發(fā)工具1.2應(yīng)用環(huán)境第二章系統(tǒng)需求分析2.1需求分析2.2可行性分析第三章系統(tǒng)概要設(shè)計(jì)3.1設(shè)計(jì)目標(biāo)3.2系統(tǒng)功能模塊第四章系統(tǒng)詳細(xì)設(shè)計(jì)4.1程序設(shè)計(jì)4.2各功能界面截圖第五章系統(tǒng)測(cè)試5.1測(cè)試的意義5.2測(cè)試過(guò)程5.3測(cè)試結(jié)果第六章總結(jié)參考文獻(xiàn)緒論Java語(yǔ)言簡(jiǎn)介Java的發(fā)展和歷史Java的誕生得益于對(duì)家用電器的芯片的研制,開(kāi)始時(shí),開(kāi)發(fā)者想用C+語(yǔ)言來(lái)開(kāi)發(fā)電器的芯片,但是,由于芯片的種類(lèi)各不相同,因此,程序要進(jìn)行多次編譯。尤其是C+中的指針操作,稍有不慎,就會(huì)出現(xiàn)問(wèn)題。程序

3、可以出錯(cuò),但是家用電器不能出錯(cuò)誤,為此,開(kāi)發(fā)者將C+語(yǔ)言進(jìn)行簡(jiǎn)化,去掉指針操作,去掉運(yùn)算符重載,去掉C+中的多繼承,得到了Java語(yǔ)言,將它變成了一種解釋執(zhí)行的語(yǔ)言,并在每個(gè)芯片上裝上一個(gè)Java虛擬機(jī)。剛開(kāi)始時(shí),Java語(yǔ)言被稱為Oak語(yǔ)言(橡樹(shù)語(yǔ)言)Java語(yǔ)言現(xiàn)在逐漸成熟起來(lái),它的類(lèi)也已經(jīng)進(jìn)千個(gè)了,而且還可以通過(guò)第三方購(gòu)買(mǎi)中間件,為Java語(yǔ)言的發(fā)展提供了良好的發(fā)展前景,同時(shí)它也是跨平臺(tái)的語(yǔ)言,因此許多軟件開(kāi)發(fā)商及硬件開(kāi)發(fā)商也爭(zhēng)先恐后地想搭上Java語(yǔ)言的快車(chē),都聲稱支持Java語(yǔ)言,它對(duì)微軟發(fā)起了有力的挑戰(zhàn),而且Sun公司正努力開(kāi)發(fā)Java芯片Java語(yǔ)言的特點(diǎn)Java是一種簡(jiǎn)單的,面

4、向?qū)ο蟮?,分布式的,健壯的,安全的,與平臺(tái)無(wú)關(guān)的,多線程的,高性能的,動(dòng)態(tài)程序設(shè)計(jì)語(yǔ)言。1. 簡(jiǎn)單易學(xué)Java語(yǔ)言雖起源于C+,但是去掉了C+語(yǔ)言中難于掌握的指針操作,內(nèi)存管理非常簡(jiǎn)單,如果要釋放內(nèi)存資源,你僅需要讓其對(duì)象的引用等于null,這樣就使操作變得異常簡(jiǎn)單2. 面向?qū)ο驤ava語(yǔ)言是面向?qū)ο蟮木幊陶Z(yǔ)言。面向?qū)ο蠹夹g(shù)很好的解決了當(dāng)今軟件開(kāi)發(fā)過(guò)程中新出現(xiàn)的種種傳統(tǒng)的面向過(guò)程語(yǔ)言所不能處理的問(wèn)題,包括軟件開(kāi)發(fā)的規(guī)模擴(kuò)大,升級(jí)加快,維護(hù)量增大以及開(kāi)發(fā)分工日益細(xì)化,專(zhuān)業(yè)化和標(biāo)準(zhǔn)化等。面向?qū)ο蠹夹g(shù)的核心是以更接近于人類(lèi)思維的方式建立計(jì)算機(jī)模型,它利用類(lèi)和對(duì)象的機(jī)制將數(shù)據(jù)與其上的操作封裝在一起,并

5、通過(guò)統(tǒng)一的接口與外界交互,是反映現(xiàn)實(shí)世界實(shí)體的個(gè)各類(lèi)在程序中能夠獨(dú)立、自治和繼承。3. 分布式Java包括一個(gè)支持HTTP(超文本傳輸協(xié)議)和FTP(文件傳輸協(xié)議)等基于TCP/IP協(xié)議的子庫(kù),因此,Java應(yīng)用程序可憑借URL(統(tǒng)一資源定位符)打開(kāi)并訪問(wèn)網(wǎng)絡(luò)上的對(duì)象,其訪問(wèn)方式與訪問(wèn)本地文件系統(tǒng)幾乎完全相同。為分布式環(huán)境尤其是Internet提供了動(dòng)態(tài)內(nèi)容,無(wú)疑是一項(xiàng)非常宏達(dá)的工程,但是Java的語(yǔ)法特性可以很容易實(shí)現(xiàn)這項(xiàng)目標(biāo)。4. 健壯性Java致力于檢查程序在編譯和運(yùn)行時(shí)的錯(cuò)誤。類(lèi)型檢查可以檢查出許多開(kāi)發(fā)早期出現(xiàn)的錯(cuò)誤。Java自行操作內(nèi)存,減少了內(nèi)存錯(cuò)誤的可能性。Java還實(shí)現(xiàn)了真數(shù)組

6、,避免了覆蓋數(shù)據(jù)的可能。這些功能特征大大縮短了開(kāi)發(fā)Java應(yīng)用程序的周期。Java提供null指針檢測(cè)數(shù)組邊界,進(jìn)行異常出口字節(jié)代碼校驗(yàn)。5. 安全穩(wěn)定對(duì)網(wǎng)絡(luò)上應(yīng)用程序的另一個(gè)要求是較高的安全可靠性。用戶通過(guò)網(wǎng)絡(luò)獲取并在本地運(yùn)行的應(yīng)用程序必須是可信賴的,不會(huì)充當(dāng)病毒或者其他惡意操作的傳播者而攻擊本地的資源,同時(shí)它還應(yīng)該是穩(wěn)定 的,輕易不會(huì)產(chǎn)生死機(jī)等錯(cuò)誤,使得用戶樂(lè)意使用。6. 平臺(tái)無(wú)關(guān)Java語(yǔ)言獨(dú)特的運(yùn)行機(jī)制使得它具有良好的二進(jìn)制的可移植性,利用Java,開(kāi)發(fā)人員可以編寫(xiě)出與具體平臺(tái)無(wú)關(guān),普遍適用的應(yīng)用程序,大大降低了開(kāi)發(fā)、維護(hù)和管理的開(kāi)銷(xiāo),也就是一次編譯,隨處運(yùn)行。7. 支持多線程多線程是

7、當(dāng)今軟件開(kāi)發(fā)技術(shù)的又一重要成果,已成功應(yīng)用在操作系統(tǒng)和應(yīng)用開(kāi)發(fā)等多個(gè)領(lǐng)域。多線程技術(shù)允許同一個(gè)進(jìn)程有兩個(gè)或兩個(gè)以上的執(zhí)行線索,即同時(shí)做兩件或多件事情,滿足了一些復(fù)雜軟件的需求。Java不但內(nèi)置多線程功能,而且定義了一些用于建立、管理多線程的類(lèi)和方法,使得開(kāi)發(fā)具有多線程功能的程序變得簡(jiǎn)單、容易和有效。8. 高性能如果解釋器的速度快,Java可以在運(yùn)行時(shí)直接將目標(biāo)代碼翻譯成機(jī)器指令。Sun用直接解釋器一秒鐘內(nèi)可調(diào)用300 000個(gè)過(guò)程。翻譯目標(biāo)代碼的速度與C+的性能沒(méi)什么區(qū)別。9. 動(dòng)態(tài)性Java的動(dòng)態(tài)性是其面向?qū)ο笤O(shè)計(jì)方法的擴(kuò)展,它允許程序動(dòng)態(tài)地裝入運(yùn)行過(guò)程中所需要的類(lèi)。Java編譯器將符號(hào)引用

8、信息在字節(jié)碼中保存下來(lái)并傳遞給解釋器嗎,再由解釋器完成動(dòng)態(tài)連接類(lèi)后,將符號(hào)引用信息轉(zhuǎn)換為數(shù)值偏移量。這樣,一個(gè)在存儲(chǔ)器生成的對(duì)象不在編譯過(guò)程中決定,而是延遲到運(yùn)行時(shí)有解釋器確定,這樣對(duì)類(lèi)中的變量和方法進(jìn)行更新時(shí)就不至于影響現(xiàn)存的代碼。解釋執(zhí)行字節(jié)碼時(shí),這種符號(hào)信息的查找和轉(zhuǎn)換過(guò)程進(jìn)在一個(gè)新的名字出現(xiàn)時(shí)才進(jìn)行一次,隨后代碼便可以全速執(zhí)行。在運(yùn)行時(shí)確定引用的好處是可以使用已被更新的類(lèi),而不必?fù)?dān)心會(huì)影響原有的代碼。Java平臺(tái)簡(jiǎn)介1998年12月,Sun發(fā)布了Java2平臺(tái)JDK 1.2,這時(shí)Java發(fā)展是上的里程碑。1999年6月,Sun公司重新組織Java平臺(tái)的集成方法,并將Java企業(yè)級(jí)應(yīng)用平

9、臺(tái)作為發(fā)展方向。2004年,Sun發(fā)布JDK1.5更名為JDK5.0.2006年底,Sun再度推出JDK1.6(JDK6.0)。如今,Java家族也已經(jīng)有四個(gè)主要成員:J2SE(Java 2 Standard Edition)用于工作站、PC機(jī)的Java標(biāo)準(zhǔn)平臺(tái),現(xiàn)改名為JavaSE;J2EE(Java 2 Enterprise Edition)可擴(kuò)展的企業(yè)級(jí)應(yīng)用平臺(tái),現(xiàn)改名為JavaEE;J2ME(Java 2 Micro Edition)嵌入式電子設(shè)備Java應(yīng)用平臺(tái),現(xiàn)改名為JavaME;JavaFX是一種聲明式的靜態(tài)類(lèi)型編程語(yǔ)言,專(zhuān)為喜歡在可視化編程中的Web腳本人員和應(yīng)用程序開(kāi)發(fā)人員

10、量身定做,是Java新成員Java程序的運(yùn)行機(jī)制和Java虛擬機(jī)(JVM)Java語(yǔ)言比較特殊,由Java語(yǔ)言編寫(xiě)的程序需要經(jīng)過(guò)編譯步驟,但是這個(gè)編譯步驟并不會(huì)生成特定平臺(tái)的機(jī)器碼,而是生成一種與平臺(tái)無(wú)關(guān)的字節(jié)碼文件(也就是.class文件)。當(dāng)然,這種字節(jié)碼文件不是可執(zhí)行的,必須使用Java解釋器來(lái)解釋執(zhí)行。因此,我們可以認(rèn)為:Java語(yǔ)言既是編譯型語(yǔ)言,也是解釋型語(yǔ)言。或者說(shuō),Java語(yǔ)言既不是純粹的編譯型語(yǔ)言,也不是純粹的解釋型語(yǔ)言。Java程序的執(zhí)行過(guò)程必須經(jīng)過(guò)先編譯,后解釋兩個(gè)步驟,Java語(yǔ)言里負(fù)責(zé)解釋執(zhí)行字節(jié)碼文件的是Java虛擬機(jī),即JVM(Java Virtual Machi

11、ne)。JVM是可運(yùn)行JAVA字節(jié)碼文件的虛擬計(jì)算機(jī)。所有平臺(tái)的JVM向編譯器提供相同的編譯接口,而編譯器只需要面向虛擬機(jī),生成虛擬機(jī)能理解的代碼,然后由虛擬機(jī)來(lái)解釋執(zhí)行。在一些虛擬機(jī)的實(shí)現(xiàn)中,還會(huì)將虛擬機(jī)代碼轉(zhuǎn)換成特定系統(tǒng)的機(jī)器碼執(zhí)行,從而提高執(zhí)行效率。JVM是一個(gè)抽象的計(jì)算機(jī),和實(shí)際的計(jì)算機(jī)一樣,它具有指令集并使用不同的存儲(chǔ)區(qū)域。它負(fù)責(zé)執(zhí)行指令,還要管理數(shù)據(jù)、內(nèi)存和寄存器Java開(kāi)發(fā)環(huán)境搭建首先進(jìn)行JDK的安裝,下載JDK安裝包解壓后進(jìn)行環(huán)境變量的配置,配置步驟如下:右擊桌面上“我的電腦”圖標(biāo),出現(xiàn)右鍵菜單;單擊“屬性”菜單項(xiàng),出現(xiàn)“系統(tǒng)屬性”或“高級(jí)系統(tǒng)設(shè)置” 對(duì)話框;單擊該對(duì)話框的“高

12、級(jí)”選項(xiàng),出現(xiàn)如圖2所示的對(duì)話框。單擊“環(huán)境變量”按鈕,將看到如圖3所示的“環(huán)境變量”的對(duì)話框,通過(guò)該對(duì)話框可以修改或添加環(huán)境變量。圖2圖3第一章系統(tǒng)開(kāi)發(fā)環(huán)境1.1開(kāi)發(fā)環(huán)境Sun Microsystems公司在推出Java語(yǔ)句的同時(shí),推出了一套開(kāi)發(fā)工具JDK。Sun提供的基于字符模式的Java開(kāi)發(fā)工具包JDK:Java開(kāi)發(fā)工具(JDK)是許多Java專(zhuān)家最初使用的開(kāi)發(fā)環(huán)境。Java是平臺(tái)無(wú)關(guān)的語(yǔ)言是指用Java寫(xiě)的應(yīng)用程序不用修改就可以在不同的軟硬件平臺(tái)上運(yùn)行。Java源程序編寫(xiě)可以借助于記事本,Editplus,UltraEdit等第三方編輯工具。所有的Java文件編輯、編譯、調(diào)試、解釋運(yùn)行

13、都是通過(guò)使用字符命令來(lái)執(zhí)行操作。JDK由一個(gè)標(biāo)準(zhǔn)庫(kù)和一組建立、測(cè)試及建立文檔的Java實(shí)用程序組成。其核心Java API是一些預(yù)定義的類(lèi)庫(kù),開(kāi)發(fā)人員需要使用這些類(lèi)來(lái)訪問(wèn)Java語(yǔ)言的功能。JDK是整個(gè)Java的核心,包括了Java運(yùn)行環(huán)境,一堆Java工具和Java基礎(chǔ)的類(lèi)庫(kù)。不論什么Java應(yīng)用服務(wù)器實(shí)質(zhì)都是內(nèi)置了某個(gè)版本的JDK。因此掌握J(rèn)DK是學(xué)好Java的第一步。JDK里面是Java類(lèi)庫(kù)和Java的語(yǔ)言規(guī)范,它提供的是無(wú)論是用何種開(kāi)發(fā)軟件寫(xiě)java程序都必須用到類(lèi)庫(kù)和java語(yǔ)言規(guī)范,沒(méi)有JDK,你的java程序根本就不能用。最主流的JDK是Sun公司發(fā)布的JDK,除了Sun之外,還

14、有很多公司和組織都開(kāi)發(fā)了自己的JDK,例如IBM公司開(kāi)發(fā)的JDK,BEA公司的Jrocket,還有GNU組織開(kāi)發(fā)的JDK等待,其中IBM的JDK包含的JVM運(yùn)行效率要比Sun的JDK包含的JVM高出許多。而專(zhuān)門(mén)運(yùn)行在X86平臺(tái)的Jrocket在服務(wù)端運(yùn)行效率也要比Sun的JDK好很多。但是不管怎么說(shuō),還是需要把Sun的JDK掌握好。但是在這里我借助的是一個(gè)編程軟件MyEclipse來(lái)完成程序的編寫(xiě)與調(diào)試的1.2應(yīng)用環(huán)境操作系統(tǒng):Windows 7應(yīng)用環(huán)境:JDK 1.6應(yīng)用軟件:Myeclipse第二章系統(tǒng)需求分析2.1需求分析游戲簡(jiǎn)介:游戲中玩家通過(guò)鼠標(biāo)來(lái)移動(dòng)自己的飛機(jī),打掉飛機(jī)或蜜蜂會(huì)獲得

15、分?jǐn)?shù)和獎(jiǎng)勵(lì),打掉一架飛機(jī)獲得5分,打掉一只蜜蜂獲得隨機(jī)獎(jiǎng)勵(lì):一條命或者40次雙倍火力,如果撞上敵機(jī)或蜜蜂,則會(huì)失去生命,同時(shí)雙倍火力清零。每撞到一次就生命值減1,當(dāng)生命值為0時(shí),游戲結(jié)束shoots要滿足以下幾點(diǎn)要求:1. 鼠標(biāo)點(diǎn)擊界面游戲開(kāi)始2. 鼠標(biāo)移出界面游戲暫停再次移入繼續(xù)開(kāi)始3. 飛機(jī)跟隨鼠標(biāo)指針移動(dòng)4. 打掉飛機(jī)就分值增加,打掉蜜蜂就獎(jiǎng)勵(lì)生命值或者雙倍火力2.2可行性分析Shoots游戲是一種簡(jiǎn)單的大眾游戲,在實(shí)現(xiàn)游戲的過(guò)程中你需要對(duì)子彈與敵機(jī)或蜜蜂的碰撞做出判斷,判斷的處理可以由坐標(biāo)的范圍來(lái)完成;如果碰撞就要做刪除處理,通過(guò)記錄碰撞的對(duì)象(對(duì)象是存放在數(shù)組中的)的下標(biāo)可以對(duì)它進(jìn)行

16、刪除操作;以及在它們?cè)浇纾ǔ霎?huà)板范圍的那些敵機(jī)和蜜蜂)后對(duì)它們要?jiǎng)h除;因?yàn)閿硻C(jī)和蜜蜂是不斷生成的,會(huì)越來(lái)越多,而存放它們的是一個(gè)數(shù)組,這個(gè)數(shù)組不是固定的長(zhǎng)度,會(huì)隨著敵機(jī)和蜜蜂的數(shù)量的增加而進(jìn)行擴(kuò)容,所以如果不對(duì)越界的敵機(jī)和蜜蜂進(jìn)行處理,數(shù)組會(huì)越來(lái)越大,從而占有更多的存儲(chǔ)空間,而游戲運(yùn)行也越來(lái)越慢;另外實(shí)現(xiàn)子彈、敵機(jī)和蜜蜂的自動(dòng)移動(dòng),需要對(duì)存放它們的數(shù)組遍歷然后對(duì)每一個(gè)存放的對(duì)象的坐標(biāo)屬性進(jìn)行加減操作;而用鼠標(biāo)來(lái)操作飛機(jī)就需要用到與鼠標(biāo)移動(dòng)相關(guān)的觸發(fā)事件,在鼠標(biāo)的點(diǎn)擊,滑動(dòng),移出面板,移入面板同樣都有與之相關(guān)的鼠標(biāo)事件,通過(guò)這些事件來(lái)實(shí)現(xiàn)暫停,運(yùn)行。選擇使用Java語(yǔ)言,一方面是接觸的多,另一

17、方面是Java是一種跨平臺(tái)的,適合于分布式計(jì)算機(jī)環(huán)境的面向?qū)ο缶幊陶Z(yǔ)言,用Java寫(xiě)的應(yīng)用程序不用修改就可在不同的軟硬件平臺(tái)上運(yùn)行。第三章系統(tǒng)概要設(shè)計(jì)3.1設(shè)計(jì)目標(biāo)可以利用鼠標(biāo)移動(dòng)戰(zhàn)機(jī),鼠標(biāo)移出游戲面板游戲暫停,鼠標(biāo)再次移入游戲面板游戲開(kāi)始,還要隨機(jī)的產(chǎn)生敵機(jī)和蜜蜂,生命值為零結(jié)束游戲。3.2系統(tǒng)功能模塊1.類(lèi)與類(lèi)之間的關(guān)系包括一個(gè)源文件,五個(gè)類(lèi)和兩個(gè)接口圖3.12.java源文件及其功能編號(hào)文件名功能1ShootGame該文件是程序入口,包含main方法和實(shí)現(xiàn)各種具體操作的方法2FlyingObject抽象父類(lèi),將Hero、Airplane、Bee、Bullet中共有的屬性抽出來(lái)放在里面 3

18、Hero 4Airplane表示敵機(jī),繼承FlyingObject類(lèi),實(shí)現(xiàn)Enemy接口,提供移動(dòng)的屬性與方法 5Bee表示蜜蜂,繼承FlyingObject類(lèi),同時(shí)實(shí)現(xiàn)Award接口,提供蜜蜂移動(dòng)的方法 6Bullet表示子彈,繼承FlyingObject類(lèi),提供移動(dòng)的方法 7Enemy表示敵人的接口,提供獲取分?jǐn)?shù)方法 8Award表示獎(jiǎng)勵(lì)的接口,提供獲取獎(jiǎng)勵(lì)類(lèi)型(雙倍活力或生命值)的方法3.數(shù)據(jù)建模:使用一個(gè)數(shù)據(jù)模型,描述對(duì)象的關(guān)系,使用繪圖坐標(biāo)系作為參考模型,英雄機(jī)、敵機(jī)、蜜蜂以及子彈都是矩形區(qū)域,如下圖所示:以英雄機(jī)為例標(biāo)示出數(shù)據(jù)x、y、width以及height所表示的位置。敵機(jī)、蜜

19、蜂、子彈以及英雄機(jī)的這四個(gè)屬性類(lèi)似的第四章系統(tǒng)詳細(xì)設(shè)計(jì)4.1程序設(shè)計(jì)1.主類(lèi)ShootGame(1)成員變量成員變量描述變量類(lèi)型變量名稱面板寬面板高啟動(dòng)狀態(tài)運(yùn)行狀態(tài)暫停狀態(tài)游戲結(jié)束狀態(tài)記錄當(dāng)前狀態(tài)背景圖片開(kāi)始圖片暫停圖片游戲結(jié)束圖片敵機(jī)圖片蜜蜂圖片子彈圖片英雄機(jī)圖片0英雄機(jī)圖片1英雄機(jī)對(duì)象敵人數(shù)組(敵機(jī)+小蜜蜂)子彈數(shù)組定時(shí)器時(shí)間間隔(毫秒)敵人入場(chǎng)計(jì)數(shù)子彈入場(chǎng)計(jì)數(shù)得分int intintintintintint BufferedImage BufferedImage BufferedImage BufferedImage BufferedImage BufferedImage Buffere

20、dImage BufferedImage BufferedImage HeroFlyingObjectBullet Timerint intintint WIDTH HEIGHTSTART RUNNINGPAUSE GAME_OVERstate backgroundstartpausegameoverairplanebeebullethero0hero1hero flyingsbullets timer; intervelflyEnteredIndexshootIndexint score(2)方法方法描述方法名稱隨機(jī)生成敵人對(duì)象敵人入場(chǎng)飛行物走一步子彈入場(chǎng)(英雄機(jī)發(fā)射子彈)所有子彈和所有敵人

21、碰撞一顆子彈和所有敵人碰撞刪除越界的敵人和子彈 檢查游戲結(jié)束啟動(dòng)執(zhí)行重寫(xiě)paint() g:畫(huà)筆畫(huà)狀態(tài)畫(huà)分和畫(huà)命畫(huà)英雄機(jī)對(duì)象畫(huà)敵人對(duì)象畫(huà)子彈對(duì)象 nextOne()enterAction()stepAction()shootAction()bangAction()bang(Bullet b)outOfBoundsAction()checkGameOverAction()action()paint(Graphics g)paintState(Graphics g)paintScore(Graphics g)paintHero(Graphics g)paintFlyingObjects(Graph

22、ics g)paintBullets(Graphics g)2.主類(lèi)ShootGame中的main方法(1).主類(lèi)的main為程序入口,定義了游戲窗口的的大小、居中,點(diǎn)擊右上角“x”關(guān)閉窗口以及設(shè)置窗口的可見(jiàn)性還調(diào)用了啟動(dòng)游戲的方法action()3.抽象父類(lèi)FlyingObject由圖3.1可以分析出英雄機(jī)、敵機(jī)、子彈以及蜜蜂都有x、y、width以及height屬性,因此,將這些屬性抽象到父類(lèi)FlyingObject中。另外,它們?cè)诮缑嫔隙际且詧D片的形式顯示,因此在父類(lèi)FlyingObject中,添加image屬性,表示它們的貼圖;由于蜜蜂和敵機(jī)都可以被子彈擊中,因此在FlyingObje

23、ct類(lèi)中添加shootBy方法,該方法的參數(shù)為子彈類(lèi)型。下圖是以蜜蜂為例,說(shuō)明子彈被擊中的算法。代碼如下:/*敵人被子彈打,this:敵人;bullet:子彈*/public boolean shootBy(Bullet bullet)/找出敵機(jī)的四個(gè)角的坐標(biāo)int x1 = this.x;int x2 = this.x+this.width;int y1 = this.y;int y2 = this.y+this.height;/找出子彈坐標(biāo)int x = bullet.x;int y = bullet.y;return x>x1 && x<x2 &&am

24、p; y>y1 && y<y2;/判斷子彈是否打中敵機(jī)4.接口Enemy實(shí)現(xiàn)該接口的類(lèi)為敵人,如果子彈擊中敵機(jī),英雄機(jī)獲取分?jǐn)?shù),因此該接口提供獲取分?jǐn)?shù)的方法,代碼如下:package shoots;public interface Enemy public int getScore();5.接口Award實(shí)現(xiàn)該接口的類(lèi)表示獎(jiǎng)勵(lì),如果子彈擊中了蜜蜂,英雄機(jī)可以獲取獎(jiǎng)勵(lì),獎(jiǎng)勵(lì)分兩種,可以是雙倍活力或生命值,因此提供獲取獎(jiǎng)勵(lì)類(lèi)型的方法,代碼如下:package shoots;public interface Award public int DOUBLE_FIRE = 0

25、;/火力值public int LIFE = 1;/命/* 獲取獎(jiǎng)勵(lì)類(lèi)型(0為火力;1為命)*/public int getType();6.類(lèi)Airplane,表示敵機(jī)敵機(jī)屬于飛行物,因此繼承FlyingObject類(lèi),重寫(xiě)了父類(lèi)的step方法,實(shí)現(xiàn)Enemy接口,敵機(jī)可以向下移動(dòng),因此有移動(dòng)的速度作為屬性,實(shí)現(xiàn)了敵機(jī)越界的判斷方法,代碼如下:package shoots;public class Airplane extends FlyingObject implements Enemyprivate int speed = 2;public Airplane()image = Shoot

26、Game.airplane;width = image.getWidth();height = image.getHeight();x = (int)(Math.random()*(ShootGame.WIDTH-this.width);y =-this.height;public int getScore()return 5;public void step()y +=speed;public boolean outOfBounds()return y>ShootGame.HEIGHT; 7.類(lèi)Bee,表示蜜蜂繼承FlyingObject,重寫(xiě)了Step方法,實(shí)現(xiàn)Award接口,蜜蜂可

27、以左右和向下移動(dòng),故含有移動(dòng)速度的屬性和越界的判斷,代碼如下:package shoots;import java.util.Random;public class Bee extends FlyingObject implements Awardprivate int xSpeed = 1;private int ySpeed = 2;private int awardType;public Bee()image = ShootGame.bee;width = image.getWidth();height = image.getHeight();Random rand = new Rand

28、om();x = rand.nextInt(ShootGame.WIDTH-this.width);y =-this.height;awardType=rand.nextInt(2);public int getType()return awardType;public void step()x += xSpeed;y += ySpeed;if(x>=ShootGame.WIDTH-this.width)xSpeed = -1;if(x<=0)xSpeed = 1;public boolean outOfBounds()return y>ShootGame.HEIGHT; 8

29、.類(lèi)Bullet,表示子彈繼承FlyingObject,重寫(xiě)了step方法,定義了越界的判斷方法,代碼如下:package shoots;public class Bullet extends FlyingObject private int speed = 3;public Bullet(int x, int y)image = ShootGame.bullet;width = image.getWidth();height = image.getHeight();this.x = x;this.y = y;public void step()y -= speed;public boolea

30、n outOfBounds()return y<-this.height; 9.類(lèi)Hero,表示英雄機(jī)繼承FlyingObject類(lèi),重寫(xiě)step方法,實(shí)現(xiàn)動(dòng)態(tài)的飛行;由于會(huì)發(fā)射子彈擊中蜜蜂,所以可以獲取雙倍火力或生命值,因此該類(lèi)含有雙倍子彈的具體數(shù)量,生命值的數(shù)量;另外該類(lèi)代表的對(duì)象會(huì)和其他對(duì)象相碰撞,所以該類(lèi)中定義了一個(gè)判斷撞擊的方法hit()來(lái)實(shí)現(xiàn)對(duì)撞擊范圍的判斷;還對(duì)越界的判斷返回值固定為false,是一個(gè)boolean的值,表示永不越界;在該類(lèi)中含有一個(gè)構(gòu)造方法用于初始化數(shù)據(jù);moveTo方法用于處理鼠標(biāo)位置:英雄機(jī)的中心點(diǎn);關(guān)鍵代碼是實(shí)現(xiàn)飛機(jī)動(dòng)態(tài)效果和撞擊的判斷:圖示:撞擊的

31、判斷/* 重寫(xiě)step() */public void step() /10毫秒走一次image = imagesindex+/10%images.length; /10*10=100毫秒/* 英雄機(jī)與敵人碰撞檢查 this:英雄機(jī) other:敵人 */public boolean hit(FlyingObject other)int x1=other.x-this.width/2; /x1:蜜蜂的x-1/2英雄機(jī)的寬int x2=other.x+other.width+this.width/2; /x2:蜜蜂的x+蜜蜂的寬+1/2英雄機(jī)的寬int y1=other.y-this.heigh

32、t/2; /y1:蜜蜂的y-1/2英雄機(jī)的高int y2=other.y+other.height+this.height/2;/y2:蜜蜂的y+蜜蜂的高+1/2英雄機(jī)的高int hx=this.x+this.width/2; /hx:英雄機(jī)的x+1/2英雄機(jī)的寬int hy=this.y+this.height/2;/hy:英雄機(jī)的y+1/2英雄機(jī)的高return hx>x1 && hx<x2 && hy>y1 && hy<y2; /hx在x1和x2之間并且hy在y1和y2之間,即為撞上了在Hero中添加shoot方法,

33、實(shí)現(xiàn)發(fā)射子彈,英雄機(jī)發(fā)射子彈位置的計(jì)算如下圖:public Bullet shoot()int xstep = this.width/4;int ystep = 20; if(doubleFire>0)/雙倍火力Bullet bullets = new Bullet2;bullets0 = new Bullet(this.x+xstep,this.y-ystep);bullets1 = new Bullet(this.x+3*xstep,this.y-ystep);doubleFire -= 2;/火力減2return bullets;else /單倍火力Bullet bullets =

34、 new Bullet1;bullets0 = new Bullet(this.x+2*xstep,this.y-ystep);return bullets;10.主類(lèi)ShootGame由于主類(lèi)要實(shí)現(xiàn)畫(huà)板的功能,所以繼承了JPanel,在該類(lèi)中,使用靜態(tài)常量定義面板的寬和高,并使用ImageIO的read方法加載圖片;界面繪制過(guò)程如下:(1).在該類(lèi)中添加FlyingObject類(lèi)型的屬性flyings,用于存儲(chǔ)射擊游戲的所有敵機(jī)和蜜蜂;(2).添加Bullet類(lèi)型的屬性bullet,用于存儲(chǔ)射擊游戲中的所有子彈;(3).添加Hero類(lèi)型的屬性hero,表示英雄機(jī);(4).添加paintHer

35、o方法、paintBullets方法、paintFlyingObject方法,分別用于實(shí)現(xiàn)在面板上畫(huà)英雄機(jī)、子彈、敵機(jī)、蜜蜂;并重寫(xiě)paint方法,在該方法中調(diào)用上述三個(gè)方法;(5).添加構(gòu)造初始化屬性flyings、bullets以及hero;(6).重構(gòu)Airplane類(lèi)Bee類(lèi),設(shè)置固定的x、y坐標(biāo)位置,以便顯示查看。另外在該類(lèi)中定義了許多的方法,關(guān)鍵方法的詳細(xì)功能及實(shí)現(xiàn)如下:1).shootAction()方法,實(shí)現(xiàn)每次調(diào)用20次該方法發(fā)射一次子彈,并將發(fā)射的子彈存儲(chǔ)到bullets數(shù)組中2).bangAction方法和bang方法,這兩個(gè)方法實(shí)現(xiàn)了子彈與飛行物(蜜蜂或敵機(jī))的碰撞檢測(cè)

36、,詳細(xì)過(guò)程如下:(1).循環(huán)遍歷存儲(chǔ)所有子彈的數(shù)組bullets;(2).在上述循環(huán)中,再次使用循環(huán),遍歷存儲(chǔ)所有飛行物的數(shù)組flyings,在該循環(huán)中判斷當(dāng)前子彈是否擊中某個(gè)飛行物,如果擊中則退出循環(huán),記錄被擊中的飛行物在flyings數(shù)組中的索引index;(3).在flyings數(shù)據(jù)中找到該飛行物,并將其移除;(4).判斷該飛行物的類(lèi)型是Emeny還是Award,如果是Enemy類(lèi)型,則獲取加分;如果是Award類(lèi)型,則獲取獎(jiǎng)勵(lì)(5).獲取獎(jiǎng)勵(lì)的類(lèi)型,如果是獎(jiǎng)勵(lì)的類(lèi)型為DOUBLE_FIRE,則獲得40次雙倍活力;如果獎(jiǎng)勵(lì)類(lèi)型是LIFE,則獎(jiǎng)勵(lì)生命值,3).outOfBoundsActi

37、on方法,該方法用于刪除越界飛行物以及子彈,詳細(xì)實(shí)現(xiàn)過(guò)程如下:(1).創(chuàng)建FlyingObject類(lèi)型的數(shù)組flyingLives,用于存儲(chǔ)所有活著的飛行物(蜜蜂和敵機(jī)),即沒(méi)有越界的飛行物;(2).循環(huán)遍歷存儲(chǔ)所有飛行物的數(shù)組flyings,并判斷每一個(gè)飛行物是否越界,將沒(méi)有越界的飛行物放入flyingLives數(shù)組中存儲(chǔ),并記錄不越界飛行物的個(gè)數(shù)index;(3).將flyingLives數(shù)組中的元素,復(fù)制到flyings數(shù)組中,并重新指定flyings數(shù)組的長(zhǎng)度index;(4).刪除子彈與刪除飛行物的過(guò)程類(lèi)似。4).isGameOver方法,該方法用于判斷游戲是否結(jié)束,方法實(shí)現(xiàn)的詳細(xì)過(guò)程如下:(1).循環(huán)遍歷存儲(chǔ)所有飛行物(蜜蜂和敵機(jī))的數(shù)組flyings(2).在循環(huán)中,判斷英雄機(jī)是否與飛行物發(fā)生碰撞,如果發(fā)生碰撞,則減生命值、雙倍火力清零,記錄被撞飛行

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論