基于java的連連看游戲設(shè)計與實現(xiàn)_第1頁
基于java的連連看游戲設(shè)計與實現(xiàn)_第2頁
基于java的連連看游戲設(shè)計與實現(xiàn)_第3頁
基于java的連連看游戲設(shè)計與實現(xiàn)_第4頁
基于java的連連看游戲設(shè)計與實現(xiàn)_第5頁
已閱讀5頁,還剩61頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1緒論1.1手機游戲發(fā)展1.1.1手機游戲現(xiàn)狀手機的便攜性使得手機游戲非常普及,在地鐵、車站和公交車里,我們隨時都可以看到很多人低頭玩著手機游戲。手機已經(jīng)成為越來越多的人生活中不可或缺的一部分,更多的人也漸漸喜歡上了手機游戲。手機游戲的潛在用戶群很龐大,據(jù)工業(yè)部和信息化部運行監(jiān)測協(xié)調(diào)局2008年8月31日發(fā)布的統(tǒng)計顯示,截止2008年7月底,中國的手機用戶數(shù)量超過了6億,而且這個數(shù)字還在飛速地增長。通過上述統(tǒng)計不難看出,手機游戲的潛在市場是相當龐大的。手機游戲開發(fā)技術(shù)門檻很低,而且其開發(fā)平臺一般都是開放的,開發(fā)人員可以從網(wǎng)絡(luò)上獲得很多相關(guān)的技術(shù)資料,如最近很流行的開發(fā)平臺——J2ME平臺,其所有的代碼都是開源的,開發(fā)人員可以方便地查閱其任何相關(guān)資料,而手機廠商也會提供自己品牌的詳細參數(shù)供開發(fā)人員參考。手機游戲的銷售渠道越來越廣,如今國內(nèi)比較有名氣的SP(serviceprovider)有新浪網(wǎng)、空中網(wǎng)以及移動、聯(lián)通等通信商,CP、SP和運營商之間的關(guān)系如圖1-1所示。國內(nèi)的有些手機游戲CP(contentprovider)都通過尋找國外的代理商來推銷游戲,也有很大一部分尋找臺灣代理商(在后面的移植章節(jié)中會具體介紹)。同時還有很多游戲內(nèi)置渠道,包括手機廠商、代理和賣場,如NOKIA的OVI。圖1-1CP、SP和運營商之間的關(guān)系隨著中國3G牌照的發(fā)放,手機游戲CP迅猛發(fā)展起來,手機游戲市場再次呈現(xiàn)出一派朝氣蓬勃的氣象。自2003年中國移動和中國聯(lián)通相繼推出“百寶箱”和“神奇寶典”業(yè)務(wù)以來,國內(nèi)手機游戲市場日漸擴大,尤其是2006年以后,中國移動把手機游戲定位成其戰(zhàn)略性業(yè)務(wù),此舉動讓國內(nèi)當時眾多掙扎在“生死”邊緣的手機游戲CP看到了希望。如今,國內(nèi)手機游戲CP和工作室很多,但是精品游戲卻少之又少,最近移動推出的“精品游戲”平臺給國內(nèi)很多手機游戲CP帶來了生機,同時也帶來了挑戰(zhàn)。此外,越來越多的玩家青睞于手機游戲,將更大地促進手機游戲市場的發(fā)展以及業(yè)務(wù)的不斷擴大。手機游戲包含很多種類,如K-JAVA游戲、Smartphone游戲、BREW游戲和Symbian游戲等,目前,只有K-JAVA游戲和BREW游戲支持付費下載,BREW游戲是聯(lián)通的業(yè)務(wù),K-JAVA游戲是移動的業(yè)務(wù)。由于移動的市場份額遠遠高于聯(lián)通,所以一般提及的手機游戲主要指K-JAVA游戲。2003年9月,中國移動正式推出“百寶箱”業(yè)務(wù),“百寶箱”是指提供給手機上網(wǎng)用戶下載K-JAVA應(yīng)用程序的平臺。當時中國手機游戲的開發(fā)商CP曾一度達到1000多家,目前,移動運營商仍然在手機游戲上占有壟斷地位。手機游戲產(chǎn)業(yè)鏈為:首先由手機游戲CP開發(fā)完成游戲,然后再交給SP代理,其合作方式分為買斷、分成等,SP再把游戲提交給移動運營商來供玩家下載。其銷售額中,移動獲得15%,剩下的由SP與CP分成。手機游戲技術(shù)隨著手機游戲的普及和玩家群的增大,手機游戲開發(fā)技術(shù)也日新月異,總體來說,手機游戲技術(shù)可以分為如下幾類。(1)短信息游戲短信息游戲是相當“古老”的手機游戲,玩家利用手機向某個游戲服務(wù)商提供的固定號碼發(fā)送短信,服務(wù)端經(jīng)過某些操作把結(jié)果發(fā)給玩家,通過反復(fù)這樣的操作完成整個游戲。這種類型的游戲只是通過簡單的互發(fā)短信來實現(xiàn)的,有很大的缺點:一是成本昂貴,每發(fā)送一條短信需要1毛錢,如象棋類游戲,玩完整個游戲需要“很多資金”支持;二是界面不(2)嵌入式游戲某些游戲在出廠時就固化在芯片中,如NOKIA的貪吃蛇、飛行射擊等都屬于此類游戲,但是玩家并不能安裝其他游戲,導(dǎo)致其失去了“優(yōu)勢”。(3)wap游戲當手機擁有瀏覽器后,wap游戲開始興盛起來。wap其實就是一個簡化的Web,它專門為移動小型設(shè)備提供上網(wǎng)載體,wap游戲的玩法為玩家通過瀏覽器登錄某個游戲廠商提供的地址,瀏覽其中的一個或多個頁面,并選擇其中指定的菜單或文字,提交給游戲服務(wù)端,然后通過游戲服務(wù)端的反饋信息提示繼續(xù)下面的游戲。雖然wap游戲相對于短信息服務(wù)有很大的提高,如界面比較友好、支持的游戲種類比較多、價格也比較便宜,但是其游戲性不足,而且在某些國家很少有手機使用wap,所以此類游戲也在逐漸退出市場。(4)編譯語言類游戲C++屬于編譯語言,此類語言把程序代碼編譯成設(shè)備代碼執(zhí)行,用其制作的游戲提供了很好的控制界面,而且運行速度很快。但編譯語言類游戲一般都在Series60設(shè)備上開發(fā),這是其局限性的表現(xiàn)。此外還有PPC手機系統(tǒng)上的游戲也屬于此類。(5)解釋語言類游戲Java屬于解釋語言,在手機中的應(yīng)用為J2ME,即專門提供給移動小型設(shè)備使用的Java語言。如今大部分手機都支持Java類游戲,其游戲制作周期短,有很友好的玩家界面、操作控制和游戲性,并且可以通過無線網(wǎng)絡(luò)進行網(wǎng)絡(luò)游戲。由于現(xiàn)在Java手機很普及,所以J2ME成為很流行的手機游戲編程語言之一。這也是本書主要介紹的編程語言。手機游戲開發(fā)的特點手機游戲開發(fā)和傳統(tǒng)的游戲開發(fā)有很大的區(qū)別,其中包括絕對的優(yōu)勢,但也有很多不利的方面。(1)優(yōu)點手機游戲開發(fā)團隊人數(shù)很少,一般只需要3~6個人就可以完成,甚至一款手機游戲的策劃和編程可以是一個人,這在一些小公司是比較常見的。而PC游戲的開發(fā)通常需要十幾個人的開發(fā)團隊。另外,手機游戲的開發(fā)周期和預(yù)算都比較少,而且銷售渠道也很方便。PC游戲的開發(fā)周期一般是1~3年,而手機游戲一般在幾個月甚至一個月內(nèi)就可以完成,并且其預(yù)算通常只是PC游戲的一個零頭。手機游戲一般都可以通過手機無線設(shè)備下載到手機中,或者通過數(shù)據(jù)線把計算機中的手機游戲傳到手機上。因此,手機游戲的銷售渠道很多,而且簡單。通過上述比較,可以發(fā)現(xiàn)手機游戲比PC游戲有更大的吸引力。另外,手機游戲擁有PC游戲無法比擬的龐大用戶群,據(jù)統(tǒng)計,全球有10億部手機正在使用,并且這個數(shù)字還在不斷增加,而且其便攜性也是PC游戲不能媲美的,玩家可以隨時隨地玩手機游戲,而不必受場所的限制。(2)缺點手機游戲也有其缺點,如屏幕尺寸小、游戲時間短、操作簡單以及顯示效果粗糙等。另外,手機本身內(nèi)存的限制使得游戲的大小受到很大的影響,也影響了游戲的時間和顯示效果,實際上這主要取決于手機廠商和移動運營商的規(guī)定。現(xiàn)在很多智能手機的內(nèi)存限制很小,一款比較不錯的智能手機可以運行幾兆的游戲。一般的手機鍵盤只包括10個數(shù)字鍵及*、#等操作鍵,相對于PC上的鍵盤來說簡直是太少了,雖然現(xiàn)在有部分手機的鍵盤仿照PC鍵盤設(shè)計,但是鍵盤狹小也限制了玩家的流暢操作。1.1.2開發(fā)手機游戲的Java技術(shù)Java概述美國硅谷有一句行話,每10年~15年有一次輪回。最近的一次輪回就是從Java開始。Java是一個由Sun公司開發(fā)的一種可以撰寫跨平臺應(yīng)用軟件的面向?qū)ο蟮男乱淮幊陶Z言。使用它可在各式各樣不同種機器、不同種操作平臺的網(wǎng)絡(luò)環(huán)境中開發(fā)軟件。不論你使用的是哪一種WWW瀏覽器,哪一種計算機,哪一種操作系統(tǒng),只要WWW瀏覽器上面注明了“支持Java”,你就可以看到生動的主頁。Java自面世后就非常流行,發(fā)展迅速,對C++語言形成了有力沖擊。Java技術(shù)具有卓越的通用性、高效性、平臺移植性和安全性,廣泛應(yīng)用于個人PC、數(shù)據(jù)中心、游戲控制臺、科學(xué)超級計算機、移動電話和互聯(lián)網(wǎng),同時擁有全球最大的開發(fā)者專業(yè)社群。在全球云計算和移動互聯(lián)網(wǎng)的產(chǎn)業(yè)環(huán)境下,Java更具備了顯著優(yōu)勢和廣闊前景。Java正在逐步成為Internet應(yīng)用的主要開發(fā)語言。它徹底改變了應(yīng)用軟件的開發(fā)模式,帶來了自PC機以來又一次技術(shù)革命,為迅速發(fā)展的信息世界增添了新的活力。Java帶來的影響:Java雖出現(xiàn)的時間不長,但已被業(yè)界接受,IBM、Apple、DEC、Adobe、SiliconGraphics、HP、Oracle、Toshiba、Netscap和Microsoft等大公司已經(jīng)購買了Java的許可證。Microsoft還在其Web瀏覽器Explorer3.0版中增加了對Java的支持。另外,眾多的軟件開發(fā)商也開發(fā)了許多支持Java的軟件產(chǎn)品。在以網(wǎng)絡(luò)為中心的計算時代,不支持HTML和Java,就意味著應(yīng)用程序的應(yīng)用范圍只能限于同質(zhì)的環(huán)境。Java的出現(xiàn)是計算機信息交換的一個重要里程碑。在單機時代,程序進程之間靠共享存儲進行變量交換;在網(wǎng)絡(luò)時代,運行在不同宿主機上的程序按網(wǎng)絡(luò)協(xié)議進行無格式的消息(二進制字符流)交換,消息的語義由交換程序雙方維護;在Java時代,運行在網(wǎng)絡(luò)上的程序進程交換的是小應(yīng)用程序(applet)。小應(yīng)用程序是什么?它是一個對象,由一組屬性和方法構(gòu)成,是一個可執(zhí)行的實體;不僅有數(shù)據(jù)的狀態(tài),而且有定義在數(shù)據(jù)上的操作。未來可能進行代表(Agent)交換,代理有一定的智能性,那便是信息交換的更高級階段。Java主要由以下部分組成:(1)Java模擬器Java手機游戲模擬器主要針對諾基亞S60系列手機以及其他大屏手機(小屏游戲也可運行,但不能全屏顯示),是一款非常簡單而且實用的JAVA游戲模擬器,可以正常運行絕大部分JAVA手機游戲!注:暫不支持游戲后綴名為sis的游戲。程序的使用是傻瓜式的,在電腦上安裝好以后,所有的游戲jar文件都會和模擬器相關(guān)連,直接雙擊游戲jar文件就可以進入模擬器玩游戲啦!電腦的小數(shù)字鍵盤和方向鍵就可以直接控制游戲,與模擬器的按鍵相對應(yīng),當然也可以用鼠標直接點擊控制。(2)虛擬機Java虛擬機(JavaVirtualMachine)簡稱JVMJava虛擬機是一個想象中的機器,在實際的計算機上通過軟件模擬來實現(xiàn)。Java虛擬機有自己想象中的硬件,如處理器、堆棧、寄存器等,還具有相應(yīng)的指令系統(tǒng)。引入Java語言虛擬機后,Java語言在不同平臺上運行時不需要重新編譯。Java語言使用模式Java虛擬機屏蔽了與具體平臺相關(guān)的信息,使得Java語言編譯程序只需生成在Java虛擬機上運行的目標代碼(字節(jié)碼),就可以在多種平臺上不加修改地運行。Java虛擬機在執(zhí)行字節(jié)碼時,把字節(jié)碼解釋成具體平臺上的機器指令執(zhí)行。(3)內(nèi)存模型在處理器層面上,內(nèi)存模型定義了一個充要條件,“讓當前的處理器可以看到其他處理器寫入到內(nèi)存的數(shù)據(jù)”以及“其他處理器可以看到當前處理器寫入到內(nèi)存的數(shù)據(jù)”。有些處理器有很強的內(nèi)存模型,能夠讓所有的處理器在任何時候任何指定的內(nèi)存地址上都可以看到完全相同的值。而另外一些處理器則有較弱的內(nèi)存模型,在這種處理器中,必須使用內(nèi)存屏障(一種特殊的指令)來刷新本地處理器緩存并使本地處理器緩存無效,目的是為了讓當前處理器能夠看到其他處理器的寫操作或者讓其他處理器能看到當前處理器的寫操作。這些內(nèi)存屏障通常在lock和unlock操作的時候完成。內(nèi)存屏障在高級語言中對程序員是不可見的。Java的特點(1)Java的主要特點Java語言有下面一些特點:簡單、面向?qū)ο蟆⒎植际健⒔忉寛?zhí)行、魯棒、安全、體系結(jié)構(gòu)中立、可移植、高性能及多線程。①.簡單性:Java語言是一種面向?qū)ο蟮恼Z言,它通過提供最基本的方法來完成指定的任務(wù),只需理解一些基本的概念,就可以用它編寫出適合于各種情況的應(yīng)用程序。②.面向?qū)ο螅篔ava語言的設(shè)計集中于對象及其接口,它提供了簡單的類機制以及動態(tài)的接口模型。對象中封裝了它的狀態(tài)變量以及相應(yīng)的方法,實現(xiàn)了模塊化和信息隱藏;而類則提供了一類對象的原型,并且通過繼承機制,子類可以使用父類所提供的方法,實現(xiàn)了代碼的復(fù)用。③.分布性:Java是面向網(wǎng)絡(luò)的語言。通過它提供的類庫可以處理TCP/IP協(xié)議,用戶可以通過URL地址在網(wǎng)絡(luò)上很方便地訪問其它對象。④.魯棒性:Java在編譯和運行程序時,都要對可能出現(xiàn)的問題進行檢查,以消除錯誤的產(chǎn)生。它提供自動垃圾收集來進行內(nèi)存管理,防止程序員在管理內(nèi)存時容易產(chǎn)生的錯誤。另外,Java在編譯時還可捕獲類型聲明中的許多常見錯誤,防止動態(tài)運行時不匹配問題的出現(xiàn)。⑤.安全性:用于網(wǎng)絡(luò)、分布環(huán)境下的Java必須要防止病毒的入侵。Java不支持指針,一切對內(nèi)存的訪問都必須通過對象的實例變量來實現(xiàn),這樣就防止程序員使用“特洛伊”木馬等欺騙手段訪問對象的私有成員,同時也避免了指針操作中容易產(chǎn)生的錯誤。⑥.體系結(jié)構(gòu)中立:Java解釋器生成與體系結(jié)構(gòu)無關(guān)的字節(jié)碼指令,只要安裝了Java運行時系統(tǒng),Java程序就可在任意的處理器上運行。⑦.可移植性:與平臺無關(guān)的特性使Java程序可以方便地被移植到網(wǎng)絡(luò)上的不同機器。同時,Java的類庫中也實現(xiàn)了與不同平臺的接口,使這些類庫可以移植。另外,Java編譯器是由Java語言實現(xiàn)的,Java運行時系統(tǒng)由標準C實現(xiàn),這使得Java系統(tǒng)本身也具有可移植性。⑧.解釋執(zhí)行:Java解釋器直接對Java字節(jié)碼進行解釋執(zhí)行。字節(jié)碼本身攜帶了許多編譯時信息,使得連接過程更加簡單。⑨.高性能:和其它解釋執(zhí)行的語言如BASIC不同,Java字節(jié)碼的設(shè)計使之能很容易地直接轉(zhuǎn)換成對應(yīng)于特定CPU的機器碼,從而得到較高的性能。⑩.多線程:多線程機制使應(yīng)用程序能夠并行執(zhí)行,而且同步機制保證了對共享數(shù)據(jù)的正確操作。通過使用多線程,程序設(shè)計者可以分別用不同的線程完成特定的行為,而不需要采用全局的事件循環(huán)機制,這樣就很容易地實現(xiàn)網(wǎng)絡(luò)上的實時交互行為。(2)JavaAppletJava語言的特性使它可以最大限度地利用網(wǎng)絡(luò)。Applet是Java的小應(yīng)用程序,它是動態(tài)、安全、跨平臺的網(wǎng)絡(luò)應(yīng)用程序。JavaApplet嵌入HTML語言,通過主頁發(fā)布到Internet。網(wǎng)絡(luò)用戶訪問服務(wù)器的Applet時,這些Applet從網(wǎng)絡(luò)上進行傳輸,然后在支持Java的瀏覽器中運行。由于Java語言的安全機制,用戶一旦載入Applet,就可以放心地來生成多媒體的用戶界面或完成復(fù)雜的計算而不必擔(dān)心病毒的入侵。(3)豐富的類庫Java提供了大量的類以滿足網(wǎng)絡(luò)化、多線程、面向?qū)ο笙到y(tǒng)的需要。①.語言包提供的支持包括字符串處理、多線程處理、例外處理、數(shù)學(xué)函數(shù)處理等,可以用它簡單地實現(xiàn)Java程序的運行平臺。②.實用程序包提供的支持包括哈希表、堆棧、可變數(shù)組、時間和日期等。③.輸入輸出包用統(tǒng)一的"流"模型來實現(xiàn)所有格式的I/O,包括文件系統(tǒng)、網(wǎng)絡(luò)、輸入等。④.低級網(wǎng)絡(luò)包用于實現(xiàn)Socket編程。⑤.抽象圖形用戶接口包實現(xiàn)了不同平臺的計算機的圖形用戶接口部件,包括窗口、菜單、滾動條、對話框等,使得Java可以移植到不同平臺的機器。⑥.網(wǎng)絡(luò)包支持Internet的TCP/IP協(xié)議,提供了與In-ternet的接口。它支持URL連接,WWW的即時訪問,并且簡化了用戶/服務(wù)器模型的程序設(shè)計。(4)Java和C、C++對于變量聲明、參數(shù)傳遞、操作符、流控制等,Java使用了和C、C++相同的傳統(tǒng),使得熟悉C、C++的程序員能很方便地進行編程。同時,Java為了實現(xiàn)其簡單、魯棒、安全等特性,也摒棄了C和C++中許多不合理的內(nèi)容。如:①.全局變量:Java程序中,不能在所有類之外定義全局變量,只能通過在一個類中定義公用、靜態(tài)的變量來實現(xiàn)一個全局變量。②.Goto:Java不支持C、C++中的goto語句,而是通過例外處理語句try,Catch,final等來代替C、C++中用goto來處理遇到錯誤時跳轉(zhuǎn)的情況,使程序更可讀且更結(jié)構(gòu)化。③.指針:指針是C、C++中最靈活,也是最容易產(chǎn)生錯誤的數(shù)據(jù)類型。Java對指針進行完全的控制,程序員不能直接進行任何指針操作,例如把整數(shù)轉(zhuǎn)化為指針,或者通過指針釋放某一內(nèi)存地址等。同時,數(shù)組作為類在Java中實現(xiàn),良好地解決了數(shù)組訪問越界這一C、C++中不作檢查的錯誤。④.內(nèi)存管理:在Java中,所有的數(shù)據(jù)結(jié)構(gòu)都是對象,通過運算符new為它們分配內(nèi)存堆。通過new得到對象的處理權(quán),而實際分配給對象的內(nèi)存可能隨程序運行而改變,Java對此自動地進行管理并且進行垃圾收集,有效防止了由于程序員的誤操作而導(dǎo)致的錯誤,并且更好地利用了系統(tǒng)資源。⑤.數(shù)據(jù)類型的支持:在Java中,對于這些數(shù)據(jù)類型總是分配固定長度的位數(shù),如對int型,它總占32位,這就保證了Java的平臺無關(guān)性。Java開發(fā)優(yōu)勢與傳統(tǒng)程序不同,Sun公司在推出Java之際就將其作為一種開放的技術(shù)。全球數(shù)以萬計的Java開發(fā)公司被要求所設(shè)計的Java軟件必須相互兼容?!癑ava語言靠群體的力量而非公司的力量”是Sun公司的口號之一,并獲得了廣大軟件開發(fā)商的認同。這與微軟公司所倡導(dǎo)的注重精英和封閉式的模式完全不同。Sun公司對Java編程語言的解釋是:Java

編程語言是個簡單、面向?qū)ο蟆⒎植际?、解釋性、健壯、安全與系統(tǒng)無關(guān)、可移植、高性能、多線程和動態(tài)的語言。Java平臺是基于Java語言的平臺。這樣的平臺非常流行。因此微軟公司推出了與之競爭的.NET平臺以及模仿Java的C#語言。Java是功能完善的通用程序設(shè)計語言,可以用來開發(fā)可靠的、要求嚴格的應(yīng)用程序。語言特征Java編程語言的風(fēng)格十分接近C語言、C++語言。Java是一個純粹的面向?qū)ο蟮某绦蛟O(shè)計語言,它繼承了C++語言面向?qū)ο蠹夹g(shù)的核心。Java舍棄了C語言中容易引起錯誤的指針(以引用取代)、運算符重載(operatoroverloading)、多重繼承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的對象所占據(jù)的內(nèi)存空間,使得程序員不用再為內(nèi)存管理而擔(dān)憂。在Java1.5版本中,Java又引入了泛型編程(GenericProgramming)、類型安全的枚舉、不定長參數(shù)和自動裝/拆箱等語言特性。Java不同于一般的編譯執(zhí)行計算機語言和解釋執(zhí)行計算機語言。它首先將源代碼編譯成二進制字節(jié)碼(bytecode),然后依賴各種不同平臺上的虛擬機來解釋執(zhí)行字節(jié)碼。從而實現(xiàn)了“一次編譯、到處執(zhí)行”的跨平臺特性。不過,每次的執(zhí)行編譯后的字節(jié)碼需要消耗一定的時間,這同時也在一定程度上降低了Java程序的性能。編輯Java源代碼可以使用任何無格式的純文本編輯器,在Windows操作系統(tǒng)上可以使用微軟記事本(Notepad)、EditPlus等程序,在Linux平臺上可使用vi工具等。在記事本中輸入如下代碼:PublicclassHellowWorld{//Java程序的入口方法,程序?qū)倪@里開始執(zhí)行Publicstaticvoidmain(String[]args){//向程序臺打印一條語句System.out.println(“Helloworld”);}}編輯上面的Java文件時,注意程序中粗體字標識的單詞,Java程序嚴格區(qū)分大小寫。將上面文本保存為HelloWorld.Java,該文件就是Java程序的源程序。編寫好Java程序的源代碼后,接下來應(yīng)該編譯該Java源文件來生成字節(jié)碼了。發(fā)展前景自從Sun被甲骨文收購以后,Java的發(fā)展前景就變得撲朔迷離起來,很多程序開發(fā)者都感到很迷惑。2010年4月9日,被稱為Java之父的詹姆斯·高斯林又在個人博客上宣布離開Oracle,這一事件更為Java的前景增加了一層迷霧。但是在進入5月份之后,一切開始變得明朗起來。在Oracle的活動發(fā)布網(wǎng)站上,連續(xù)發(fā)布了多個關(guān)于Java的推廣活動。5月12日,Oracle主要產(chǎn)品負責(zé)人DaveHofert將大談對JavaSE商業(yè)應(yīng)用的改進和革新。根據(jù)宣傳資料,在這次演講中,DaveHofert將提到以下問題:商業(yè)版與社區(qū)版本之間平臺支持的差異。如何獲得專家?guī)椭?,以幫助企業(yè)增強其Java應(yīng)用。對于舊版本的安全修補問題??墒褂玫陌l(fā)布工具和更新。6月18、19、20、27日,將分別在赫爾辛基、斯圖加特、布達佩斯、倫敦舉行Oracle、Sun專家與用戶見面會,在見面會上與用戶一起探討Java的發(fā)展路線。主要討論的問題包括Oracle將如何繼續(xù)投資和改進Java技術(shù),并且還會向用戶通報JavaSE、JavaME專家團隊的最新消息、JavaFX和JDK7最新的消息,以及OracleBerkeleyDB的相關(guān)信息。5月3日,已經(jīng)離開Oracle近一個月的Java之父詹姆斯·高斯林在他的博客上表達了對NetBeans6.9和FX1.3發(fā)布的關(guān)心。這兩個項目最新版本的發(fā)布,可以證明Oracle已經(jīng)開始兌現(xiàn)當初的承諾。詹姆斯·高斯林在其早期的博客中,也透露了不會放棄Java事業(yè),只是需要解決一些與Oracle之間的法律問題。這一切跡象表明,Oracle絕對不會輕易放棄Java這塊巨大的蛋糕,并且Oracle也開始逐漸學(xué)會了對開源社區(qū)的尊重。首先在JDK的商業(yè)版本方面,Oracle將會繼續(xù)深入挖掘Java的商業(yè)利益,與其固有產(chǎn)品進行更深入的整合。在社區(qū)版本方面,Oracle將與Java開發(fā)者一起探討和研發(fā)Java的技術(shù)。這里需要特別提到的一個產(chǎn)品是OracleBerkeleyDB,該產(chǎn)品是Oracle一直支持的一個開源非關(guān)系數(shù)據(jù)庫產(chǎn)品,在NoSQL大行其道的今天,如果Oracle能夠?qū)erkeleyDB與Java進行深入整合,將會為Java帶來更多的活力和生命。從詹姆斯·高斯林的表現(xiàn)來看,他似乎與Oracle之間已經(jīng)達成某種諒解,并且有進一步合作的可能性。1.2.6貢獻及影響1991年,Sun公司的JamesGosling,BillJoe等人,為電視、控制烤面包機等家用電器的交互操作開發(fā)了一個Oak(橡樹)軟件,他是Java的前身。當時,Oak并沒有引起人們的注意,直到1994年,隨著互聯(lián)網(wǎng)和3W的飛速發(fā)展,他們用Java編制了HotJava瀏覽器,得到了Sun公司首席執(zhí)行官ScottMcNealy的支持,得以研發(fā)和發(fā)展。由于Oak商標已經(jīng)被OakTechnology注冊,1995年Oak短暫更名為Green,最后更名為Java。Java的得名還有段小插曲呢,一天,Java小組成員正在喝咖啡時,議論給新語言起個什么名字的問題,有人提議用Java(Java是印度尼西亞盛產(chǎn)咖啡的一個島嶼),這個提議得到了其他成員的贊同,于是就采用Java來命名此新語言。很快Java被工業(yè)界認可,許多大公司如IBMMicrosoft.DEC等購買了Java的使用權(quán),并被美國雜志PCMagazine評為1995年十大優(yōu)秀科技產(chǎn)品。從此,開始了Java應(yīng)用的新篇章。Java的誕生是對傳統(tǒng)計算機模式的挑戰(zhàn),對計算機軟件開發(fā)和軟件產(chǎn)業(yè)都產(chǎn)生了深遠的影響:(1)軟件4A目標要求軟件能達到任何人在任何地方在任何時間對任何電子設(shè)備都能應(yīng)用。這樣能滿足軟件平臺上互相操作,具有可伸縮性和重用性并可即插即用等分布式計算模式的需求。(2)基于構(gòu)建開發(fā)方法的崛起,引出了CORBA國際標準軟件體系結(jié)構(gòu)和多層應(yīng)用體系框架。在此基礎(chǔ)上形成了Java.2平臺和.NET平臺兩大派系,推動了整個IT業(yè)的發(fā)展。(3)對軟件產(chǎn)業(yè)和工業(yè)企業(yè)都產(chǎn)生了深遠的影響,軟件從以開發(fā)為中心轉(zhuǎn)到了以服務(wù)為中心。中間提供商,構(gòu)件提供商,服務(wù)器軟件以及咨詢服務(wù)商出現(xiàn)。企業(yè)必須重塑自我,B2B的電子商務(wù)將帶動整個新經(jīng)濟市場,使企業(yè)獲得新的價值,新的增長,新的商機,新的管理。(4)對軟件開發(fā)帶來了新的革命,重視使用第三方構(gòu)件集成,利用平臺的基礎(chǔ)設(shè)施服務(wù),實現(xiàn)開發(fā)各個階段的重要技術(shù),重視開發(fā)團隊的組織和文化理念,協(xié)作,創(chuàng)作,責(zé)任,誠信是人才的基本素質(zhì)。1.3論文結(jié)構(gòu)安排第一章是對項目開發(fā)的背景介紹,從手機游戲和Java的發(fā)展兩方面來展開;第二章是對游戲開發(fā)前一些可行性論證以及需求進行分析;第三章是具體對各個模塊進行分析與實現(xiàn);第四章對項目進行測試論證以及出現(xiàn)的問題;最后是結(jié)論概括。1.4本章小結(jié)本章首先通過對手機游戲的簡單介紹引導(dǎo)讀者走入手機游戲世界,并簡單介紹其發(fā)展和產(chǎn)業(yè)的現(xiàn)狀,最后講解了目前比較流行的手機游戲類型。希望讀者通過閱讀本章能夠?qū)κ謾C游戲這個行業(yè)有更深的了解,也希望讀者能更加熟悉游戲行業(yè),甚至整個游戲產(chǎn)業(yè)。其中的手機游戲技術(shù)簡單地介紹了現(xiàn)今手機游戲產(chǎn)業(yè)中使用的技術(shù),對讀者的學(xué)習(xí)起到提示作用。本章還講解了Java語言的基礎(chǔ)部分,其中包括Java語言基本規(guī)則、對象、數(shù)組應(yīng)用、文件操作和Java語言編程規(guī)范。有一定語言基礎(chǔ)的讀者通過閱讀本章內(nèi)容就可以對此語言有簡單的了解,其實所有的語言邏輯結(jié)構(gòu)都是一樣的,只要掌握了一種語言的基本規(guī)則和語法,就可以根據(jù)需求編寫出可用的代碼。

2大體設(shè)計思路2.1項目設(shè)計與方法2.1.1連連看游戲概述當今社會,休閑型游戲越來越得到人們的喜愛,我們所做的設(shè)計實例“連連看游戲的設(shè)計與實現(xiàn)”是近幾年來網(wǎng)絡(luò)上非常流行的一種二維休閑游戲,它對電腦配置要求不高,娛樂性強,易于上手。此次設(shè)計所使用的語言為Java,開發(fā)環(huán)境為JCreator。主要應(yīng)用到Swing組件,Java小程序,事件及接口等。這些接口為游戲的制作提供了便捷的條件,本系統(tǒng)的主要特點就是運用Swing組件和事件處理技術(shù),進行界面的繪制,鼠標的操作,以及積分的顯示等功能。這次通過連連看的設(shè)計開發(fā)將對理解Swing組件技術(shù)以及事件處理技術(shù)在游戲方面的應(yīng)用起到很大的幫助作用,同時為掌握Java編程技術(shù)及二維休閑游戲設(shè)計的一般方法打下堅實的基礎(chǔ)。隨著Flash應(yīng)用的流行,網(wǎng)上出現(xiàn)了多種在線Flash版本“連連看”。如“水晶連連看”、“果蔬連連看”等,流行的“水晶連連看”以華麗界面吸引了一大批的女性玩家。不管走到哪個網(wǎng)頁游戲網(wǎng)站,連連看游戲總是排在受玩家歡迎排名的前5位,休閑、趣味、益智是連連看玩不厭的精華,且不分男女老少、工薪白領(lǐng),是一款適合大眾的經(jīng)典網(wǎng)絡(luò)休閑小游戲2.2游戲設(shè)計的目的通過本次畢業(yè)設(shè)計,讓我們掌握如何制作一個游戲軟件,以及制作游戲軟件的整個流程,制作游戲軟件的步驟,讓學(xué)生熟悉項目開發(fā)的完整過程,為即將到來的就業(yè)工作打下基礎(chǔ)。另外也通過本次設(shè)計將三年來所學(xué)的專業(yè)知識和其他方面的知識融入到實際應(yīng)用中,在實際運用中學(xué)習(xí)和掌握Java程序開發(fā)的全過程,進一步熟悉掌握Java程序設(shè)計語言的基礎(chǔ)內(nèi)容、基本技能和方法,同時培養(yǎng)學(xué)生進行分析問題、解決問題的能力;培養(yǎng)學(xué)生進行設(shè)計分析、設(shè)計方法、設(shè)計操作與測試、設(shè)計過程的觀察、理解和歸納能力的提高。(1)主要是能通過開發(fā)“連連看”這個小游戲,學(xué)會Java程序開發(fā)的環(huán)境搭建與配置,并提高自己Java程序設(shè)計編程的實際能力。通過這次。(2)進一步熟悉掌握Java程序設(shè)計的基礎(chǔ)內(nèi)容,如用戶圖形界面設(shè)計(GUI)、Java多線程編程等。(3)大體了解怎樣用Java來編寫小游戲,增強我們實踐能力和創(chuàng)新精神的綜合培養(yǎng)。2.3游戲可行性論證“連連看”游戲是一個經(jīng)典的游戲,它因操作簡單、娛樂性強而廣受歡迎。我們通過所學(xué)的JAVA,利用MyEclipse設(shè)計一個操作簡單、界面美觀、功能齊全的“連連看游戲”。通過本游戲的開發(fā),達到學(xué)習(xí)Java技術(shù)和熟悉軟件開發(fā)流程的目的。這個游戲是用圖形界面實現(xiàn)的,通過編譯解釋后,出現(xiàn)一個圖形界面。界面上方有一行菜單欄,點擊菜單欄上的按鈕,出現(xiàn)下拉菜單,選擇開始,進入游戲界面,游戲界面是由若干個小方格組成的,每個小方格有一個圖標,點擊其中相同的圖標,若它們符合算法要求就會消失,且游戲期間有一定的時間限制。游戲還設(shè)有炸彈、退出、幫助的功能,方便游戲操作。2.4方案選擇在概要設(shè)計階段,主要有兩中方案可供選擇:(1)所有的圖片都是按約定好的種類數(shù)和在同一區(qū)域的重復(fù)次數(shù)隨機出現(xiàn),并且每張圖片的的出現(xiàn)次數(shù)為偶數(shù),時間會有限制,每一關(guān)的圖片數(shù)量或種方案的設(shè)計思想,時間是不同的,這樣就增加了游戲的難度。(2)在同一區(qū)域中,圖片出現(xiàn)的種類數(shù)和重復(fù)次數(shù)是可以由玩家選擇的,時間由游戲約定。不過玩家選擇的種類數(shù)和重復(fù)次數(shù)必須是偶數(shù)才可以順利完成游戲,否則游戲雖然可以正常運行,但無法完成游戲。在第一種方案中,由于出現(xiàn)的圖像按種類數(shù)和重復(fù)次數(shù)都由軟件約定,這樣就缺乏玩家自主選擇的空間,只是在玩系統(tǒng)已經(jīng)是設(shè)定好的游戲,不能改變什么,這樣就在無意中降低了玩家在游戲的過程中樂趣,最后致使玩家放棄繼續(xù)玩下去。我們參考了網(wǎng)絡(luò)上的連連看游戲,考慮到游戲的娛樂性。所以我們放棄第一種方案的設(shè)計思想,參考網(wǎng)絡(luò)上流行的連連看的游戲,設(shè)計出第2種方案。2.5主要問題開始制作游戲時,主要解決的問題有以下幾個方面:(1)如何設(shè)置整個游戲的界面。(2)如何控制連連看游戲中隨機圖片的生成切每種圖片必須為偶數(shù)個;游戲開始后,判斷鼠標兩次點擊的圖片能否消去,即圖片是否相同且圖片之間路徑的判斷。(3)如何判斷游戲是否結(jié)束以及輸贏的問題。2.6項目設(shè)計內(nèi)容游戲規(guī)則是模仿網(wǎng)絡(luò)上普通的連連看游戲,主要是鼠標兩次點擊的圖片能否消去的問題。當前,前提是點擊兩張相同的圖片,若點擊的是同一張圖片或者兩張不同的圖片,則不予處理。在兩張想同圖片所能連通的所有路徑中,如果存在一條轉(zhuǎn)彎點不多于兩個的路徑,就可以消去;如果沒有,則不予處理。該游戲由若干張不同的圖片組成,游戲開始將會隨機組合圖片,在規(guī)則下點擊兩張相同的圖片后圖片將會消失。圖片全部消完為游戲成功。游戲還將設(shè)置退出,再來一局的按鈕,并實現(xiàn)該功能,方便用戶進行操作。該游戲?qū)⒂腥缦聝?nèi)容:(1)游戲計時功能游戲會記錄從開始到結(jié)束所用的時間,并作為歷史記錄方便玩家下一次突破。(2)刷新功能在游戲界面中沒有可以相消的圖片時,重新排列剩余圖片達到可以消除的目的。(3)提示功能在玩家找不到可選擇的相消圖片時,游戲可提示一組選擇。(4)演示功能對于第一次使用還不熟悉的玩家,游戲?qū)⑻峁┭菔?,自動消除。?)等級選擇功能游戲設(shè)有1-7和隨機等幾個等級,為了滿足不同玩家對不同游戲難度的需求。連連看是運用JCreator中的多文檔視圖開發(fā)的,文檔——視圖結(jié)構(gòu)提供的應(yīng)用程序接口有利于進行窗口操作、文件讀取等編程。連連看游戲引擎包含在視圖類中。游戲引擎是一個抽象的概念,用于實現(xiàn)游戲的邏輯功能,通常在一個獨立的類中,有時引擎和視圖是一體的,并且可能無可避免,因為視圖需要為引擎處理用戶輸入和繪圖。游戲程序設(shè)計一般都采用面向?qū)ο蟮脑O(shè)計模式,提供了一個簡單的圖像顯示接口,利用多文檔視圖結(jié)構(gòu)的面向?qū)ο笤O(shè)計模式。2.7理論基礎(chǔ)(1)、熟悉JAVA語言基礎(chǔ)(2)、GUI編程GUI是GraphicalUserInterface的縮寫,圖形化用戶界面布局管理FlowLayout(流式布局管理器)從左到右的順序排列。BorderLayout(邊界布局管理器)東,南,西,北,中GridLayout(網(wǎng)格布局管理器)事件處理機制事件:用戶對組件的一個操作。事件源:發(fā)生事件的組件。監(jiān)聽器:我們需要處理某個事件,就需要在發(fā)生事件的組件上添加監(jiān)聽器;事件處理器:監(jiān)聽器中的方法。監(jiān)聽器被添加在組件上之后,組件上發(fā)生了對應(yīng)事件就會執(zhí)行指定方法。動作事件,ActionEvent,在某一組件上發(fā)生了定義好的動作,例如按鈕上鼠標點擊或按空格,菜單上鼠標點擊或按回車等。(3)MyEclipse的操作。2.8開發(fā)目標系統(tǒng)能夠提供友好的用戶界面,使操作人員的心情放松;系統(tǒng)具有良好的運行效率,能夠得到快速發(fā)現(xiàn)自我的目的;系統(tǒng)應(yīng)有良好的可擴充性,可以容易的轉(zhuǎn)入其它系統(tǒng)應(yīng)用;平臺的設(shè)計具有一定的靈活性。2.9本章小結(jié)這一章介紹了連連看應(yīng)該具備的功能模塊,了解了什么是連連看,當前連連看系統(tǒng)的系統(tǒng),還有一個連連看系統(tǒng)應(yīng)該的開發(fā)目標。通過本次畢業(yè)設(shè)計,讓我們掌握如何制作一個游戲軟件,以及制作游戲軟件的整個流程,制作游戲軟件的步驟,讓學(xué)生熟悉項目開發(fā)的完整過程,為即將到來的就業(yè)工作打下基礎(chǔ)。另外也通過本次設(shè)計將三年來所學(xué)的專業(yè)知識和其他方面的知識融入到實際應(yīng)用中,在實際運用中學(xué)習(xí)和掌握Java程序開發(fā)的全過程,進一步熟悉掌握Java程序設(shè)計語言的基礎(chǔ)內(nèi)容、基本技能和方法,同時培養(yǎng)學(xué)生進行分析問題、解決問題的能力;培養(yǎng)學(xué)生進行設(shè)計分析、設(shè)計方法、設(shè)計操作與測試、設(shè)計過程的觀察、理解和歸納能力的提高。(1)主要是能通過開發(fā)“連連看”這個小游戲,學(xué)會Java程序開發(fā)的環(huán)境搭建與配置,并提高自己Java程序設(shè)計編程的實際能力。(2)進一步熟悉掌握Java程序設(shè)計的基礎(chǔ)內(nèi)容,如用戶圖形界面設(shè)計(GUI)、Java多線程編程等。(3)大體了解怎樣用Java來編寫小游戲,增強我們實踐能力和創(chuàng)新精神的綜合培養(yǎng)。

3具體實現(xiàn)方法3連連看游戲的設(shè)計這一章將介紹連連看游戲的設(shè)計,從游戲需求分析開始,介紹開發(fā)環(huán)境和用到的開發(fā)工具,系統(tǒng)主要的功能設(shè)計,系統(tǒng)的數(shù)據(jù)流程圖。3.1系統(tǒng)需求分析連連看游戲的設(shè)計目標為:(1)該游戲開始前,將設(shè)置一個用戶登錄注冊界面,如果沒有注冊的玩家在按下“注冊”按鈕后將進入注冊界面,玩家需要填寫用戶名,密碼,性別等信息完成注冊,再進入登錄界面,輸入用戶名和密碼按下“確定”后就將進入游戲界面,開始游戲。(2)游戲中將有“退出”功能,選擇退出命令后程序?qū)⒔K止執(zhí)行,關(guān)閉窗口。還將有“再來一局”功能,選擇再來一局命令后程序?qū)D片重新排列,重新開始游戲。該游戲還有一個時間倒計時的進度條,提醒玩家剩余的時間,增加游戲的難度。在界面的頂部有計分功能,當玩家消去圖片后就會贏得相應(yīng)的分數(shù)。3.2系統(tǒng)開發(fā)及運行環(huán)境硬件平臺:CPU:P41.8GHz。內(nèi)存:256MB以上。軟件平臺:操作系統(tǒng):WindowsXP。數(shù)據(jù)庫:MySQL5.0。開發(fā)工具包:JDKVersion1.6.2。JSP服務(wù)器:Tomcat6.0。瀏覽器:IE5.0,推薦使用IE6.0。3.3系統(tǒng)主要功能要求本系統(tǒng)針對中小學(xué)生的娛樂時間,通過程序中的線程、布局以及用戶登錄還有另外的一些功能進行有效管理。本系統(tǒng)主要實現(xiàn)如下功能:系統(tǒng)采用圖片連連看的方式,界面美觀友好,用戶使用靈活、方便、快捷、準確,數(shù)據(jù)存儲安全可靠。實現(xiàn)圖片的消除、排列清晰。計分自動完成,提高工作效率。實現(xiàn)多條件查詢。可方便快捷地進行下一盤游戲,并且兩盤的分數(shù)在規(guī)定的時間內(nèi)會疊加起來。操作員可以隨時退出游戲。系統(tǒng)最大限度地實現(xiàn)了易維護性和易操作性。系統(tǒng)運行穩(wěn)定、安全可靠。3.4連連看系統(tǒng)總體結(jié)構(gòu)連連看是基于Java基本知識設(shè)置的一個小游戲,剛開始的時候有一個用戶登陸界面,要是沒有賬號的可以先申請一個。最中間有連連看的主體構(gòu)成——連連看圖片,上面有計分、時間條,下面有退出、再來一局按鍵。一個標準的連連看系統(tǒng)應(yīng)該包括以下幾大功結(jié)構(gòu):(1)鼠標操作模塊;(2)圖像處理模塊;(3)聲音信息模塊;(4)菜單模塊;(5)界面顯示模塊。3.5游戲的設(shè)計3.5.1功能設(shè)計(1)、用戶可以通過點擊菜單中的“開始游戲”選項,開始新游戲程序。程序會載入圖片,并通過特定的算法排列圖片,并標記圖片,以便判斷圖片是否相同。記錄圖片坐標,以方便計算圖片是否可以相連。確定圖片大小,以確定用戶點擊的是那張圖片。(2)、用戶選擇兩張一樣的圖片,通過鼠標進行選取,如果用戶兩次點擊的圖片不相同,那么系統(tǒng)認為用戶沒有點(鼠標記數(shù)歸0),以完成用戶以后的選取工作。如果用戶選擇的是相同的圖片,那么系統(tǒng)會消除這兩張圖片,并使鼠標記數(shù)為0,并消除這兩張圖片的標記,使里面的圖片被標記在外面。以便用戶可以進行以后的選擇。(3)、用戶也可使通過使用“刷新”功能進行圖片重新排版。(4)、用戶點擊提示系統(tǒng)將通過連線,提示用戶下一步可消除的圖片(5)、用戶點擊演示,系統(tǒng)自動完成游戲3.5.2游戲模塊設(shè)計根據(jù)對“連連看”游戲的分析,該游戲可分為三個模塊:算法模塊、界面顯示模塊、菜單控制模塊。如下圖3-1所示:圖3-1游戲流程模塊圖3.5.3算法模塊(1).圖片路徑處理設(shè)計這里實質(zhì)上是一種遞歸的思想,要判斷圖片A與圖片B能否通過一條有N個轉(zhuǎn)角的路徑相連,可以轉(zhuǎn)化為判斷能否找到圖片C,C與A能直線相連,且C與B能用一條有N-1個轉(zhuǎn)角的路徑相連。若這樣的圖片C存在,那么A與B就可以通過一條有N個轉(zhuǎn)角的路徑相連。根據(jù)轉(zhuǎn)角數(shù)不得超過2個的規(guī)則,我們可以分為轉(zhuǎn)角數(shù)分別為0個、1個、2個這三種情況分別討論。①0轉(zhuǎn)角連通(直線連通):兩個圖片的縱坐標或橫坐標相等,且兩者連線間沒有其他圖案阻隔。②一個轉(zhuǎn)角連通:其實相當于兩個圖片的橫向與縱向的直線相交只有一個焦點。圖3-2一個轉(zhuǎn)角連通③兩個轉(zhuǎn)角連通:判斷圖片A與圖片B能否經(jīng)過有兩個轉(zhuǎn)角的路徑連通實質(zhì)上可以轉(zhuǎn)化為判斷能否找到一個點C,這個C點與A可以直線連通,且C與B可以通過有兩個轉(zhuǎn)角的路徑連通。若能找到這樣一個C點,那么A與B就可以經(jīng)過有兩個轉(zhuǎn)角的路徑連通。判斷是否經(jīng)兩個轉(zhuǎn)角連通的算法需要做兩個方向上的掃描:水平掃描和垂直掃描。水平判斷。如下圖所示,為了判斷A,B能否通過2個轉(zhuǎn)角連通,則從A開始在水平方向上向左右掃描,并判斷經(jīng)過的點能否與B點經(jīng)過1個轉(zhuǎn)角連通。顯然C點能與B點經(jīng)1個轉(zhuǎn)角連通,故A,B能經(jīng)2個轉(zhuǎn)角連通。圖3-3兩個轉(zhuǎn)角連通的判斷垂直判斷。如下圖所示,為了判斷A,B能否通過2個轉(zhuǎn)角連通,則從A開始在垂直方向上下掃描,并判斷經(jīng)過的點能否與B點經(jīng)過1個轉(zhuǎn)角連通。顯然C點能與B點經(jīng)1個轉(zhuǎn)角連通,故A,B能經(jīng)2個轉(zhuǎn)角連通。圖3-4兩個轉(zhuǎn)角連通的判斷(2).獲取圖片位置設(shè)計首先,最基本的就是用button代替圖片進行布局了,然后將圖片set到button用來做背景圖片。這里采用最簡單的方法——數(shù)組。考慮到圖片是多行多列的格式。所以采用二維數(shù)組(數(shù)組名為game_grid[][]方式來控制比較直觀,并且為了程序容易解讀,統(tǒng)一在不同過程中用名為i和j的變量來分別表示行列。程序開始時給數(shù)組中的各個元素賦初值為0,即表示沒有圖片。然后數(shù)組控制整個游戲區(qū)域,游戲區(qū)域最外圍為空白區(qū)域,即相關(guān)元素的值為0。這樣就可以保證游戲剛開始后,第二層顯示的圖片之間的相連路徑處理時就沒有阻礙了。這個游戲考慮到玩家對圖片的愛好不同,故可以自由修改。將數(shù)組game_grid

的數(shù)據(jù)與圖片名匹配(如:game_grid的數(shù)據(jù)為1~25則圖片名為1,2...25與之一一對應(yīng)),玩家則只需要將自己喜歡的圖片改變圖片名字去替換就可以了。

其button背景圖片的方法是用ImageIcon來存儲圖片信息然后set到button中。3.5.4界面顯示模塊(1).游戲界面設(shè)計(2).游戲過關(guān)、失敗的設(shè)計3.5.5菜單控制模塊(1).開始游戲(2).重新開始(3).刷新(4).提示(5).演示(6).游戲難度選擇如下圖3-5所示難度選擇游戲關(guān)于開始開始演示判斷是否滿足要求否難度選擇游戲關(guān)于開始開始演示判斷是否滿足要求否是消除圖片刷新提示全部消除游戲結(jié)束圖3-5菜單控制模塊3.5.6地圖設(shè)計地圖的設(shè)計是采用GUI編程的網(wǎng)格布局,定義一個八行八列的網(wǎng)格布局,使用16個數(shù)字然后隨機產(chǎn)生四個數(shù)字,用二維數(shù)組把它們打亂放到八行八列的網(wǎng)格布局中,注意的是二維數(shù)組的下標要和網(wǎng)格布局是的行、列數(shù)相同。3.5.7算法設(shè)計在檢驗兩個方塊能否消掉的時候,我們要讓兩個方塊同時滿足兩個條件才行,就是兩者配對并且連線成功。分3種情況:從下面的這三種情況,我們可以知道,需要三個檢測,這三個檢測分別檢測一條直路經(jīng)。這樣就會有三條路經(jīng)。若這三條路經(jīng)上都是空按鈕,那么就剛好是三種直線(兩個轉(zhuǎn)彎點)把兩個按鈕連接起來了。(1)、相鄰(2)、若不相鄰的先在第一個按鈕的同行找一個空按鈕。1.找到后看第二個按鈕橫向到這個空按鈕所在的列是否有按鈕。2.沒有的話再看第一個按鈕到與它同行的那個空按鈕之間是否有按鈕。3.沒有的話,再從與第一個按鈕同行的那個空按鈕豎向到與第二個按鈕的同行看是否有按鈕。沒有的話路經(jīng)就通了可以消了.(3)、若(2)失敗后,再在第一個按鈕的同列找一個空按鈕。1.找到后看第二個按鈕豎向到這個空按鈕所在的行是否有按鈕2.沒有的話,再看第一個按鈕到與它同列的那個空按鈕之間是否有按鈕。3.沒有的話,再從與第一個按鈕同列的那個空按鈕橫向到與第二個按鈕同列看是否有按鈕。沒有的話路經(jīng)就通了,可以消了。若以上三步都失敗,說明這兩個按鈕不可以消去。具體判斷流程見下圖 圖3-6判斷流程

(4)、圖片成對加載并打亂將圖片成對的顯示在場景中,并打亂主要用的是Map類。在該類中,用了一個數(shù)組以數(shù)字標記的形式來記錄加載的圖片是哪種圖片,在每次加載圖片的時候是一張圖片連續(xù)加載兩次,以保證加載圖片成對。然后用數(shù)組的隨機方法將數(shù)組打亂。(5)、判斷兩圖是否能夠相連兩圖能相連的所有情況如圖3-7:圖3-7兩圖可連情況示例3.5.8類的設(shè)計在設(shè)計連連看小游戲是,要編寫6個Java源文件:Control.Java,LoadAndSave.Java,Model.Java,GamePanel.Java,ImageLoader.Java,MainFrame.Java(1)Control.Java監(jiān)聽器類。主要用于接收用戶操作時發(fā)出的指令以及中轉(zhuǎn)發(fā)送。如圖3-8所示圖3-8Control.Java監(jiān)聽類(2)LoadAndSave.Java游戲數(shù)據(jù)部分。主要用于存儲用戶得分情況,以及載入時加載圖片的算法(3)Model.Java驅(qū)動類。用于處理接收到的用戶動作指令,以及初始化時用到的一切算法。如:設(shè)置游戲難度,圖片可消除判斷等。(4)GamePanel.Java繪制類。用于游戲是繪制選中時的邊框,和連接兩個相同圖片的連線。 publicvoidshowPath(finalObjectobj){ newThread(newRunnable(){ ArrayList<Point>points=(ArrayList<Point>)obj; ArrayList<Shape>shapes=newArrayList<Shape>(); intstep=30; publicvoidrun(){ //添加起點矩形 shapes.add(matrixToRect(points.get(0))); //添加終點矩形 shapes.add(matrixToRect(points.get(points.size()-1))); //添加直線 for(inti=1;i<points.size();i++){ Pointp1=getCenter(matrixToRect(points.get(i-1))); Pointp2=getCenter(matrixToRect(points.get(i))); if(p1.x==p2.x){ intdistance=p2.y-p1.y; for(intj=0;j<=Math.abs(distance);j+=step) shapes.add(newLine2D.Double(p1,newPoint(p1.x, p1.y+distance/Math.abs(distance)*j))); }elseif(p1.y==p2.y){ intdistance=p2.x-p1.x; for(intj=0;j<=Math.abs(distance);j+=step) shapes .add(newLine2D.Double(p1,newPoint( p1.x+distance /Math.abs(distance)*j, p1.y))); } shapes.add(newLine2D.Double(p1,p2)); } Graphics2Dg2=(Graphics2D)getGraphics(); floatdash[]={4F}; g2.setStroke(newBasicStroke(2.0F,BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER,11.0F,dash,1.0F)); for(intindex=0;index<shapes.size();index++){ try{ Thread.sleep(10); }catch(InterruptedExceptione){ e.printStackTrace(); } for(intpre=0;pre<=index;pre++){ if(pre<2) g2.setColor(Color.BLUE); else g2.setColor(Color.RED); g2.draw(shapes.get(pre)); } } } }).start(); }}效果如圖3-9:圖3-9連線效果圖(4)ImageLoader.Java圖片加載器。用于加載庫中的圖片。(5)MainFrame.Java主窗體繪制。所有游戲中可見窗體的繪制。項目層次結(jié)構(gòu)如圖3-10:圖3-10項目層次結(jié)構(gòu)3.5.9算法設(shè)計(1)圖片消除算法 for(inti=0;i<map.length;i++) for(intj=0;j<map[0].length;j++){ Rectanglerect=matrixToRect(i,j); if(map[i][j]==0) continue; g.drawImage(ImageLoader.getImageOf(map[i][j]), rect.x,rect.y,null); } (2)圖片加載算法publicclassImageLoader{ privatestaticBufferedImagecursorImage; privatestaticBufferedImageicon; privatestaticfinalBufferedImage[]images=newBufferedImage[Model.CARD_NUMBERS+1]; publicstaticBufferedImagegetCursorImage(){ if(cursorImage==null) //獲得圖片的編號 try{ URLClassLoaderurlLoader=(URLClassLoader)ImageLoader.class.getClassLoader(); URLurl=urlLoader.findResource("images/cursor.gif"); cursorImage=ImageIO.read(url); }catch(Exceptione){ e.printStackTrace(); } returncursorImage; } publicstaticBufferedImagegetIconImage(){ if(icon==null) //加載圖標 try{ URLClassLoaderurlLoader=(URLClassLoader)ImageLoader.class.getClassLoader(); URLurl=urlLoader.findResource("images/QQ.png"); icon=ImageIO.read(url); }catch(Exceptione){ e.printStackTrace(); } returnicon; } publicstaticBufferedImagegetImageOf(intindex){ if(images[index]==null) //在已編號處加載圖片 try{ URLClassLoaderurlLoader=(URLClassLoader)ImageLoader.class.getClassLoader(); URLurl=urlLoader.findResource("images/"+index+".gif"); images[index]=ImageIO.read(url); }catch(IOExceptione){ e.printStackTrace(); } returnimages[index]; }}3.6本章小結(jié)本章在前面分析的基礎(chǔ)上實現(xiàn)了連連看游戲的設(shè)計,實現(xiàn)了連連看游戲的背景顯示功能、菜單功能、以及連連看游戲中的核心算法。在菜單功能模塊中針對每個菜單的命令進行了詳細的解釋和闡釋實現(xiàn)了每一個子菜單的命令。在連接算法中,給出了每一個算法的程序邏輯了和詳細的算法實現(xiàn)。并且還繪制出了每一種連接情況的具體圖片。在連連看游戲的其他算法中列出了時間進度顯示的實現(xiàn)方法和一些重要的數(shù)據(jù)結(jié)構(gòu),在此可以結(jié)合程序詳細的研究。

4運行結(jié)果及論證4游戲運行及測試分析4.1程序運行情況點擊菜單中的開始游戲后的界面,連連看游戲規(guī)則很簡單,就是點中兩個互相匹配并且可以通過不多于兩個折點的折線連相同的圖片,然后消去。下圖是開始游戲后的界面效果選擇游戲難度(圖)點擊開始,開始當前難度游戲,如果不選擇難度,則難度1到9隨機點擊刷新則所有圖片隨機改變位置其總數(shù)不變。提示,可以根據(jù)算法隨機提示一組可以消去的圖片。點擊演示,電腦將自動完成消除,每一步都有邊框以及連線顯示,直到所有方塊消除完畢圖片由用戶消除完畢,則如下圖顯示由于用戶每次只能消除一對圖形,即只會用到一個最短路徑,但由于實現(xiàn)并不知道用戶會選擇哪一對圖形,所以需要事先計算出所有可能的最短路徑并保存起來。此外,采用這種方法的話似乎每次用戶消去一對相同圖像之后都需要重新計算出當前所有可能被連接的相同圖形之間最短路徑,這是因為當某些圖像被消去之后可能會產(chǎn)生很多新路徑,而我們又不能確定這些空出來的格子到底能夠影響哪些路徑,所以就只好都重新計算一遍。4.2測試計劃及分析4.2.1檢驗的先后順序在檢驗兩個方塊能否消掉的時候,我們要讓兩個方塊同時滿足兩個條件才行,就是兩者配對并且連線成功。所以,這里應(yīng)該先檢驗配對,如果該條件不成立的話,就不要再進行連線檢查了,這樣可以避免很多不必要的復(fù)雜運算。當然,如果你在做這個游戲的時候,配對規(guī)則不夠如此簡單的話,那么就看哪個算起來麻煩就把它放在后面。4.2.2程序異常處理本程序沒有涉及到程序的異常處理,只有關(guān)于“死鎖”問題,本質(zhì)上還是判別兩個格子是否可以消去的問題。最直接的方法就是,對于游戲中尚未消去的格子,兩兩都計算一下,它們是否可以消去。此外,從上面的廣度優(yōu)先搜索可以看出,我們每次都是擴展出起始格子A(x1,y1)能夠到達的格子。也就是說,對于每一個格子,我們可以調(diào)用一次上面的擴展過程,得到所有可以到達的格子,如果這些格子中有任意一個跟起始格子的圖形一致,則它們可以消去,目前游戲我還沒有發(fā)現(xiàn)“死鎖”狀態(tài)。

總結(jié)“連連看”游戲的基本功能都已經(jīng)實現(xiàn)了,其中很多變量之間數(shù)據(jù)的傳遞都很復(fù)雜,要搞不明白就沒辦法再往下做了,路徑判斷問題中用到數(shù)據(jù)結(jié)構(gòu)的知識,也很抽象,代碼量也很大,另外這個游戲不會用到數(shù)據(jù)庫,所用功能也很少,只需要判斷用戶每次鼠標點擊的坐標以及當前坐標位置代表的圖片內(nèi)容就好了通過這次“連連看”游戲的設(shè)計使我懂得了理論與實際相結(jié)合是很重要的,只有理論知識是遠遠不夠的,只有把所學(xué)的理論知識與實踐相結(jié)合起來,從理論中得出結(jié)論,才能真正的提高自己的水平,從而提高自己的實際動手能力和獨立思考的能力。在設(shè)計的過程中遇到問題,可以說得是困難重重,并且還發(fā)現(xiàn)了自己的許多不足之處,對以前所學(xué)過的知識理解得不夠深刻,掌握得不夠牢固。同時在這次的設(shè)計中也小小的體驗了一下做項目的感受,我完成了這次Java項目設(shè)計,不過這只是我學(xué)習(xí)路上的驛站。我相信我在未來的學(xué)習(xí)中會記住從本次項目設(shè)計中所學(xué)到的東西,并將它用到未來的學(xué)習(xí)中去。致謝

致謝彈指一揮間,大學(xué)四年已經(jīng)接近了尾聲。四年的艱苦跋涉,幾個月的精心準備,畢業(yè)設(shè)計終于到了劃句號的時候,心頭照例該如釋重負,但創(chuàng)作過程中常常出現(xiàn)的輾轉(zhuǎn)反側(cè)和力不從心之感卻揮之不去。畢業(yè)設(shè)計創(chuàng)作的過程并不輕松:各種壓力的時時襲擾,知識積累的尚欠火候,致使我一次次埋頭于圖書館中,一次次在深夜奮力敲打鍵盤。第一次花費如此長的時間和如此多的精力,完成一套設(shè)計作品,其中的艱辛與困難難以訴說,但曲終幕落后留下的滋味,是值得我一生慢慢品嘗的。在這里需要的感謝的人很多,是他們讓我這大學(xué)四年從知識到人格上有了一個全新的改變。四年間,每次走進通信系都會讓我感受到一種親切熱情的氛圍。無論是學(xué)習(xí)、工作生活上的問題,恩師們都會悉心給以指導(dǎo)解答,讓我倍受感動。也就是在這里,給我的大學(xué)生涯設(shè)計點上了第一個逗號。我的學(xué)術(shù)論文創(chuàng)作的開始,也是從這里起步的。從某種意義上可以說,今日的畢業(yè)論文(設(shè)計)其實從大一時已經(jīng)開始了。通信系的老師們,給我四年的學(xué)習(xí)、成長創(chuàng)造了一個良好的環(huán)境,引導(dǎo)我充分利用學(xué)校的學(xué)習(xí)資源,去發(fā)展、充實自我,而不曾虛度光陰。在此,我真誠的向你們道一聲:“謝謝!”。

感謝我的指導(dǎo)老師王鵬老師,夠順利完成畢業(yè)設(shè)計,離不開他的悉心指導(dǎo),他對我的設(shè)計從確定題目、修改直到完成,給予了我許多的指點和幫助。感謝他在繁忙的工作之余,擠出時間對設(shè)計提出精辟的修改意見。在此,向王老師致以最誠摯的謝意。最后我也要感謝我的母校河北工程大學(xué)四年來對我的培養(yǎng)。以及所有教給我知識的老師們祝你們工作順利、身體健康!祝母校的明天越來越美好!參考文獻

參考文獻[1]張明新,周耿烈.Java語言程序設(shè)計.重慶:重慶大學(xué)出版社,2004.[2]周曉聰,李文軍,李師賢.面向?qū)ο蟪绦蛟O(shè)計與Java語言.北京:機械工業(yè)出版社,2004.[3]BruceEckel.Java編程思想.北京:機械工業(yè)出版社,2007.[4]JamesCohoon,JackDavidson.Java程序設(shè)計.北京:清華大學(xué)出版社,2005.[5]StevenHolzner.Java技術(shù)內(nèi)幕.北京:機械工業(yè)出版社,2002.[6]張洪斌.Java程序設(shè)計百事通.北京:清華大學(xué)出版社,2001.[7]夏先波.JavaJDK實例寶典.北京:電子工業(yè)出版社,2007.[8]吳其慶.Java程序設(shè)計經(jīng)典教程.北京:冶金工業(yè)出版社,2005.[9]耿祥義,張躍平.Java2實用教程.北京:清華大學(xué)出版社,2007.[10]蔡勇,姜磊,馬寧,倪文志.Java2程序設(shè)計基礎(chǔ)教程與上機指導(dǎo).北京:清華大學(xué)出版社,2005.[11]林建素,孟康健.《Eclipse開發(fā)學(xué)習(xí)筆記》(第1版).北京:電子工業(yè)出版社.2008.4[12]李松林,陳華清,任鑫.《Eclipse寶典》(第1版).北京:電子工業(yè)出版社.2007.[14]BruceEckel.Java編程思想.北京:機械工業(yè)出版社,2007.[15]JamesCohoon,JackDavidson.Java程序設(shè)計.北京:清華大學(xué)出版社,2005.[16]StevenHolzner.Java技術(shù)內(nèi)幕.北京:機械工業(yè)出版社,2002.[3](美)KarlAvedal,DannyAyers,TimothyBriggs.JSP編程指南[M].電子工業(yè)出版社,2004,47-125.[17](美)MarkLinsenbardt.JSP在數(shù)據(jù)庫中的應(yīng)用與開發(fā)[M].希望電子出版社,2005,210-236.[18]DiannePhelan,Buildingasimplewebdatabaseapplication[C].IEEEInternationalProfessionalCommunicationConference,2004,79-86.[19](美)KarlAvedal,DannyAyers,TimothyBriggs.JSP編程指南[M].電子工業(yè)出版社,2006,47-125.[20]DiannePhelan,Buildingasimplewebdatabaseapplication[C].IEEEInternationalProfessionalCommunicationConference,2005,79-86.[21]Altendorf.Eric,Hohman.Moses,Zabicki.Roman.UsingJ2EEonalarge,web-basedproject[J].IEEESoftware.2002,19(02):81-89.附錄附錄(程序)Modelpackagemodel;importJava.awt.Point;importJava.util.ArrayList;importJava.util.Observable;importJava.util.Random;publicclassModelextendsObservable{ publicstaticfinalintCARD_NUMBERS=44; privateintlevel; privateintrows=11,cols=19; privateint[][]data; privatePointsltMatrix; privatePointcorner1,corner2; privatelongstartTime; privatebooleanbPlaying; privateintleave; privateinttotal; privateinthistoryRecord; privateThreadt; privateThreaddemoThread; //privateintnSolution; publicModel(){ loadSet(); t=newThread(newRunnable(){ publicvoidrun(){ while(true){ synchronized(t){ if(!bPlaying){ try{ t.wait(); }catch(InterruptedExceptione){ e.printStackTrace(); } } try{ t.wait(500); }catch(InterruptedExceptione){ e.printStackTrace(); } notifyTimer(); } } } }); t.start(); restartGame(); } privatevoidloadSet(){ frameLocation=LoadAndSave.loadLocation(); level=LoadAndSave.loadLevel(); } publicvoidcancelSelect(){ sltMatrix=null; updateAll(); } privatebooleancanDelete(Pointp1,Pointp2){ if(p1.equals(p2)||data[p1.x][p1.y]!=data[p2.x][p2.y]||data[p1.x][p1.y]==0||data[p2.x][p2.y]==0)returnfalse; corner1=null; corner2=null; returnnoCorner(p1,p2)||oneCorner(p1,p2)||twoCorner(p1,p2); } publicvoidclickMatrix(Pointp){ if(p.x<0||p.y<0||p.x>=rows||p.y>=cols||!bPlaying)return; if(isEmpty(p))return; if(null==sltMatrix){ sltMatrix=p; } elseif(canDelete(sltMatrix,p)){ delete(sltMatrix,p,true); sltMatrix=null; } else{ sltMatrix=p; } if(leave==0){ bPlaying=false; LoadAndSave.saveRecord(total,getSeconds()); notifyFinished(); if(getSeconds()<historyRecord){ notifyBreakRecord(); historyRecord=getSeconds(); } } if(solutionCount()==0){ refresh(); } updateAll(); } privatevoidnotifyBreakRecord(){ setChanged(); notifyObservers("breakrecord"); } privatevoidnotifyNoSolution(){ setChanged(); notifyObservers("nosolution"); } privatevoidnotifyDemoFinished(){ setChanged(); notifyObservers("demofinished"); } privatevoidnotifyFinished(){ setChanged(); notifyObservers("finished"); } privatevoiddelete(Pointp){ data[p.x][p.y]=0; leave--; updateAll(); } privatevoiddelete(Pointp1,finalPointp2,booleanbDelete){ //if(noCorner(p1,p2)) ArrayList<Point>points=newArrayList<Point>(); if(corner1==null){ points.add(p1); points.add(p2); //notifyEffect(points); } elseif(corner2==null){ //ArrayList<Point>points=newArrayList<Point>(); points.add(p1); points.add(corner1); points.add(p2); //notifyEffect(points); } else{ //ArrayList<Point>points=newArrayList<Point>(); if(p1.x!=corner1.x&&p1.y!=corner1.y){ Pointpt=corner1; corner1=corner2; corner2=pt; } points.add(p1); points.add(corner1); points.add(corner2); points.add(p2); //notifyEffect(points); } if(bDelete){ delete(p1); delete(p2); } notifyEffect(points); } publicintgetCols(){ returncols; } privateArrayList<Point>getHSpaces(Pointp,Pointpg){ ArrayList<Point>ps=newArrayList<Point>(); //left for(intdif=1;;dif++){ intcol=p.y-dif; introw=p.x; if(col<0||(data[row][col]!=0&&!pg.equals(newPoint(row,col))))break; ps.add(newPoint(row,col)); }

溫馨提示

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

最新文檔

評論

0/150

提交評論