版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1緒論1.1手機(jī)游戲發(fā)展1.1.1手機(jī)游戲現(xiàn)狀手機(jī)的便攜性使得手機(jī)游戲非常普及,在地鐵、車(chē)站和公交車(chē)?yán)?,我們隨時(shí)都可以看到很多人低頭玩著手機(jī)游戲。手機(jī)已經(jīng)成為越來(lái)越多的人生活中不可或缺的一部分,更多的人也漸漸喜歡上了手機(jī)游戲。手機(jī)游戲的潛在用戶群很龐大,據(jù)工業(yè)部和信息化部運(yùn)行監(jiān)測(cè)協(xié)調(diào)局2008年8月31日發(fā)布的統(tǒng)計(jì)顯示,截止2008年7月底,中國(guó)的手機(jī)用戶數(shù)量超過(guò)了6億,而且這個(gè)數(shù)字還在飛速地增長(zhǎng)。通過(guò)上述統(tǒng)計(jì)不難看出,手機(jī)游戲的潛在市場(chǎng)是相當(dāng)龐大的。手機(jī)游戲開(kāi)發(fā)技術(shù)門(mén)檻很低,而且其開(kāi)發(fā)平臺(tái)一般都是開(kāi)放的,開(kāi)發(fā)人員可以從網(wǎng)絡(luò)上獲得很多相關(guān)的技術(shù)資料,如最近很流行的開(kāi)發(fā)平臺(tái)——J2ME平臺(tái),其所有的代碼都是開(kāi)源的,開(kāi)發(fā)人員可以方便地查閱其任何相關(guān)資料,而手機(jī)廠商也會(huì)提供自己品牌的詳細(xì)參數(shù)供開(kāi)發(fā)人員參考。手機(jī)游戲的銷(xiāo)售渠道越來(lái)越廣,如今國(guó)內(nèi)比較有名氣的SP(serviceprovider)有新浪網(wǎng)、空中網(wǎng)以及移動(dòng)、聯(lián)通等通信商,CP、SP和運(yùn)營(yíng)商之間的關(guān)系如圖1-1所示。國(guó)內(nèi)的有些手機(jī)游戲CP(contentprovider)都通過(guò)尋找國(guó)外的代理商來(lái)推銷(xiāo)游戲,也有很大一部分尋找臺(tái)灣代理商(在后面的移植章節(jié)中會(huì)具體介紹)。同時(shí)還有很多游戲內(nèi)置渠道,包括手機(jī)廠商、代理和賣(mài)場(chǎng),如NOKIA的OVI。圖1-1CP、SP和運(yùn)營(yíng)商之間的關(guān)系隨著中國(guó)3G牌照的發(fā)放,手機(jī)游戲CP迅猛發(fā)展起來(lái),手機(jī)游戲市場(chǎng)再次呈現(xiàn)出一派朝氣蓬勃的氣象。自2003年中國(guó)移動(dòng)和中國(guó)聯(lián)通相繼推出“百寶箱”和“神奇寶典”業(yè)務(wù)以來(lái),國(guó)內(nèi)手機(jī)游戲市場(chǎng)日漸擴(kuò)大,尤其是2006年以后,中國(guó)移動(dòng)把手機(jī)游戲定位成其戰(zhàn)略性業(yè)務(wù),此舉動(dòng)讓國(guó)內(nèi)當(dāng)時(shí)眾多掙扎在“生死”邊緣的手機(jī)游戲CP看到了希望。如今,國(guó)內(nèi)手機(jī)游戲CP和工作室很多,但是精品游戲卻少之又少,最近移動(dòng)推出的“精品游戲”平臺(tái)給國(guó)內(nèi)很多手機(jī)游戲CP帶來(lái)了生機(jī),同時(shí)也帶來(lái)了挑戰(zhàn)。此外,越來(lái)越多的玩家青睞于手機(jī)游戲,將更大地促進(jìn)手機(jī)游戲市場(chǎng)的發(fā)展以及業(yè)務(wù)的不斷擴(kuò)大。手機(jī)游戲包含很多種類(lèi),如K-JAVA游戲、Smartphone游戲、BREW游戲和Symbian游戲等,目前,只有K-JAVA游戲和BREW游戲支持付費(fèi)下載,BREW游戲是聯(lián)通的業(yè)務(wù),K-JAVA游戲是移動(dòng)的業(yè)務(wù)。由于移動(dòng)的市場(chǎng)份額遠(yuǎn)遠(yuǎn)高于聯(lián)通,所以一般提及的手機(jī)游戲主要指K-JAVA游戲。2003年9月,中國(guó)移動(dòng)正式推出“百寶箱”業(yè)務(wù),“百寶箱”是指提供給手機(jī)上網(wǎng)用戶下載K-JAVA應(yīng)用程序的平臺(tái)。當(dāng)時(shí)中國(guó)手機(jī)游戲的開(kāi)發(fā)商CP曾一度達(dá)到1000多家,目前,移動(dòng)運(yùn)營(yíng)商仍然在手機(jī)游戲上占有壟斷地位。手機(jī)游戲產(chǎn)業(yè)鏈為:首先由手機(jī)游戲CP開(kāi)發(fā)完成游戲,然后再交給SP代理,其合作方式分為買(mǎi)斷、分成等,SP再把游戲提交給移動(dòng)運(yùn)營(yíng)商來(lái)供玩家下載。其銷(xiāo)售額中,移動(dòng)獲得15%,剩下的由SP與CP分成。手機(jī)游戲技術(shù)隨著手機(jī)游戲的普及和玩家群的增大,手機(jī)游戲開(kāi)發(fā)技術(shù)也日新月異,總體來(lái)說(shuō),手機(jī)游戲技術(shù)可以分為如下幾類(lèi)。(1)短信息游戲短信息游戲是相當(dāng)“古老”的手機(jī)游戲,玩家利用手機(jī)向某個(gè)游戲服務(wù)商提供的固定號(hào)碼發(fā)送短信,服務(wù)端經(jīng)過(guò)某些操作把結(jié)果發(fā)給玩家,通過(guò)反復(fù)這樣的操作完成整個(gè)游戲。這種類(lèi)型的游戲只是通過(guò)簡(jiǎn)單的互發(fā)短信來(lái)實(shí)現(xiàn)的,有很大的缺點(diǎn):一是成本昂貴,每發(fā)送一條短信需要1毛錢(qián),如象棋類(lèi)游戲,玩完整個(gè)游戲需要“很多資金”支持;二是界面不(2)嵌入式游戲某些游戲在出廠時(shí)就固化在芯片中,如NOKIA的貪吃蛇、飛行射擊等都屬于此類(lèi)游戲,但是玩家并不能安裝其他游戲,導(dǎo)致其失去了“優(yōu)勢(shì)”。(3)wap游戲當(dāng)手機(jī)擁有瀏覽器后,wap游戲開(kāi)始興盛起來(lái)。wap其實(shí)就是一個(gè)簡(jiǎn)化的Web,它專(zhuān)門(mén)為移動(dòng)小型設(shè)備提供上網(wǎng)載體,wap游戲的玩法為玩家通過(guò)瀏覽器登錄某個(gè)游戲廠商提供的地址,瀏覽其中的一個(gè)或多個(gè)頁(yè)面,并選擇其中指定的菜單或文字,提交給游戲服務(wù)端,然后通過(guò)游戲服務(wù)端的反饋信息提示繼續(xù)下面的游戲。雖然wap游戲相對(duì)于短信息服務(wù)有很大的提高,如界面比較友好、支持的游戲種類(lèi)比較多、價(jià)格也比較便宜,但是其游戲性不足,而且在某些國(guó)家很少有手機(jī)使用wap,所以此類(lèi)游戲也在逐漸退出市場(chǎng)。(4)編譯語(yǔ)言類(lèi)游戲C++屬于編譯語(yǔ)言,此類(lèi)語(yǔ)言把程序代碼編譯成設(shè)備代碼執(zhí)行,用其制作的游戲提供了很好的控制界面,而且運(yùn)行速度很快。但編譯語(yǔ)言類(lèi)游戲一般都在Series60設(shè)備上開(kāi)發(fā),這是其局限性的表現(xiàn)。此外還有PPC手機(jī)系統(tǒng)上的游戲也屬于此類(lèi)。(5)解釋語(yǔ)言類(lèi)游戲Java屬于解釋語(yǔ)言,在手機(jī)中的應(yīng)用為J2ME,即專(zhuān)門(mén)提供給移動(dòng)小型設(shè)備使用的Java語(yǔ)言。如今大部分手機(jī)都支持Java類(lèi)游戲,其游戲制作周期短,有很友好的玩家界面、操作控制和游戲性,并且可以通過(guò)無(wú)線網(wǎng)絡(luò)進(jìn)行網(wǎng)絡(luò)游戲。由于現(xiàn)在Java手機(jī)很普及,所以J2ME成為很流行的手機(jī)游戲編程語(yǔ)言之一。這也是本書(shū)主要介紹的編程語(yǔ)言。手機(jī)游戲開(kāi)發(fā)的特點(diǎn)手機(jī)游戲開(kāi)發(fā)和傳統(tǒng)的游戲開(kāi)發(fā)有很大的區(qū)別,其中包括絕對(duì)的優(yōu)勢(shì),但也有很多不利的方面。(1)優(yōu)點(diǎn)手機(jī)游戲開(kāi)發(fā)團(tuán)隊(duì)人數(shù)很少,一般只需要3~6個(gè)人就可以完成,甚至一款手機(jī)游戲的策劃和編程可以是一個(gè)人,這在一些小公司是比較常見(jiàn)的。而PC游戲的開(kāi)發(fā)通常需要十幾個(gè)人的開(kāi)發(fā)團(tuán)隊(duì)。另外,手機(jī)游戲的開(kāi)發(fā)周期和預(yù)算都比較少,而且銷(xiāo)售渠道也很方便。PC游戲的開(kāi)發(fā)周期一般是1~3年,而手機(jī)游戲一般在幾個(gè)月甚至一個(gè)月內(nèi)就可以完成,并且其預(yù)算通常只是PC游戲的一個(gè)零頭。手機(jī)游戲一般都可以通過(guò)手機(jī)無(wú)線設(shè)備下載到手機(jī)中,或者通過(guò)數(shù)據(jù)線把計(jì)算機(jī)中的手機(jī)游戲傳到手機(jī)上。因此,手機(jī)游戲的銷(xiāo)售渠道很多,而且簡(jiǎn)單。通過(guò)上述比較,可以發(fā)現(xiàn)手機(jī)游戲比PC游戲有更大的吸引力。另外,手機(jī)游戲擁有PC游戲無(wú)法比擬的龐大用戶群,據(jù)統(tǒng)計(jì),全球有10億部手機(jī)正在使用,并且這個(gè)數(shù)字還在不斷增加,而且其便攜性也是PC游戲不能媲美的,玩家可以隨時(shí)隨地玩手機(jī)游戲,而不必受場(chǎng)所的限制。(2)缺點(diǎn)手機(jī)游戲也有其缺點(diǎn),如屏幕尺寸小、游戲時(shí)間短、操作簡(jiǎn)單以及顯示效果粗糙等。另外,手機(jī)本身內(nèi)存的限制使得游戲的大小受到很大的影響,也影響了游戲的時(shí)間和顯示效果,實(shí)際上這主要取決于手機(jī)廠商和移動(dòng)運(yùn)營(yíng)商的規(guī)定?,F(xiàn)在很多智能手機(jī)的內(nèi)存限制很小,一款比較不錯(cuò)的智能手機(jī)可以運(yùn)行幾兆的游戲。一般的手機(jī)鍵盤(pán)只包括10個(gè)數(shù)字鍵及*、#等操作鍵,相對(duì)于PC上的鍵盤(pán)來(lái)說(shuō)簡(jiǎn)直是太少了,雖然現(xiàn)在有部分手機(jī)的鍵盤(pán)仿照PC鍵盤(pán)設(shè)計(jì),但是鍵盤(pán)狹小也限制了玩家的流暢操作。1.1.2開(kāi)發(fā)手機(jī)游戲的Java技術(shù)Java概述美國(guó)硅谷有一句行話,每10年~15年有一次輪回。最近的一次輪回就是從Java開(kāi)始。Java是一個(gè)由Sun公司開(kāi)發(fā)的一種可以撰寫(xiě)跨平臺(tái)應(yīng)用軟件的面向?qū)ο蟮男乱淮幊陶Z(yǔ)言。使用它可在各式各樣不同種機(jī)器、不同種操作平臺(tái)的網(wǎng)絡(luò)環(huán)境中開(kāi)發(fā)軟件。不論你使用的是哪一種WWW瀏覽器,哪一種計(jì)算機(jī),哪一種操作系統(tǒng),只要WWW瀏覽器上面注明了“支持Java”,你就可以看到生動(dòng)的主頁(yè)。Java自面世后就非常流行,發(fā)展迅速,對(duì)C++語(yǔ)言形成了有力沖擊。Java技術(shù)具有卓越的通用性、高效性、平臺(tái)移植性和安全性,廣泛應(yīng)用于個(gè)人PC、數(shù)據(jù)中心、游戲控制臺(tái)、科學(xué)超級(jí)計(jì)算機(jī)、移動(dòng)電話和互聯(lián)網(wǎng),同時(shí)擁有全球最大的開(kāi)發(fā)者專(zhuān)業(yè)社群。在全球云計(jì)算和移動(dòng)互聯(lián)網(wǎng)的產(chǎn)業(yè)環(huán)境下,Java更具備了顯著優(yōu)勢(shì)和廣闊前景。Java正在逐步成為Internet應(yīng)用的主要開(kāi)發(fā)語(yǔ)言。它徹底改變了應(yīng)用軟件的開(kāi)發(fā)模式,帶來(lái)了自PC機(jī)以來(lái)又一次技術(shù)革命,為迅速發(fā)展的信息世界增添了新的活力。Java帶來(lái)的影響:Java雖出現(xiàn)的時(shí)間不長(zhǎng),但已被業(yè)界接受,IBM、Apple、DEC、Adobe、SiliconGraphics、HP、Oracle、Toshiba、Netscap和Microsoft等大公司已經(jīng)購(gòu)買(mǎi)了Java的許可證。Microsoft還在其Web瀏覽器Explorer3.0版中增加了對(duì)Java的支持。另外,眾多的軟件開(kāi)發(fā)商也開(kāi)發(fā)了許多支持Java的軟件產(chǎn)品。在以網(wǎng)絡(luò)為中心的計(jì)算時(shí)代,不支持HTML和Java,就意味著應(yīng)用程序的應(yīng)用范圍只能限于同質(zhì)的環(huán)境。Java的出現(xiàn)是計(jì)算機(jī)信息交換的一個(gè)重要里程碑。在單機(jī)時(shí)代,程序進(jìn)程之間靠共享存儲(chǔ)進(jìn)行變量交換;在網(wǎng)絡(luò)時(shí)代,運(yùn)行在不同宿主機(jī)上的程序按網(wǎng)絡(luò)協(xié)議進(jìn)行無(wú)格式的消息(二進(jìn)制字符流)交換,消息的語(yǔ)義由交換程序雙方維護(hù);在Java時(shí)代,運(yùn)行在網(wǎng)絡(luò)上的程序進(jìn)程交換的是小應(yīng)用程序(applet)。小應(yīng)用程序是什么?它是一個(gè)對(duì)象,由一組屬性和方法構(gòu)成,是一個(gè)可執(zhí)行的實(shí)體;不僅有數(shù)據(jù)的狀態(tài),而且有定義在數(shù)據(jù)上的操作。未來(lái)可能進(jìn)行代表(Agent)交換,代理有一定的智能性,那便是信息交換的更高級(jí)階段。Java主要由以下部分組成:(1)Java模擬器Java手機(jī)游戲模擬器主要針對(duì)諾基亞S60系列手機(jī)以及其他大屏手機(jī)(小屏游戲也可運(yùn)行,但不能全屏顯示),是一款非常簡(jiǎn)單而且實(shí)用的JAVA游戲模擬器,可以正常運(yùn)行絕大部分JAVA手機(jī)游戲!注:暫不支持游戲后綴名為sis的游戲。程序的使用是傻瓜式的,在電腦上安裝好以后,所有的游戲jar文件都會(huì)和模擬器相關(guān)連,直接雙擊游戲jar文件就可以進(jìn)入模擬器玩游戲啦!電腦的小數(shù)字鍵盤(pán)和方向鍵就可以直接控制游戲,與模擬器的按鍵相對(duì)應(yīng),當(dāng)然也可以用鼠標(biāo)直接點(diǎn)擊控制。(2)虛擬機(jī)Java虛擬機(jī)(JavaVirtualMachine)簡(jiǎn)稱JVMJava虛擬機(jī)是一個(gè)想象中的機(jī)器,在實(shí)際的計(jì)算機(jī)上通過(guò)軟件模擬來(lái)實(shí)現(xiàn)。Java虛擬機(jī)有自己想象中的硬件,如處理器、堆棧、寄存器等,還具有相應(yīng)的指令系統(tǒng)。引入Java語(yǔ)言虛擬機(jī)后,Java語(yǔ)言在不同平臺(tái)上運(yùn)行時(shí)不需要重新編譯。Java語(yǔ)言使用模式Java虛擬機(jī)屏蔽了與具體平臺(tái)相關(guān)的信息,使得Java語(yǔ)言編譯程序只需生成在Java虛擬機(jī)上運(yùn)行的目標(biāo)代碼(字節(jié)碼),就可以在多種平臺(tái)上不加修改地運(yùn)行。Java虛擬機(jī)在執(zhí)行字節(jié)碼時(shí),把字節(jié)碼解釋成具體平臺(tái)上的機(jī)器指令執(zhí)行。(3)內(nèi)存模型在處理器層面上,內(nèi)存模型定義了一個(gè)充要條件,“讓當(dāng)前的處理器可以看到其他處理器寫(xiě)入到內(nèi)存的數(shù)據(jù)”以及“其他處理器可以看到當(dāng)前處理器寫(xiě)入到內(nèi)存的數(shù)據(jù)”。有些處理器有很強(qiáng)的內(nèi)存模型,能夠讓所有的處理器在任何時(shí)候任何指定的內(nèi)存地址上都可以看到完全相同的值。而另外一些處理器則有較弱的內(nèi)存模型,在這種處理器中,必須使用內(nèi)存屏障(一種特殊的指令)來(lái)刷新本地處理器緩存并使本地處理器緩存無(wú)效,目的是為了讓當(dāng)前處理器能夠看到其他處理器的寫(xiě)操作或者讓其他處理器能看到當(dāng)前處理器的寫(xiě)操作。這些內(nèi)存屏障通常在lock和unlock操作的時(shí)候完成。內(nèi)存屏障在高級(jí)語(yǔ)言中對(duì)程序員是不可見(jiàn)的。Java的特點(diǎn)(1)Java的主要特點(diǎn)Java語(yǔ)言有下面一些特點(diǎn):簡(jiǎn)單、面向?qū)ο?、分布式、解釋?zhí)行、魯棒、安全、體系結(jié)構(gòu)中立、可移植、高性能及多線程。①.簡(jiǎn)單性:Java語(yǔ)言是一種面向?qū)ο蟮恼Z(yǔ)言,它通過(guò)提供最基本的方法來(lái)完成指定的任務(wù),只需理解一些基本的概念,就可以用它編寫(xiě)出適合于各種情況的應(yīng)用程序。②.面向?qū)ο螅篔ava語(yǔ)言的設(shè)計(jì)集中于對(duì)象及其接口,它提供了簡(jiǎn)單的類(lèi)機(jī)制以及動(dòng)態(tài)的接口模型。對(duì)象中封裝了它的狀態(tài)變量以及相應(yīng)的方法,實(shí)現(xiàn)了模塊化和信息隱藏;而類(lèi)則提供了一類(lèi)對(duì)象的原型,并且通過(guò)繼承機(jī)制,子類(lèi)可以使用父類(lèi)所提供的方法,實(shí)現(xiàn)了代碼的復(fù)用。③.分布性:Java是面向網(wǎng)絡(luò)的語(yǔ)言。通過(guò)它提供的類(lèi)庫(kù)可以處理TCP/IP協(xié)議,用戶可以通過(guò)URL地址在網(wǎng)絡(luò)上很方便地訪問(wèn)其它對(duì)象。④.魯棒性:Java在編譯和運(yùn)行程序時(shí),都要對(duì)可能出現(xiàn)的問(wèn)題進(jìn)行檢查,以消除錯(cuò)誤的產(chǎn)生。它提供自動(dòng)垃圾收集來(lái)進(jìn)行內(nèi)存管理,防止程序員在管理內(nèi)存時(shí)容易產(chǎn)生的錯(cuò)誤。另外,Java在編譯時(shí)還可捕獲類(lèi)型聲明中的許多常見(jiàn)錯(cuò)誤,防止動(dòng)態(tài)運(yùn)行時(shí)不匹配問(wèn)題的出現(xiàn)。⑤.安全性:用于網(wǎng)絡(luò)、分布環(huán)境下的Java必須要防止病毒的入侵。Java不支持指針,一切對(duì)內(nèi)存的訪問(wèn)都必須通過(guò)對(duì)象的實(shí)例變量來(lái)實(shí)現(xiàn),這樣就防止程序員使用“特洛伊”木馬等欺騙手段訪問(wèn)對(duì)象的私有成員,同時(shí)也避免了指針操作中容易產(chǎn)生的錯(cuò)誤。⑥.體系結(jié)構(gòu)中立:Java解釋器生成與體系結(jié)構(gòu)無(wú)關(guān)的字節(jié)碼指令,只要安裝了Java運(yùn)行時(shí)系統(tǒng),Java程序就可在任意的處理器上運(yùn)行。⑦.可移植性:與平臺(tái)無(wú)關(guān)的特性使Java程序可以方便地被移植到網(wǎng)絡(luò)上的不同機(jī)器。同時(shí),Java的類(lèi)庫(kù)中也實(shí)現(xiàn)了與不同平臺(tái)的接口,使這些類(lèi)庫(kù)可以移植。另外,Java編譯器是由Java語(yǔ)言實(shí)現(xiàn)的,Java運(yùn)行時(shí)系統(tǒng)由標(biāo)準(zhǔn)C實(shí)現(xiàn),這使得Java系統(tǒng)本身也具有可移植性。⑧.解釋執(zhí)行:Java解釋器直接對(duì)Java字節(jié)碼進(jìn)行解釋執(zhí)行。字節(jié)碼本身攜帶了許多編譯時(shí)信息,使得連接過(guò)程更加簡(jiǎn)單。⑨.高性能:和其它解釋執(zhí)行的語(yǔ)言如BASIC不同,Java字節(jié)碼的設(shè)計(jì)使之能很容易地直接轉(zhuǎn)換成對(duì)應(yīng)于特定CPU的機(jī)器碼,從而得到較高的性能。⑩.多線程:多線程機(jī)制使應(yīng)用程序能夠并行執(zhí)行,而且同步機(jī)制保證了對(duì)共享數(shù)據(jù)的正確操作。通過(guò)使用多線程,程序設(shè)計(jì)者可以分別用不同的線程完成特定的行為,而不需要采用全局的事件循環(huán)機(jī)制,這樣就很容易地實(shí)現(xiàn)網(wǎng)絡(luò)上的實(shí)時(shí)交互行為。(2)JavaAppletJava語(yǔ)言的特性使它可以最大限度地利用網(wǎng)絡(luò)。Applet是Java的小應(yīng)用程序,它是動(dòng)態(tài)、安全、跨平臺(tái)的網(wǎng)絡(luò)應(yīng)用程序。JavaApplet嵌入HTML語(yǔ)言,通過(guò)主頁(yè)發(fā)布到Internet。網(wǎng)絡(luò)用戶訪問(wèn)服務(wù)器的Applet時(shí),這些Applet從網(wǎng)絡(luò)上進(jìn)行傳輸,然后在支持Java的瀏覽器中運(yùn)行。由于Java語(yǔ)言的安全機(jī)制,用戶一旦載入Applet,就可以放心地來(lái)生成多媒體的用戶界面或完成復(fù)雜的計(jì)算而不必?fù)?dān)心病毒的入侵。(3)豐富的類(lèi)庫(kù)Java提供了大量的類(lèi)以滿足網(wǎng)絡(luò)化、多線程、面向?qū)ο笙到y(tǒng)的需要。①.語(yǔ)言包提供的支持包括字符串處理、多線程處理、例外處理、數(shù)學(xué)函數(shù)處理等,可以用它簡(jiǎn)單地實(shí)現(xiàn)Java程序的運(yùn)行平臺(tái)。②.實(shí)用程序包提供的支持包括哈希表、堆棧、可變數(shù)組、時(shí)間和日期等。③.輸入輸出包用統(tǒng)一的"流"模型來(lái)實(shí)現(xiàn)所有格式的I/O,包括文件系統(tǒng)、網(wǎng)絡(luò)、輸入等。④.低級(jí)網(wǎng)絡(luò)包用于實(shí)現(xiàn)Socket編程。⑤.抽象圖形用戶接口包實(shí)現(xiàn)了不同平臺(tái)的計(jì)算機(jī)的圖形用戶接口部件,包括窗口、菜單、滾動(dòng)條、對(duì)話框等,使得Java可以移植到不同平臺(tái)的機(jī)器。⑥.網(wǎng)絡(luò)包支持Internet的TCP/IP協(xié)議,提供了與In-ternet的接口。它支持URL連接,WWW的即時(shí)訪問(wèn),并且簡(jiǎn)化了用戶/服務(wù)器模型的程序設(shè)計(jì)。(4)Java和C、C++對(duì)于變量聲明、參數(shù)傳遞、操作符、流控制等,Java使用了和C、C++相同的傳統(tǒng),使得熟悉C、C++的程序員能很方便地進(jìn)行編程。同時(shí),Java為了實(shí)現(xiàn)其簡(jiǎn)單、魯棒、安全等特性,也摒棄了C和C++中許多不合理的內(nèi)容。如:①.全局變量:Java程序中,不能在所有類(lèi)之外定義全局變量,只能通過(guò)在一個(gè)類(lèi)中定義公用、靜態(tài)的變量來(lái)實(shí)現(xiàn)一個(gè)全局變量。②.Goto:Java不支持C、C++中的goto語(yǔ)句,而是通過(guò)例外處理語(yǔ)句try,Catch,final等來(lái)代替C、C++中用goto來(lái)處理遇到錯(cuò)誤時(shí)跳轉(zhuǎn)的情況,使程序更可讀且更結(jié)構(gòu)化。③.指針:指針是C、C++中最靈活,也是最容易產(chǎn)生錯(cuò)誤的數(shù)據(jù)類(lèi)型。Java對(duì)指針進(jìn)行完全的控制,程序員不能直接進(jìn)行任何指針操作,例如把整數(shù)轉(zhuǎn)化為指針,或者通過(guò)指針釋放某一內(nèi)存地址等。同時(shí),數(shù)組作為類(lèi)在Java中實(shí)現(xiàn),良好地解決了數(shù)組訪問(wèn)越界這一C、C++中不作檢查的錯(cuò)誤。④.內(nèi)存管理:在Java中,所有的數(shù)據(jù)結(jié)構(gòu)都是對(duì)象,通過(guò)運(yùn)算符new為它們分配內(nèi)存堆。通過(guò)new得到對(duì)象的處理權(quán),而實(shí)際分配給對(duì)象的內(nèi)存可能隨程序運(yùn)行而改變,Java對(duì)此自動(dòng)地進(jìn)行管理并且進(jìn)行垃圾收集,有效防止了由于程序員的誤操作而導(dǎo)致的錯(cuò)誤,并且更好地利用了系統(tǒng)資源。⑤.數(shù)據(jù)類(lèi)型的支持:在Java中,對(duì)于這些數(shù)據(jù)類(lèi)型總是分配固定長(zhǎng)度的位數(shù),如對(duì)int型,它總占32位,這就保證了Java的平臺(tái)無(wú)關(guān)性。Java開(kāi)發(fā)優(yōu)勢(shì)與傳統(tǒng)程序不同,Sun公司在推出Java之際就將其作為一種開(kāi)放的技術(shù)。全球數(shù)以萬(wàn)計(jì)的Java開(kāi)發(fā)公司被要求所設(shè)計(jì)的Java軟件必須相互兼容?!癑ava語(yǔ)言靠群體的力量而非公司的力量”是Sun公司的口號(hào)之一,并獲得了廣大軟件開(kāi)發(fā)商的認(rèn)同。這與微軟公司所倡導(dǎo)的注重精英和封閉式的模式完全不同。Sun公司對(duì)Java編程語(yǔ)言的解釋是:Java
編程語(yǔ)言是個(gè)簡(jiǎn)單、面向?qū)ο?、分布式、解釋性、健壯、安全與系統(tǒng)無(wú)關(guān)、可移植、高性能、多線程和動(dòng)態(tài)的語(yǔ)言。Java平臺(tái)是基于Java語(yǔ)言的平臺(tái)。這樣的平臺(tái)非常流行。因此微軟公司推出了與之競(jìng)爭(zhēng)的.NET平臺(tái)以及模仿Java的C#語(yǔ)言。Java是功能完善的通用程序設(shè)計(jì)語(yǔ)言,可以用來(lái)開(kāi)發(fā)可靠的、要求嚴(yán)格的應(yīng)用程序。語(yǔ)言特征Java編程語(yǔ)言的風(fēng)格十分接近C語(yǔ)言、C++語(yǔ)言。Java是一個(gè)純粹的面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言,它繼承了C++語(yǔ)言面向?qū)ο蠹夹g(shù)的核心。Java舍棄了C語(yǔ)言中容易引起錯(cuò)誤的指針(以引用取代)、運(yùn)算符重載(operatoroverloading)、多重繼承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的對(duì)象所占據(jù)的內(nèi)存空間,使得程序員不用再為內(nèi)存管理而擔(dān)憂。在Java1.5版本中,Java又引入了泛型編程(GenericProgramming)、類(lèi)型安全的枚舉、不定長(zhǎng)參數(shù)和自動(dòng)裝/拆箱等語(yǔ)言特性。Java不同于一般的編譯執(zhí)行計(jì)算機(jī)語(yǔ)言和解釋執(zhí)行計(jì)算機(jī)語(yǔ)言。它首先將源代碼編譯成二進(jìn)制字節(jié)碼(bytecode),然后依賴各種不同平臺(tái)上的虛擬機(jī)來(lái)解釋執(zhí)行字節(jié)碼。從而實(shí)現(xiàn)了“一次編譯、到處執(zhí)行”的跨平臺(tái)特性。不過(guò),每次的執(zhí)行編譯后的字節(jié)碼需要消耗一定的時(shí)間,這同時(shí)也在一定程度上降低了Java程序的性能。編輯Java源代碼可以使用任何無(wú)格式的純文本編輯器,在Windows操作系統(tǒng)上可以使用微軟記事本(Notepad)、EditPlus等程序,在Linux平臺(tái)上可使用vi工具等。在記事本中輸入如下代碼:PublicclassHellowWorld{//Java程序的入口方法,程序?qū)倪@里開(kāi)始執(zhí)行Publicstaticvoidmain(String[]args){//向程序臺(tái)打印一條語(yǔ)句System.out.println(“Helloworld”);}}編輯上面的Java文件時(shí),注意程序中粗體字標(biāo)識(shí)的單詞,Java程序嚴(yán)格區(qū)分大小寫(xiě)。將上面文本保存為HelloWorld.Java,該文件就是Java程序的源程序。編寫(xiě)好Java程序的源代碼后,接下來(lái)應(yīng)該編譯該Java源文件來(lái)生成字節(jié)碼了。發(fā)展前景自從Sun被甲骨文收購(gòu)以后,Java的發(fā)展前景就變得撲朔迷離起來(lái),很多程序開(kāi)發(fā)者都感到很迷惑。2010年4月9日,被稱為Java之父的詹姆斯·高斯林又在個(gè)人博客上宣布離開(kāi)Oracle,這一事件更為Java的前景增加了一層迷霧。但是在進(jìn)入5月份之后,一切開(kāi)始變得明朗起來(lái)。在Oracle的活動(dòng)發(fā)布網(wǎng)站上,連續(xù)發(fā)布了多個(gè)關(guān)于Java的推廣活動(dòng)。5月12日,Oracle主要產(chǎn)品負(fù)責(zé)人DaveHofert將大談對(duì)JavaSE商業(yè)應(yīng)用的改進(jìn)和革新。根據(jù)宣傳資料,在這次演講中,DaveHofert將提到以下問(wèn)題:商業(yè)版與社區(qū)版本之間平臺(tái)支持的差異。如何獲得專(zhuān)家?guī)椭?,以幫助企業(yè)增強(qiáng)其Java應(yīng)用。對(duì)于舊版本的安全修補(bǔ)問(wèn)題??墒褂玫陌l(fā)布工具和更新。6月18、19、20、27日,將分別在赫爾辛基、斯圖加特、布達(dá)佩斯、倫敦舉行Oracle、Sun專(zhuān)家與用戶見(jiàn)面會(huì),在見(jiàn)面會(huì)上與用戶一起探討Java的發(fā)展路線。主要討論的問(wèn)題包括Oracle將如何繼續(xù)投資和改進(jìn)Java技術(shù),并且還會(huì)向用戶通報(bào)JavaSE、JavaME專(zhuān)家團(tuán)隊(duì)的最新消息、JavaFX和JDK7最新的消息,以及OracleBerkeleyDB的相關(guān)信息。5月3日,已經(jīng)離開(kāi)Oracle近一個(gè)月的Java之父詹姆斯·高斯林在他的博客上表達(dá)了對(duì)NetBeans6.9和FX1.3發(fā)布的關(guān)心。這兩個(gè)項(xiàng)目最新版本的發(fā)布,可以證明Oracle已經(jīng)開(kāi)始兌現(xiàn)當(dāng)初的承諾。詹姆斯·高斯林在其早期的博客中,也透露了不會(huì)放棄Java事業(yè),只是需要解決一些與Oracle之間的法律問(wèn)題。這一切跡象表明,Oracle絕對(duì)不會(huì)輕易放棄Java這塊巨大的蛋糕,并且Oracle也開(kāi)始逐漸學(xué)會(huì)了對(duì)開(kāi)源社區(qū)的尊重。首先在JDK的商業(yè)版本方面,Oracle將會(huì)繼續(xù)深入挖掘Java的商業(yè)利益,與其固有產(chǎn)品進(jìn)行更深入的整合。在社區(qū)版本方面,Oracle將與Java開(kāi)發(fā)者一起探討和研發(fā)Java的技術(shù)。這里需要特別提到的一個(gè)產(chǎn)品是OracleBerkeleyDB,該產(chǎn)品是Oracle一直支持的一個(gè)開(kāi)源非關(guān)系數(shù)據(jù)庫(kù)產(chǎn)品,在NoSQL大行其道的今天,如果Oracle能夠?qū)erkeleyDB與Java進(jìn)行深入整合,將會(huì)為Java帶來(lái)更多的活力和生命。從詹姆斯·高斯林的表現(xiàn)來(lái)看,他似乎與Oracle之間已經(jīng)達(dá)成某種諒解,并且有進(jìn)一步合作的可能性。1.2.6貢獻(xiàn)及影響1991年,Sun公司的JamesGosling,BillJoe等人,為電視、控制烤面包機(jī)等家用電器的交互操作開(kāi)發(fā)了一個(gè)Oak(橡樹(shù))軟件,他是Java的前身。當(dāng)時(shí),Oak并沒(méi)有引起人們的注意,直到1994年,隨著互聯(lián)網(wǎng)和3W的飛速發(fā)展,他們用Java編制了HotJava瀏覽器,得到了Sun公司首席執(zhí)行官ScottMcNealy的支持,得以研發(fā)和發(fā)展。由于Oak商標(biāo)已經(jīng)被OakTechnology注冊(cè),1995年Oak短暫更名為Green,最后更名為Java。Java的得名還有段小插曲呢,一天,Java小組成員正在喝咖啡時(shí),議論給新語(yǔ)言起個(gè)什么名字的問(wèn)題,有人提議用Java(Java是印度尼西亞盛產(chǎn)咖啡的一個(gè)島嶼),這個(gè)提議得到了其他成員的贊同,于是就采用Java來(lái)命名此新語(yǔ)言。很快Java被工業(yè)界認(rèn)可,許多大公司如IBMMicrosoft.DEC等購(gòu)買(mǎi)了Java的使用權(quán),并被美國(guó)雜志PCMagazine評(píng)為1995年十大優(yōu)秀科技產(chǎn)品。從此,開(kāi)始了Java應(yīng)用的新篇章。Java的誕生是對(duì)傳統(tǒng)計(jì)算機(jī)模式的挑戰(zhàn),對(duì)計(jì)算機(jī)軟件開(kāi)發(fā)和軟件產(chǎn)業(yè)都產(chǎn)生了深遠(yuǎn)的影響:(1)軟件4A目標(biāo)要求軟件能達(dá)到任何人在任何地方在任何時(shí)間對(duì)任何電子設(shè)備都能應(yīng)用。這樣能滿足軟件平臺(tái)上互相操作,具有可伸縮性和重用性并可即插即用等分布式計(jì)算模式的需求。(2)基于構(gòu)建開(kāi)發(fā)方法的崛起,引出了CORBA國(guó)際標(biāo)準(zhǔn)軟件體系結(jié)構(gòu)和多層應(yīng)用體系框架。在此基礎(chǔ)上形成了Java.2平臺(tái)和.NET平臺(tái)兩大派系,推動(dòng)了整個(gè)IT業(yè)的發(fā)展。(3)對(duì)軟件產(chǎn)業(yè)和工業(yè)企業(yè)都產(chǎn)生了深遠(yuǎn)的影響,軟件從以開(kāi)發(fā)為中心轉(zhuǎn)到了以服務(wù)為中心。中間提供商,構(gòu)件提供商,服務(wù)器軟件以及咨詢服務(wù)商出現(xiàn)。企業(yè)必須重塑自我,B2B的電子商務(wù)將帶動(dòng)整個(gè)新經(jīng)濟(jì)市場(chǎng),使企業(yè)獲得新的價(jià)值,新的增長(zhǎng),新的商機(jī),新的管理。(4)對(duì)軟件開(kāi)發(fā)帶來(lái)了新的革命,重視使用第三方構(gòu)件集成,利用平臺(tái)的基礎(chǔ)設(shè)施服務(wù),實(shí)現(xiàn)開(kāi)發(fā)各個(gè)階段的重要技術(shù),重視開(kāi)發(fā)團(tuán)隊(duì)的組織和文化理念,協(xié)作,創(chuàng)作,責(zé)任,誠(chéng)信是人才的基本素質(zhì)。1.3論文結(jié)構(gòu)安排第一章是對(duì)項(xiàng)目開(kāi)發(fā)的背景介紹,從手機(jī)游戲和Java的發(fā)展兩方面來(lái)展開(kāi);第二章是對(duì)游戲開(kāi)發(fā)前一些可行性論證以及需求進(jìn)行分析;第三章是具體對(duì)各個(gè)模塊進(jìn)行分析與實(shí)現(xiàn);第四章對(duì)項(xiàng)目進(jìn)行測(cè)試論證以及出現(xiàn)的問(wèn)題;最后是結(jié)論概括。1.4本章小結(jié)本章首先通過(guò)對(duì)手機(jī)游戲的簡(jiǎn)單介紹引導(dǎo)讀者走入手機(jī)游戲世界,并簡(jiǎn)單介紹其發(fā)展和產(chǎn)業(yè)的現(xiàn)狀,最后講解了目前比較流行的手機(jī)游戲類(lèi)型。希望讀者通過(guò)閱讀本章能夠?qū)κ謾C(jī)游戲這個(gè)行業(yè)有更深的了解,也希望讀者能更加熟悉游戲行業(yè),甚至整個(gè)游戲產(chǎn)業(yè)。其中的手機(jī)游戲技術(shù)簡(jiǎn)單地介紹了現(xiàn)今手機(jī)游戲產(chǎn)業(yè)中使用的技術(shù),對(duì)讀者的學(xué)習(xí)起到提示作用。本章還講解了Java語(yǔ)言的基礎(chǔ)部分,其中包括Java語(yǔ)言基本規(guī)則、對(duì)象、數(shù)組應(yīng)用、文件操作和Java語(yǔ)言編程規(guī)范。有一定語(yǔ)言基礎(chǔ)的讀者通過(guò)閱讀本章內(nèi)容就可以對(duì)此語(yǔ)言有簡(jiǎn)單的了解,其實(shí)所有的語(yǔ)言邏輯結(jié)構(gòu)都是一樣的,只要掌握了一種語(yǔ)言的基本規(guī)則和語(yǔ)法,就可以根據(jù)需求編寫(xiě)出可用的代碼。
2大體設(shè)計(jì)思路2.1項(xiàng)目設(shè)計(jì)與方法2.1.1連連看游戲概述當(dāng)今社會(huì),休閑型游戲越來(lái)越得到人們的喜愛(ài),我們所做的設(shè)計(jì)實(shí)例“連連看游戲的設(shè)計(jì)與實(shí)現(xiàn)”是近幾年來(lái)網(wǎng)絡(luò)上非常流行的一種二維休閑游戲,它對(duì)電腦配置要求不高,娛樂(lè)性強(qiáng),易于上手。此次設(shè)計(jì)所使用的語(yǔ)言為Java,開(kāi)發(fā)環(huán)境為JCreator。主要應(yīng)用到Swing組件,Java小程序,事件及接口等。這些接口為游戲的制作提供了便捷的條件,本系統(tǒng)的主要特點(diǎn)就是運(yùn)用Swing組件和事件處理技術(shù),進(jìn)行界面的繪制,鼠標(biāo)的操作,以及積分的顯示等功能。這次通過(guò)連連看的設(shè)計(jì)開(kāi)發(fā)將對(duì)理解Swing組件技術(shù)以及事件處理技術(shù)在游戲方面的應(yīng)用起到很大的幫助作用,同時(shí)為掌握J(rèn)ava編程技術(shù)及二維休閑游戲設(shè)計(jì)的一般方法打下堅(jiān)實(shí)的基礎(chǔ)。隨著Flash應(yīng)用的流行,網(wǎng)上出現(xiàn)了多種在線Flash版本“連連看”。如“水晶連連看”、“果蔬連連看”等,流行的“水晶連連看”以華麗界面吸引了一大批的女性玩家。不管走到哪個(gè)網(wǎng)頁(yè)游戲網(wǎng)站,連連看游戲總是排在受玩家歡迎排名的前5位,休閑、趣味、益智是連連看玩不厭的精華,且不分男女老少、工薪白領(lǐng),是一款適合大眾的經(jīng)典網(wǎng)絡(luò)休閑小游戲2.2游戲設(shè)計(jì)的目的通過(guò)本次畢業(yè)設(shè)計(jì),讓我們掌握如何制作一個(gè)游戲軟件,以及制作游戲軟件的整個(gè)流程,制作游戲軟件的步驟,讓學(xué)生熟悉項(xiàng)目開(kāi)發(fā)的完整過(guò)程,為即將到來(lái)的就業(yè)工作打下基礎(chǔ)。另外也通過(guò)本次設(shè)計(jì)將三年來(lái)所學(xué)的專(zhuān)業(yè)知識(shí)和其他方面的知識(shí)融入到實(shí)際應(yīng)用中,在實(shí)際運(yùn)用中學(xué)習(xí)和掌握J(rèn)ava程序開(kāi)發(fā)的全過(guò)程,進(jìn)一步熟悉掌握J(rèn)ava程序設(shè)計(jì)語(yǔ)言的基礎(chǔ)內(nèi)容、基本技能和方法,同時(shí)培養(yǎng)學(xué)生進(jìn)行分析問(wèn)題、解決問(wèn)題的能力;培養(yǎng)學(xué)生進(jìn)行設(shè)計(jì)分析、設(shè)計(jì)方法、設(shè)計(jì)操作與測(cè)試、設(shè)計(jì)過(guò)程的觀察、理解和歸納能力的提高。(1)主要是能通過(guò)開(kāi)發(fā)“連連看”這個(gè)小游戲,學(xué)會(huì)Java程序開(kāi)發(fā)的環(huán)境搭建與配置,并提高自己Java程序設(shè)計(jì)編程的實(shí)際能力。通過(guò)這次。(2)進(jìn)一步熟悉掌握J(rèn)ava程序設(shè)計(jì)的基礎(chǔ)內(nèi)容,如用戶圖形界面設(shè)計(jì)(GUI)、Java多線程編程等。(3)大體了解怎樣用Java來(lái)編寫(xiě)小游戲,增強(qiáng)我們實(shí)踐能力和創(chuàng)新精神的綜合培養(yǎng)。2.3游戲可行性論證“連連看”游戲是一個(gè)經(jīng)典的游戲,它因操作簡(jiǎn)單、娛樂(lè)性強(qiáng)而廣受歡迎。我們通過(guò)所學(xué)的JAVA,利用MyEclipse設(shè)計(jì)一個(gè)操作簡(jiǎn)單、界面美觀、功能齊全的“連連看游戲”。通過(guò)本游戲的開(kāi)發(fā),達(dá)到學(xué)習(xí)Java技術(shù)和熟悉軟件開(kāi)發(fā)流程的目的。這個(gè)游戲是用圖形界面實(shí)現(xiàn)的,通過(guò)編譯解釋后,出現(xiàn)一個(gè)圖形界面。界面上方有一行菜單欄,點(diǎn)擊菜單欄上的按鈕,出現(xiàn)下拉菜單,選擇開(kāi)始,進(jìn)入游戲界面,游戲界面是由若干個(gè)小方格組成的,每個(gè)小方格有一個(gè)圖標(biāo),點(diǎn)擊其中相同的圖標(biāo),若它們符合算法要求就會(huì)消失,且游戲期間有一定的時(shí)間限制。游戲還設(shè)有炸彈、退出、幫助的功能,方便游戲操作。2.4方案選擇在概要設(shè)計(jì)階段,主要有兩中方案可供選擇:(1)所有的圖片都是按約定好的種類(lèi)數(shù)和在同一區(qū)域的重復(fù)次數(shù)隨機(jī)出現(xiàn),并且每張圖片的的出現(xiàn)次數(shù)為偶數(shù),時(shí)間會(huì)有限制,每一關(guān)的圖片數(shù)量或種方案的設(shè)計(jì)思想,時(shí)間是不同的,這樣就增加了游戲的難度。(2)在同一區(qū)域中,圖片出現(xiàn)的種類(lèi)數(shù)和重復(fù)次數(shù)是可以由玩家選擇的,時(shí)間由游戲約定。不過(guò)玩家選擇的種類(lèi)數(shù)和重復(fù)次數(shù)必須是偶數(shù)才可以順利完成游戲,否則游戲雖然可以正常運(yùn)行,但無(wú)法完成游戲。在第一種方案中,由于出現(xiàn)的圖像按種類(lèi)數(shù)和重復(fù)次數(shù)都由軟件約定,這樣就缺乏玩家自主選擇的空間,只是在玩系統(tǒng)已經(jīng)是設(shè)定好的游戲,不能改變什么,這樣就在無(wú)意中降低了玩家在游戲的過(guò)程中樂(lè)趣,最后致使玩家放棄繼續(xù)玩下去。我們參考了網(wǎng)絡(luò)上的連連看游戲,考慮到游戲的娛樂(lè)性。所以我們放棄第一種方案的設(shè)計(jì)思想,參考網(wǎng)絡(luò)上流行的連連看的游戲,設(shè)計(jì)出第2種方案。2.5主要問(wèn)題開(kāi)始制作游戲時(shí),主要解決的問(wèn)題有以下幾個(gè)方面:(1)如何設(shè)置整個(gè)游戲的界面。(2)如何控制連連看游戲中隨機(jī)圖片的生成切每種圖片必須為偶數(shù)個(gè);游戲開(kāi)始后,判斷鼠標(biāo)兩次點(diǎn)擊的圖片能否消去,即圖片是否相同且圖片之間路徑的判斷。(3)如何判斷游戲是否結(jié)束以及輸贏的問(wèn)題。2.6項(xiàng)目設(shè)計(jì)內(nèi)容游戲規(guī)則是模仿網(wǎng)絡(luò)上普通的連連看游戲,主要是鼠標(biāo)兩次點(diǎn)擊的圖片能否消去的問(wèn)題。當(dāng)前,前提是點(diǎn)擊兩張相同的圖片,若點(diǎn)擊的是同一張圖片或者兩張不同的圖片,則不予處理。在兩張想同圖片所能連通的所有路徑中,如果存在一條轉(zhuǎn)彎點(diǎn)不多于兩個(gè)的路徑,就可以消去;如果沒(méi)有,則不予處理。該游戲由若干張不同的圖片組成,游戲開(kāi)始將會(huì)隨機(jī)組合圖片,在規(guī)則下點(diǎn)擊兩張相同的圖片后圖片將會(huì)消失。圖片全部消完為游戲成功。游戲還將設(shè)置退出,再來(lái)一局的按鈕,并實(shí)現(xiàn)該功能,方便用戶進(jìn)行操作。該游戲?qū)⒂腥缦聝?nèi)容:(1)游戲計(jì)時(shí)功能游戲會(huì)記錄從開(kāi)始到結(jié)束所用的時(shí)間,并作為歷史記錄方便玩家下一次突破。(2)刷新功能在游戲界面中沒(méi)有可以相消的圖片時(shí),重新排列剩余圖片達(dá)到可以消除的目的。(3)提示功能在玩家找不到可選擇的相消圖片時(shí),游戲可提示一組選擇。(4)演示功能對(duì)于第一次使用還不熟悉的玩家,游戲?qū)⑻峁┭菔?,自?dòng)消除。(5)等級(jí)選擇功能游戲設(shè)有1-7和隨機(jī)等幾個(gè)等級(jí),為了滿足不同玩家對(duì)不同游戲難度的需求。連連看是運(yùn)用JCreator中的多文檔視圖開(kāi)發(fā)的,文檔——視圖結(jié)構(gòu)提供的應(yīng)用程序接口有利于進(jìn)行窗口操作、文件讀取等編程。連連看游戲引擎包含在視圖類(lèi)中。游戲引擎是一個(gè)抽象的概念,用于實(shí)現(xiàn)游戲的邏輯功能,通常在一個(gè)獨(dú)立的類(lèi)中,有時(shí)引擎和視圖是一體的,并且可能無(wú)可避免,因?yàn)橐晥D需要為引擎處理用戶輸入和繪圖。游戲程序設(shè)計(jì)一般都采用面向?qū)ο蟮脑O(shè)計(jì)模式,提供了一個(gè)簡(jiǎn)單的圖像顯示接口,利用多文檔視圖結(jié)構(gòu)的面向?qū)ο笤O(shè)計(jì)模式。2.7理論基礎(chǔ)(1)、熟悉JAVA語(yǔ)言基礎(chǔ)(2)、GUI編程GUI是GraphicalUserInterface的縮寫(xiě),圖形化用戶界面布局管理FlowLayout(流式布局管理器)從左到右的順序排列。BorderLayout(邊界布局管理器)東,南,西,北,中GridLayout(網(wǎng)格布局管理器)事件處理機(jī)制事件:用戶對(duì)組件的一個(gè)操作。事件源:發(fā)生事件的組件。監(jiān)聽(tīng)器:我們需要處理某個(gè)事件,就需要在發(fā)生事件的組件上添加監(jiān)聽(tīng)器;事件處理器:監(jiān)聽(tīng)器中的方法。監(jiān)聽(tīng)器被添加在組件上之后,組件上發(fā)生了對(duì)應(yīng)事件就會(huì)執(zhí)行指定方法。動(dòng)作事件,ActionEvent,在某一組件上發(fā)生了定義好的動(dòng)作,例如按鈕上鼠標(biāo)點(diǎn)擊或按空格,菜單上鼠標(biāo)點(diǎn)擊或按回車(chē)等。(3)MyEclipse的操作。2.8開(kāi)發(fā)目標(biāo)系統(tǒng)能夠提供友好的用戶界面,使操作人員的心情放松;系統(tǒng)具有良好的運(yùn)行效率,能夠得到快速發(fā)現(xiàn)自我的目的;系統(tǒng)應(yīng)有良好的可擴(kuò)充性,可以容易的轉(zhuǎn)入其它系統(tǒng)應(yīng)用;平臺(tái)的設(shè)計(jì)具有一定的靈活性。2.9本章小結(jié)這一章介紹了連連看應(yīng)該具備的功能模塊,了解了什么是連連看,當(dāng)前連連看系統(tǒng)的系統(tǒng),還有一個(gè)連連看系統(tǒng)應(yīng)該的開(kāi)發(fā)目標(biāo)。通過(guò)本次畢業(yè)設(shè)計(jì),讓我們掌握如何制作一個(gè)游戲軟件,以及制作游戲軟件的整個(gè)流程,制作游戲軟件的步驟,讓學(xué)生熟悉項(xiàng)目開(kāi)發(fā)的完整過(guò)程,為即將到來(lái)的就業(yè)工作打下基礎(chǔ)。另外也通過(guò)本次設(shè)計(jì)將三年來(lái)所學(xué)的專(zhuān)業(yè)知識(shí)和其他方面的知識(shí)融入到實(shí)際應(yīng)用中,在實(shí)際運(yùn)用中學(xué)習(xí)和掌握J(rèn)ava程序開(kāi)發(fā)的全過(guò)程,進(jìn)一步熟悉掌握J(rèn)ava程序設(shè)計(jì)語(yǔ)言的基礎(chǔ)內(nèi)容、基本技能和方法,同時(shí)培養(yǎng)學(xué)生進(jìn)行分析問(wèn)題、解決問(wèn)題的能力;培養(yǎng)學(xué)生進(jìn)行設(shè)計(jì)分析、設(shè)計(jì)方法、設(shè)計(jì)操作與測(cè)試、設(shè)計(jì)過(guò)程的觀察、理解和歸納能力的提高。(1)主要是能通過(guò)開(kāi)發(fā)“連連看”這個(gè)小游戲,學(xué)會(huì)Java程序開(kāi)發(fā)的環(huán)境搭建與配置,并提高自己Java程序設(shè)計(jì)編程的實(shí)際能力。(2)進(jìn)一步熟悉掌握J(rèn)ava程序設(shè)計(jì)的基礎(chǔ)內(nèi)容,如用戶圖形界面設(shè)計(jì)(GUI)、Java多線程編程等。(3)大體了解怎樣用Java來(lái)編寫(xiě)小游戲,增強(qiáng)我們實(shí)踐能力和創(chuàng)新精神的綜合培養(yǎng)。
3具體實(shí)現(xiàn)方法3連連看游戲的設(shè)計(jì)這一章將介紹連連看游戲的設(shè)計(jì),從游戲需求分析開(kāi)始,介紹開(kāi)發(fā)環(huán)境和用到的開(kāi)發(fā)工具,系統(tǒng)主要的功能設(shè)計(jì),系統(tǒng)的數(shù)據(jù)流程圖。3.1系統(tǒng)需求分析連連看游戲的設(shè)計(jì)目標(biāo)為:(1)該游戲開(kāi)始前,將設(shè)置一個(gè)用戶登錄注冊(cè)界面,如果沒(méi)有注冊(cè)的玩家在按下“注冊(cè)”按鈕后將進(jìn)入注冊(cè)界面,玩家需要填寫(xiě)用戶名,密碼,性別等信息完成注冊(cè),再進(jìn)入登錄界面,輸入用戶名和密碼按下“確定”后就將進(jìn)入游戲界面,開(kāi)始游戲。(2)游戲中將有“退出”功能,選擇退出命令后程序?qū)⒔K止執(zhí)行,關(guān)閉窗口。還將有“再來(lái)一局”功能,選擇再來(lái)一局命令后程序?qū)?duì)圖片重新排列,重新開(kāi)始游戲。該游戲還有一個(gè)時(shí)間倒計(jì)時(shí)的進(jìn)度條,提醒玩家剩余的時(shí)間,增加游戲的難度。在界面的頂部有計(jì)分功能,當(dāng)玩家消去圖片后就會(huì)贏得相應(yīng)的分?jǐn)?shù)。3.2系統(tǒng)開(kāi)發(fā)及運(yùn)行環(huán)境硬件平臺(tái):CPU:P41.8GHz。內(nèi)存:256MB以上。軟件平臺(tái):操作系統(tǒng):WindowsXP。數(shù)據(jù)庫(kù):MySQL5.0。開(kāi)發(fā)工具包:JDKVersion1.6.2。JSP服務(wù)器:Tomcat6.0。瀏覽器:IE5.0,推薦使用IE6.0。3.3系統(tǒng)主要功能要求本系統(tǒng)針對(duì)中小學(xué)生的娛樂(lè)時(shí)間,通過(guò)程序中的線程、布局以及用戶登錄還有另外的一些功能進(jìn)行有效管理。本系統(tǒng)主要實(shí)現(xiàn)如下功能:系統(tǒng)采用圖片連連看的方式,界面美觀友好,用戶使用靈活、方便、快捷、準(zhǔn)確,數(shù)據(jù)存儲(chǔ)安全可靠。實(shí)現(xiàn)圖片的消除、排列清晰。計(jì)分自動(dòng)完成,提高工作效率。實(shí)現(xiàn)多條件查詢??煞奖憧旖莸剡M(jìn)行下一盤(pán)游戲,并且兩盤(pán)的分?jǐn)?shù)在規(guī)定的時(shí)間內(nèi)會(huì)疊加起來(lái)。操作員可以隨時(shí)退出游戲。系統(tǒng)最大限度地實(shí)現(xiàn)了易維護(hù)性和易操作性。系統(tǒng)運(yùn)行穩(wěn)定、安全可靠。3.4連連看系統(tǒng)總體結(jié)構(gòu)連連看是基于Java基本知識(shí)設(shè)置的一個(gè)小游戲,剛開(kāi)始的時(shí)候有一個(gè)用戶登陸界面,要是沒(méi)有賬號(hào)的可以先申請(qǐng)一個(gè)。最中間有連連看的主體構(gòu)成——連連看圖片,上面有計(jì)分、時(shí)間條,下面有退出、再來(lái)一局按鍵。一個(gè)標(biāo)準(zhǔn)的連連看系統(tǒng)應(yīng)該包括以下幾大功結(jié)構(gòu):(1)鼠標(biāo)操作模塊;(2)圖像處理模塊;(3)聲音信息模塊;(4)菜單模塊;(5)界面顯示模塊。3.5游戲的設(shè)計(jì)3.5.1功能設(shè)計(jì)(1)、用戶可以通過(guò)點(diǎn)擊菜單中的“開(kāi)始游戲”選項(xiàng),開(kāi)始新游戲程序。程序會(huì)載入圖片,并通過(guò)特定的算法排列圖片,并標(biāo)記圖片,以便判斷圖片是否相同。記錄圖片坐標(biāo),以方便計(jì)算圖片是否可以相連。確定圖片大小,以確定用戶點(diǎn)擊的是那張圖片。(2)、用戶選擇兩張一樣的圖片,通過(guò)鼠標(biāo)進(jìn)行選取,如果用戶兩次點(diǎn)擊的圖片不相同,那么系統(tǒng)認(rèn)為用戶沒(méi)有點(diǎn)(鼠標(biāo)記數(shù)歸0),以完成用戶以后的選取工作。如果用戶選擇的是相同的圖片,那么系統(tǒng)會(huì)消除這兩張圖片,并使鼠標(biāo)記數(shù)為0,并消除這兩張圖片的標(biāo)記,使里面的圖片被標(biāo)記在外面。以便用戶可以進(jìn)行以后的選擇。(3)、用戶也可使通過(guò)使用“刷新”功能進(jìn)行圖片重新排版。(4)、用戶點(diǎn)擊提示系統(tǒng)將通過(guò)連線,提示用戶下一步可消除的圖片(5)、用戶點(diǎn)擊演示,系統(tǒng)自動(dòng)完成游戲3.5.2游戲模塊設(shè)計(jì)根據(jù)對(duì)“連連看”游戲的分析,該游戲可分為三個(gè)模塊:算法模塊、界面顯示模塊、菜單控制模塊。如下圖3-1所示:圖3-1游戲流程模塊圖3.5.3算法模塊(1).圖片路徑處理設(shè)計(jì)這里實(shí)質(zhì)上是一種遞歸的思想,要判斷圖片A與圖片B能否通過(guò)一條有N個(gè)轉(zhuǎn)角的路徑相連,可以轉(zhuǎn)化為判斷能否找到圖片C,C與A能直線相連,且C與B能用一條有N-1個(gè)轉(zhuǎn)角的路徑相連。若這樣的圖片C存在,那么A與B就可以通過(guò)一條有N個(gè)轉(zhuǎn)角的路徑相連。根據(jù)轉(zhuǎn)角數(shù)不得超過(guò)2個(gè)的規(guī)則,我們可以分為轉(zhuǎn)角數(shù)分別為0個(gè)、1個(gè)、2個(gè)這三種情況分別討論。①0轉(zhuǎn)角連通(直線連通):兩個(gè)圖片的縱坐標(biāo)或橫坐標(biāo)相等,且兩者連線間沒(méi)有其他圖案阻隔。②一個(gè)轉(zhuǎn)角連通:其實(shí)相當(dāng)于兩個(gè)圖片的橫向與縱向的直線相交只有一個(gè)焦點(diǎn)。圖3-2一個(gè)轉(zhuǎn)角連通③兩個(gè)轉(zhuǎn)角連通:判斷圖片A與圖片B能否經(jīng)過(guò)有兩個(gè)轉(zhuǎn)角的路徑連通實(shí)質(zhì)上可以轉(zhuǎn)化為判斷能否找到一個(gè)點(diǎn)C,這個(gè)C點(diǎn)與A可以直線連通,且C與B可以通過(guò)有兩個(gè)轉(zhuǎn)角的路徑連通。若能找到這樣一個(gè)C點(diǎn),那么A與B就可以經(jīng)過(guò)有兩個(gè)轉(zhuǎn)角的路徑連通。判斷是否經(jīng)兩個(gè)轉(zhuǎn)角連通的算法需要做兩個(gè)方向上的掃描:水平掃描和垂直掃描。水平判斷。如下圖所示,為了判斷A,B能否通過(guò)2個(gè)轉(zhuǎn)角連通,則從A開(kāi)始在水平方向上向左右掃描,并判斷經(jīng)過(guò)的點(diǎn)能否與B點(diǎn)經(jīng)過(guò)1個(gè)轉(zhuǎn)角連通。顯然C點(diǎn)能與B點(diǎn)經(jīng)1個(gè)轉(zhuǎn)角連通,故A,B能經(jīng)2個(gè)轉(zhuǎn)角連通。圖3-3兩個(gè)轉(zhuǎn)角連通的判斷垂直判斷。如下圖所示,為了判斷A,B能否通過(guò)2個(gè)轉(zhuǎn)角連通,則從A開(kāi)始在垂直方向上下掃描,并判斷經(jīng)過(guò)的點(diǎn)能否與B點(diǎn)經(jīng)過(guò)1個(gè)轉(zhuǎn)角連通。顯然C點(diǎn)能與B點(diǎn)經(jīng)1個(gè)轉(zhuǎn)角連通,故A,B能經(jīng)2個(gè)轉(zhuǎn)角連通。圖3-4兩個(gè)轉(zhuǎn)角連通的判斷(2).獲取圖片位置設(shè)計(jì)首先,最基本的就是用button代替圖片進(jìn)行布局了,然后將圖片set到button用來(lái)做背景圖片。這里采用最簡(jiǎn)單的方法——數(shù)組??紤]到圖片是多行多列的格式。所以采用二維數(shù)組(數(shù)組名為game_grid[][]方式來(lái)控制比較直觀,并且為了程序容易解讀,統(tǒng)一在不同過(guò)程中用名為i和j的變量來(lái)分別表示行列。程序開(kāi)始時(shí)給數(shù)組中的各個(gè)元素賦初值為0,即表示沒(méi)有圖片。然后數(shù)組控制整個(gè)游戲區(qū)域,游戲區(qū)域最外圍為空白區(qū)域,即相關(guān)元素的值為0。這樣就可以保證游戲剛開(kāi)始后,第二層顯示的圖片之間的相連路徑處理時(shí)就沒(méi)有阻礙了。這個(gè)游戲考慮到玩家對(duì)圖片的愛(ài)好不同,故可以自由修改。將數(shù)組game_grid
的數(shù)據(jù)與圖片名匹配(如:game_grid的數(shù)據(jù)為1~25則圖片名為1,2...25與之一一對(duì)應(yīng)),玩家則只需要將自己喜歡的圖片改變圖片名字去替換就可以了。
其button背景圖片的方法是用ImageIcon來(lái)存儲(chǔ)圖片信息然后set到button中。3.5.4界面顯示模塊(1).游戲界面設(shè)計(jì)(2).游戲過(guò)關(guān)、失敗的設(shè)計(jì)3.5.5菜單控制模塊(1).開(kāi)始游戲(2).重新開(kāi)始(3).刷新(4).提示(5).演示(6).游戲難度選擇如下圖3-5所示難度選擇游戲關(guān)于開(kāi)始開(kāi)始演示判斷是否滿足要求否難度選擇游戲關(guān)于開(kāi)始開(kāi)始演示判斷是否滿足要求否是消除圖片刷新提示全部消除游戲結(jié)束圖3-5菜單控制模塊3.5.6地圖設(shè)計(jì)地圖的設(shè)計(jì)是采用GUI編程的網(wǎng)格布局,定義一個(gè)八行八列的網(wǎng)格布局,使用16個(gè)數(shù)字然后隨機(jī)產(chǎn)生四個(gè)數(shù)字,用二維數(shù)組把它們打亂放到八行八列的網(wǎng)格布局中,注意的是二維數(shù)組的下標(biāo)要和網(wǎng)格布局是的行、列數(shù)相同。3.5.7算法設(shè)計(jì)在檢驗(yàn)兩個(gè)方塊能否消掉的時(shí)候,我們要讓兩個(gè)方塊同時(shí)滿足兩個(gè)條件才行,就是兩者配對(duì)并且連線成功。分3種情況:從下面的這三種情況,我們可以知道,需要三個(gè)檢測(cè),這三個(gè)檢測(cè)分別檢測(cè)一條直路經(jīng)。這樣就會(huì)有三條路經(jīng)。若這三條路經(jīng)上都是空按鈕,那么就剛好是三種直線(兩個(gè)轉(zhuǎn)彎點(diǎn))把兩個(gè)按鈕連接起來(lái)了。(1)、相鄰(2)、若不相鄰的先在第一個(gè)按鈕的同行找一個(gè)空按鈕。1.找到后看第二個(gè)按鈕橫向到這個(gè)空按鈕所在的列是否有按鈕。2.沒(méi)有的話再看第一個(gè)按鈕到與它同行的那個(gè)空按鈕之間是否有按鈕。3.沒(méi)有的話,再?gòu)呐c第一個(gè)按鈕同行的那個(gè)空按鈕豎向到與第二個(gè)按鈕的同行看是否有按鈕。沒(méi)有的話路經(jīng)就通了可以消了.(3)、若(2)失敗后,再在第一個(gè)按鈕的同列找一個(gè)空按鈕。1.找到后看第二個(gè)按鈕豎向到這個(gè)空按鈕所在的行是否有按鈕2.沒(méi)有的話,再看第一個(gè)按鈕到與它同列的那個(gè)空按鈕之間是否有按鈕。3.沒(méi)有的話,再?gòu)呐c第一個(gè)按鈕同列的那個(gè)空按鈕橫向到與第二個(gè)按鈕同列看是否有按鈕。沒(méi)有的話路經(jīng)就通了,可以消了。若以上三步都失敗,說(shuō)明這兩個(gè)按鈕不可以消去。具體判斷流程見(jiàn)下圖 圖3-6判斷流程
(4)、圖片成對(duì)加載并打亂將圖片成對(duì)的顯示在場(chǎng)景中,并打亂主要用的是Map類(lèi)。在該類(lèi)中,用了一個(gè)數(shù)組以數(shù)字標(biāo)記的形式來(lái)記錄加載的圖片是哪種圖片,在每次加載圖片的時(shí)候是一張圖片連續(xù)加載兩次,以保證加載圖片成對(duì)。然后用數(shù)組的隨機(jī)方法將數(shù)組打亂。(5)、判斷兩圖是否能夠相連兩圖能相連的所有情況如圖3-7:圖3-7兩圖可連情況示例3.5.8類(lèi)的設(shè)計(jì)在設(shè)計(jì)連連看小游戲是,要編寫(xiě)6個(gè)Java源文件:Control.Java,LoadAndSave.Java,Model.Java,GamePanel.Java,ImageLoader.Java,MainFrame.Java(1)Control.Java監(jiān)聽(tīng)器類(lèi)。主要用于接收用戶操作時(shí)發(fā)出的指令以及中轉(zhuǎn)發(fā)送。如圖3-8所示圖3-8Control.Java監(jiān)聽(tīng)類(lèi)(2)LoadAndSave.Java游戲數(shù)據(jù)部分。主要用于存儲(chǔ)用戶得分情況,以及載入時(shí)加載圖片的算法(3)Model.Java驅(qū)動(dòng)類(lèi)。用于處理接收到的用戶動(dòng)作指令,以及初始化時(shí)用到的一切算法。如:設(shè)置游戲難度,圖片可消除判斷等。(4)GamePanel.Java繪制類(lèi)。用于游戲是繪制選中時(shí)的邊框,和連接兩個(gè)相同圖片的連線。 publicvoidshowPath(finalObjectobj){ newThread(newRunnable(){ ArrayList<Point>points=(ArrayList<Point>)obj; ArrayList<Shape>shapes=newArrayList<Shape>(); intstep=30; publicvoidrun(){ //添加起點(diǎn)矩形 shapes.add(matrixToRect(points.get(0))); //添加終點(diǎn)矩形 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圖片加載器。用于加載庫(kù)中的圖片。(5)MainFrame.Java主窗體繪制。所有游戲中可見(jiàn)窗體的繪制。項(xiàng)目層次結(jié)構(gòu)如圖3-10:圖3-10項(xiàng)目層次結(jié)構(gòu)3.5.9算法設(shè)計(jì)(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) //獲得圖片的編號(hào) 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) //加載圖標(biāo) 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) //在已編號(hào)處加載圖片 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ǔ)上實(shí)現(xiàn)了連連看游戲的設(shè)計(jì),實(shí)現(xiàn)了連連看游戲的背景顯示功能、菜單功能、以及連連看游戲中的核心算法。在菜單功能模塊中針對(duì)每個(gè)菜單的命令進(jìn)行了詳細(xì)的解釋和闡釋實(shí)現(xiàn)了每一個(gè)子菜單的命令。在連接算法中,給出了每一個(gè)算法的程序邏輯了和詳細(xì)的算法實(shí)現(xiàn)。并且還繪制出了每一種連接情況的具體圖片。在連連看游戲的其他算法中列出了時(shí)間進(jìn)度顯示的實(shí)現(xiàn)方法和一些重要的數(shù)據(jù)結(jié)構(gòu),在此可以結(jié)合程序詳細(xì)的研究。
4運(yùn)行結(jié)果及論證4游戲運(yùn)行及測(cè)試分析4.1程序運(yùn)行情況點(diǎn)擊菜單中的開(kāi)始游戲后的界面,連連看游戲規(guī)則很簡(jiǎn)單,就是點(diǎn)中兩個(gè)互相匹配并且可以通過(guò)不多于兩個(gè)折點(diǎn)的折線連相同的圖片,然后消去。下圖是開(kāi)始游戲后的界面效果選擇游戲難度(圖)點(diǎn)擊開(kāi)始,開(kāi)始當(dāng)前難度游戲,如果不選擇難度,則難度1到9隨機(jī)點(diǎn)擊刷新則所有圖片隨機(jī)改變位置其總數(shù)不變。提示,可以根據(jù)算法隨機(jī)提示一組可以消去的圖片。點(diǎn)擊演示,電腦將自動(dòng)完成消除,每一步都有邊框以及連線顯示,直到所有方塊消除完畢圖片由用戶消除完畢,則如下圖顯示由于用戶每次只能消除一對(duì)圖形,即只會(huì)用到一個(gè)最短路徑,但由于實(shí)現(xiàn)并不知道用戶會(huì)選擇哪一對(duì)圖形,所以需要事先計(jì)算出所有可能的最短路徑并保存起來(lái)。此外,采用這種方法的話似乎每次用戶消去一對(duì)相同圖像之后都需要重新計(jì)算出當(dāng)前所有可能被連接的相同圖形之間最短路徑,這是因?yàn)楫?dāng)某些圖像被消去之后可能會(huì)產(chǎn)生很多新路徑,而我們又不能確定這些空出來(lái)的格子到底能夠影響哪些路徑,所以就只好都重新計(jì)算一遍。4.2測(cè)試計(jì)劃及分析4.2.1檢驗(yàn)的先后順序在檢驗(yàn)兩個(gè)方塊能否消掉的時(shí)候,我們要讓兩個(gè)方塊同時(shí)滿足兩個(gè)條件才行,就是兩者配對(duì)并且連線成功。所以,這里應(yīng)該先檢驗(yàn)配對(duì),如果該條件不成立的話,就不要再進(jìn)行連線檢查了,這樣可以避免很多不必要的復(fù)雜運(yùn)算。當(dāng)然,如果你在做這個(gè)游戲的時(shí)候,配對(duì)規(guī)則不夠如此簡(jiǎn)單的話,那么就看哪個(gè)算起來(lái)麻煩就把它放在后面。4.2.2程序異常處理本程序沒(méi)有涉及到程序的異常處理,只有關(guān)于“死鎖”問(wèn)題,本質(zhì)上還是判別兩個(gè)格子是否可以消去的問(wèn)題。最直接的方法就是,對(duì)于游戲中尚未消去的格子,兩兩都計(jì)算一下,它們是否可以消去。此外,從上面的廣度優(yōu)先搜索可以看出,我們每次都是擴(kuò)展出起始格子A(x1,y1)能夠到達(dá)的格子。也就是說(shuō),對(duì)于每一個(gè)格子,我們可以調(diào)用一次上面的擴(kuò)展過(guò)程,得到所有可以到達(dá)的格子,如果這些格子中有任意一個(gè)跟起始格子的圖形一致,則它們可以消去,目前游戲我還沒(méi)有發(fā)現(xiàn)“死鎖”狀態(tài)。
總結(jié)“連連看”游戲的基本功能都已經(jīng)實(shí)現(xiàn)了,其中很多變量之間數(shù)據(jù)的傳遞都很復(fù)雜,要搞不明白就沒(méi)辦法再往下做了,路徑判斷問(wèn)題中用到數(shù)據(jù)結(jié)構(gòu)的知識(shí),也很抽象,代碼量也很大,另外這個(gè)游戲不會(huì)用到數(shù)據(jù)庫(kù),所用功能也很少,只需要判斷用戶每次鼠標(biāo)點(diǎn)擊的坐標(biāo)以及當(dāng)前坐標(biāo)位置代表的圖片內(nèi)容就好了通過(guò)這次“連連看”游戲的設(shè)計(jì)使我懂得了理論與實(shí)際相結(jié)合是很重要的,只有理論知識(shí)是遠(yuǎn)遠(yuǎn)不夠的,只有把所學(xué)的理論知識(shí)與實(shí)踐相結(jié)合起來(lái),從理論中得出結(jié)論,才能真正的提高自己的水平,從而提高自己的實(shí)際動(dòng)手能力和獨(dú)立思考的能力。在設(shè)計(jì)的過(guò)程中遇到問(wèn)題,可以說(shuō)得是困難重重,并且還發(fā)現(xiàn)了自己的許多不足之處,對(duì)以前所學(xué)過(guò)的知識(shí)理解得不夠深刻,掌握得不夠牢固。同時(shí)在這次的設(shè)計(jì)中也小小的體驗(yàn)了一下做項(xiàng)目的感受,我完成了這次Java項(xiàng)目設(shè)計(jì),不過(guò)這只是我學(xué)習(xí)路上的驛站。我相信我在未來(lái)的學(xué)習(xí)中會(huì)記住從本次項(xiàng)目設(shè)計(jì)中所學(xué)到的東西,并將它用到未來(lái)的學(xué)習(xí)中去。致謝
致謝彈指一揮間,大學(xué)四年已經(jīng)接近了尾聲。四年的艱苦跋涉,幾個(gè)月的精心準(zhǔn)備,畢業(yè)設(shè)計(jì)終于到了劃句號(hào)的時(shí)候,心頭照例該如釋重負(fù),但創(chuàng)作過(guò)程中常常出現(xiàn)的輾轉(zhuǎn)反側(cè)和力不從心之感卻揮之不去。畢業(yè)設(shè)計(jì)創(chuàng)作的過(guò)程并不輕松:各種壓力的時(shí)時(shí)襲擾,知識(shí)積累的尚欠火候,致使我一次次埋頭于圖書(shū)館中,一次次在深夜奮力敲打鍵盤(pán)。第一次花費(fèi)如此長(zhǎng)的時(shí)間和如此多的精力,完成一套設(shè)計(jì)作品,其中的艱辛與困難難以訴說(shuō),但曲終幕落后留下的滋味,是值得我一生慢慢品嘗的。在這里需要的感謝的人很多,是他們讓我這大學(xué)四年從知識(shí)到人格上有了一個(gè)全新的改變。四年間,每次走進(jìn)通信系都會(huì)讓我感受到一種親切熱情的氛圍。無(wú)論是學(xué)習(xí)、工作生活上的問(wèn)題,恩師們都會(huì)悉心給以指導(dǎo)解答,讓我倍受感動(dòng)。也就是在這里,給我的大學(xué)生涯設(shè)計(jì)點(diǎn)上了第一個(gè)逗號(hào)。我的學(xué)術(shù)論文創(chuàng)作的開(kāi)始,也是從這里起步的。從某種意義上可以說(shuō),今日的畢業(yè)論文(設(shè)計(jì))其實(shí)從大一時(shí)已經(jīng)開(kāi)始了。通信系的老師們,給我四年的學(xué)習(xí)、成長(zhǎng)創(chuàng)造了一個(gè)良好的環(huán)境,引導(dǎo)我充分利用學(xué)校的學(xué)習(xí)資源,去發(fā)展、充實(shí)自我,而不曾虛度光陰。在此,我真誠(chéng)的向你們道一聲:“謝謝!”。
感謝我的指導(dǎo)老師王鵬老師,夠順利完成畢業(yè)設(shè)計(jì),離不開(kāi)他的悉心指導(dǎo),他對(duì)我的設(shè)計(jì)從確定題目、修改直到完成,給予了我許多的指點(diǎn)和幫助。感謝他在繁忙的工作之余,擠出時(shí)間對(duì)設(shè)計(jì)提出精辟的修改意見(jiàn)。在此,向王老師致以最誠(chéng)摯的謝意。最后我也要感謝我的母校河北工程大學(xué)四年來(lái)對(duì)我的培養(yǎng)。以及所有教給我知識(shí)的老師們祝你們工作順利、身體健康!祝母校的明天越來(lái)越美好!參考文獻(xiàn)
參考文獻(xiàn)[1]張明新,周耿烈.Java語(yǔ)言程序設(shè)計(jì).重慶:重慶大學(xué)出版社,2004.[2]周曉聰,李文軍,李師賢.面向?qū)ο蟪绦蛟O(shè)計(jì)與Java語(yǔ)言.北京:機(jī)械工業(yè)出版社,2004.[3]BruceEckel.Java編程思想.北京:機(jī)械工業(yè)出版社,2007.[4]JamesCohoon,JackDavidson.Java程序設(shè)計(jì).北京:清華大學(xué)出版社,2005.[5]StevenHolzner.Java技術(shù)內(nèi)幕.北京:機(jī)械工業(yè)出版社,2002.[6]張洪斌.Java程序設(shè)計(jì)百事通.北京:清華大學(xué)出版社,2001.[7]夏先波.JavaJDK實(shí)例寶典.北京:電子工業(yè)出版社,2007.[8]吳其慶.Java程序設(shè)計(jì)經(jīng)典教程.北京:冶金工業(yè)出版社,2005.[9]耿祥義,張躍平.Java2實(shí)用教程.北京:清華大學(xué)出版社,2007.[10]蔡勇,姜磊,馬寧,倪文志.Java2程序設(shè)計(jì)基礎(chǔ)教程與上機(jī)指導(dǎo).北京:清華大學(xué)出版社,2005.[11]林建素,孟康健.《Eclipse開(kāi)發(fā)學(xué)習(xí)筆記》(第1版).北京:電子工業(yè)出版社.2008.4[12]李松林,陳華清,任鑫.《Eclipse寶典》(第1版).北京:電子工業(yè)出版社.2007.[14]BruceEckel.Java編程思想.北京:機(jī)械工業(yè)出版社,2007.[15]JamesCohoon,JackDavidson.Java程序設(shè)計(jì).北京:清華大學(xué)出版社,2005.[16]StevenHolzner.Java技術(shù)內(nèi)幕.北京:機(jī)械工業(yè)出版社,2002.[3](美)KarlAvedal,DannyAyers,TimothyBriggs.JSP編程指南[M].電子工業(yè)出版社,2004,47-125.[17](美)MarkLinsenbardt.JSP在數(shù)據(jù)庫(kù)中的應(yīng)用與開(kāi)發(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. 本站所有資源如無(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年湖北道路客運(yùn)輸從業(yè)資格證到期換證考試
- 2024年山東客運(yùn)資格證考試內(nèi)容
- 2024年石家莊客運(yùn)駕駛從業(yè)資格考試題庫(kù)及答案
- 2024年呼和浩特客運(yùn)資格證題庫(kù)下載軟件
- 防范電信詐騙小知識(shí)
- 賽項(xiàng)規(guī)程-中職學(xué)生組(民樂(lè))
- 江蘇省連云港市灌南縣2024-2025學(xué)年高二上學(xué)期11月期中考試語(yǔ)文試題(無(wú)答案)
- 小學(xué)生詞語(yǔ)學(xué)習(xí)分類(lèi)總結(jié)
- 通信工程師聘用合同協(xié)議書(shū)
- 管理會(huì)計(jì)實(shí)務(wù) 課件 情境三 謀而后定:企業(yè)戰(zhàn)略執(zhí)行的有效工具
- 能源調(diào)度中心方案
- 2024年高考英語(yǔ)模擬試卷3(九省新高考卷) (二)
- 《建筑工程制圖》題庫(kù)
- 工程聯(lián)系單表格樣本
- 新媒體運(yùn)營(yíng)智慧樹(shù)知到期末考試答案章節(jié)答案2024年黑龍江職業(yè)學(xué)院
- 耳鼻喉科病例討論模板
- 《道路行駛記錄儀檢測(cè)裝置校準(zhǔn)規(guī)范-公示稿》
- 低分學(xué)生提升計(jì)劃小學(xué)數(shù)學(xué)
- 滑坡泥石流-高中地理省公開(kāi)課金獎(jiǎng)全國(guó)賽課一等獎(jiǎng)微課獲獎(jiǎng)
- 人工智能職業(yè)生涯規(guī)劃報(bào)告總結(jié)
- 主題班隊(duì)會(huì)教學(xué)設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論