版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
PAGE第PAGEII頁共26頁分類號:TP311UDC:D10621-408-(2007)6154-0密級:公開編號:2002801081成都信息工程學院學位論文基于JavaME無線網(wǎng)絡移動端的俄羅斯方塊游戲的實現(xiàn)論文作者姓名:胡昊天申請學位專業(yè):網(wǎng)絡工程申請學位類別:工學學士李曉崗(高級工程師)論文提交日期:200基于JavaME無線網(wǎng)絡移動端的俄羅斯方塊游戲的實現(xiàn)摘要本系統(tǒng)是一個基于JavaME平臺的無線網(wǎng)絡移動端的俄羅斯方塊游戲,利用JavaMEWirelessToolkit(WTK)開發(fā)包工具在無線網(wǎng)絡移動端上實現(xiàn)經(jīng)典的俄羅斯方塊游戲。論文開始部分對無線網(wǎng)絡移動系統(tǒng)開發(fā)中常使用幾種開發(fā)語言和環(huán)境作了比較,說明了選擇JavaMEWirelessToolkit作為開發(fā)環(huán)境的的原因并對它作了相關的介紹。并展示了在WTK中打開一個項目、把源文件打包成JAR包、產(chǎn)生混淆包的方法和過程。在系統(tǒng)設計時,遵循了無線網(wǎng)絡移動端程序的startApp、pauseApp、destroyApp的開發(fā)生命周期。在設計與實現(xiàn)方面,分成難度選擇、游戲規(guī)則、方塊處理這幾個模塊進行實現(xiàn)。在開發(fā)與實現(xiàn)的同時也講解了俄羅斯方塊這款古老而經(jīng)典游戲的游戲背景、規(guī)則以及相關特性。最終展示了無線網(wǎng)絡移動端的游戲開發(fā)的基本開發(fā)過程和設計思路。關鍵詞:無線網(wǎng)絡移動端;JavaME;俄羅斯方塊;游戲開發(fā)RealizationoftheTETRISGameBasedOnMobilePlatformofJavaMEWireAbstractPuzzlegamesareaprettyinterestingtypeofgametocreateforJavaME.TETRISisagreatexampleofamixofpuzzleandaction.TETRISisoneofthefewgamesthatachieveultimatepopularity.Itisremarkablysimple,yetremarkablydifficult.ThesystemisaTETRISwhichisbasedontheplatformofJavaMEmobilewireless,applyingJavaMEWirelessToolkit(WTK)toachieveusingTETRISinsimulator.ThisarticleoffersabriefintroductionaboutthedevelopmentofJavaMEWirelessToolkit.Thedesignandthedevelopmentareincludingthreeparts:TETRIS’srules,theselectingofdifficultyandthedisposingofpieces.Intheprocessofdevelopmentandimplementation,thearticlealsointerpretstheTETRIS'srulesandTETRIS’scharacterstoshowalltheprocessofthedevelopmentanddesign.Keywords:wirelessnetworkUE;JavaME;TETRIS;gamedevelopment目錄論文總頁數(shù):25頁1. 引言 11.1 系統(tǒng)綜述 11.2 JavaME游戲開發(fā)背景 11.3 無線網(wǎng)絡移動端游戲發(fā)展現(xiàn)狀 12 開發(fā)環(huán)境介紹 22.1 編程環(huán)境的選擇 22.2 JavaMEWirelessToolkit(WTK)簡介 42.3 JavaMEWirelessToolkit(WTK)開發(fā)環(huán)境的簡介 53 游戲設計 73.1 俄羅斯方塊游戲的背景 73.2 俄羅斯方塊游戲的規(guī)則 73.3 俄羅斯方塊游戲的特性 74 游戲系統(tǒng)分析設計 84.1 系統(tǒng)解決方案 84.2 系統(tǒng)總體結構 84.2.1 難度選擇模塊 94.2.2 方塊處理模塊 94.2.3 游戲規(guī)則模塊 94.3 游戲中斷處理流程 105 系統(tǒng)實現(xiàn)與測試 105.1 系統(tǒng)源文件結構 105.2 難度選擇模塊 115.2.1 難度選擇模塊結構 115.2.2 難度選擇模塊功能 125.3 游戲規(guī)則模塊功能 145.3.1 游戲規(guī)則模塊結構 145.3.2 游戲規(guī)則模塊功能 155.4 方塊處理模塊 175.4.1 方塊處理模塊結構 175.4.2 方塊處理模塊功能 20結論 23參考文獻 23致謝 23聲明 25第25頁共25頁引言系統(tǒng)綜述綜合運用以前所學專業(yè)知識,在JavaME開發(fā)平臺上實現(xiàn)無線網(wǎng)絡移動端的俄羅斯方塊游戲。其研究主要包括以下內容:第一,克服有限的可視屏幕尺寸,使游戲正常顯示;第二,解決有限的可用內存調用問題,實現(xiàn)游戲流暢運行;第三,俄羅斯方塊游戲規(guī)則算法在JavaME平臺的實現(xiàn),保證游戲可玩性;第四,游戲開始、結束等邏輯在游戲進行中的判斷。本系統(tǒng)在WindowsXP的操作系統(tǒng)下,JavaMicroEditionWirelessToolkit2.1為開發(fā)工具,用中文版UltraEdit做為代碼編輯器而實現(xiàn)的。JavaME游戲開發(fā)背景游戲開發(fā)是藝術與編程技術相結合的完美表現(xiàn)。利用Java的“Writeonce,runanywhere”特性,可以真正達到程序只寫一次,在任何平臺都可以執(zhí)行。同時Java語言對面向對象的良好支持,使開發(fā)具有高效性。所以JavaME(JavaMicroEdition)是廣大無線網(wǎng)絡移動端游戲開發(fā)廠商和游戲開發(fā)愛好者的首選平臺。無線網(wǎng)絡移動端游戲發(fā)展現(xiàn)狀縱觀IT產(chǎn)業(yè)的歷史,計算機游戲已經(jīng)成為技術創(chuàng)新背后的動力之一。計算機游戲者渴望更加強大的硬件計算能力,渴望不受不同的軟件的限制——無論是將圖形強制在人工智能(AI)上還是網(wǎng)絡安全性。而無線網(wǎng)絡移動端游戲已成為IT產(chǎn)業(yè)中增長最快的部分之一。無線網(wǎng)絡移動端是一個嶄新的游戲開發(fā)平臺。在眾多種類的游戲當中,只有幾種游戲類型是適合開發(fā)成無線網(wǎng)絡移動端游戲的。低激烈程度的游戲;簡單街機游戲;運動類“情景”游戲;簡單的運動類游戲;解謎或簡單的匹配游戲;主題測試游戲。在上面的游戲種類中,我選擇了經(jīng)典的方塊匹配游戲:俄羅斯方塊。俄羅斯方塊有著舉世聞名的游戲性且非常直觀。某些與墜落的玩具碎片和它們的形狀有關的東西,使得哪怕新手也會很自然地企圖把它們排列起來,并加以適當組合,就好似俄羅斯方塊觸動了玩家某些內在的感官,使得哪怕是我們當中最雜亂無章的人也要把事情整理妥當。在操控性方面,只需方向鍵就可完成對游戲的全盤控制,這也適合無線網(wǎng)絡移動端游戲的基本特性。俄羅斯方塊要比過去二十年間出現(xiàn)的任何東西都要浪費人們的時間。它被GameSpot評選為歷史上最偉大游戲之一。它的起源實際上要追溯到八十年代中期,盡管它的人氣一直到幾年后才開始顯露出來。游戲的概念十分簡單,如今已經(jīng)成為一種公認的規(guī)則:屏幕頂部以隨機順序落下形狀各異的碎塊,玩家要試圖用它們拼成沒有空隙的行列。玩家是沒法打贏它的,因為堅持得時間越長,游戲速度也就變得越來越快,而游戲的吸引力就在于使玩家頂住碎塊的進攻,支撐的時間比上一次更長。俄羅斯方塊舉世聞名的游戲性,在該游戲新鮮出爐時就顯得非常直觀。某些與墜落的玩具碎片和它們的形狀有關的東西,使得哪怕新手也會很自然地企圖把它們排列起來,并加以適當組合,就好似俄羅斯方塊觸動了玩家某些內在的感官,使得哪怕是最雜亂無章的玩家也要把事情整理妥當。開發(fā)環(huán)境介紹編程環(huán)境的選擇目前,移動開發(fā)有以下四種主流平臺。JavaMicroEdition(JavaME),BinaryRuntimeEnvironmentforWireless(BREW),Symbian和WindowMobileSmartphone。其中:BinaryRuntimeEnvironmentforWireless(BREW)BREW是基于高通公司的CodeDivisionMultipleAcces(CDMA)技術的手機為開發(fā)平臺。它使用C或C++結合BREWAPI來開發(fā)BREW設備上面的程序。和JavaME一樣BREW能夠作為游戲和地磁手機操作系統(tǒng)之間的一個中介。和JavaME不同,BERW也支持本地代碼,能夠專門針對某一手機的處理器而編譯。本地代碼通常比對應的解釋版本要快很多,但在設備之間移植會花費很多技巧。在北美和亞洲有部分無限通信服務提供商。SymbianSymbian是一種開放的操作系統(tǒng),任何設備制造商都能獲得使用許可。Symbian支持C++、Java和VisualBasic等編程語言。但大多數(shù)商業(yè)Symbian游戲都是用C++開發(fā)并作為本地Symbian應用程序,這使得它們和Java開發(fā)的游戲相比更快一些。WindowMobileSmartphone在WindowMobileSmartphone平臺上,可以使用在編寫PocketPC游戲時所用的一樣的工具和API。這意味著要使用C、C++或C#編程語言并結合使用WindowMobileAPI。這里我選用JavaMicroEdition(JavaME)作為開發(fā)平臺。SunMicrosystem公司在1999年6月推出JavaME。JavaME用于為信息家電市場提供應用服務,這些信息家電包括傳呼機、移動電話、個人商務助理(PDA)、電視機頂盒、POS終端以及其他消費電子設備。JavaME體系結構采用模塊化、可擴展的設計。這種設計通過一個3層軟件模型來實現(xiàn)。由于無線移動設備比桌面計算機具有更弱的計算能力和更小的屏幕,JavaME代表著JavaSE的一個簡化功能集,JavaME是JavaSE的一個子集,它支持一個較小的功能集,這些功能適用于無線和有線的移動設備。JavaME包括一組可以靈活調用的開發(fā)工具和豐富的應用程序接口(API)。依靠通用的字節(jié)碼而不是本地應用程序代碼,其程序不需要費多大力氣就可以移植到不同的手機。同時全球手機制造商中,JavaME有著最廣泛的工業(yè)支持。JavaME也是目前最占據(jù)優(yōu)勢的移動軟件開發(fā)技術。并且所有的跡象表明它將保持并可能繼續(xù)擴展它的市場份額。2007年約有4.5億支持Java的手機銷售出去,占據(jù)整個手機市場的75%。按照MIDP規(guī)范開發(fā)的JavaME應用程序叫做MIDlet。因此,用JavaMEMIDP創(chuàng)建的任何游戲實際上都是MIDlet。MIDlet類存儲在Java字節(jié)碼文件中,擴展文件名.class。而MIDlet類必須在發(fā)布之前進行驗證,以確保它們不會執(zhí)行任何非法操作。進行這個預驗證步驟的原因和移動設備所使用的虛擬機的限制有關。為了保證虛擬機盡可能地小且高效,在一個運行時MIDlet類上所執(zhí)行的驗證被最小化。預驗證在編譯之后發(fā)生,并生成一個新的class文件,這個文件是通過驗證后等待測試或發(fā)布的。最后MIDlet打包成JAR文件以便發(fā)布。應用程序描述符(JAD文件)提供了和一個JAR文件中包含的多個MIDlet相關的描述信息。一個MIDlet套件中的JAR文件,能夠提供安裝和訪問單個MIDlet的相應的信息。JavaSDK是用Java進行開發(fā)的一個標準開發(fā)工具包。JavaMEWirelessToolkit(JWT)的作用相當于一個用來和JavaSDK協(xié)同工作的插件,它包括用來驗證和測試MIDlet的一個字節(jié)碼驗證器和幾個JavaME模擬器。JavaME技術架構分為:簡表(Profile)、配置(Configuration)和Java虛擬機(JavaVirtualMachine)3層,它們都構建在本地操作系統(tǒng)之上。其中,簡表層定義了特定系列設備上可用的應用程序編程接口(API)的最小子集;配置層面對的是大量各種不同的小型嵌入式設備,通過定義其配置可以描述硬件的功能;Java虛擬機層是針對在本地操作系統(tǒng)定制的虛擬運行平臺。其架構圖如下:簡表層(Profile)簡表層(Profile)配置層(Configuration)Java虛擬機(JVM)圖1JavaME架構圖按照MIDP規(guī)范開發(fā)的JavaME應用程序叫做MIDlet。用JavaMEMIDP創(chuàng)建的任何游戲實際上都是MIDlet。MIDlet類存儲在Java字節(jié)碼文件中,擴展文件名.class。而MIDlet類必須在發(fā)布之前進行驗證,以確保它們不會執(zhí)行任何非法操作。進行這個預驗證步驟的原因和移動設備所使用的虛擬機的限制有關。為了保證虛擬機盡可能地小且高效,在一個運行時MIDlet類上所執(zhí)行的驗證被最小化。預驗證在編譯之后發(fā)生,并生成一個新的class文件,這個文件是通過驗證后等待測試或發(fā)布的。最后MIDlet打包成JAR文件以便發(fā)布。應用程序描述符(JAD文件)提供了和一個JAR文件中包含的多個MIDlet相關的描述信息。一個MIDlet套件中的JAR文件,能夠提供安裝和訪問單個MIDlet的相應的信息。本系統(tǒng)的編譯環(huán)境選用JavaMEWirelessToolkit(JWT)version2.1,這樣對于游戲中包含的類,字節(jié)碼驗證器在打包前對它們進行驗證。JavaME模擬器可以用來在PC上測試,而不必下載到移動設備上。JavaMEWirelessToolkit(WTK)簡介JavaMEWirelessToolkit(WTK)的全稱是:JavaME無線開發(fā)工具包。這一工具包的設計目的是為了幫助開發(fā)人員簡化JavaME的開發(fā)過程。它的功能包括了編譯、打包、模擬執(zhí)行MIDP應用程序。其中包括了字節(jié)碼驗證器、JavaME模擬器、KToolBar、預配置服務器(provisioningserver)等很有用的工具。該工具箱包含的生成工具、實用程序以及設備仿真器。現(xiàn)在共推出有四個版本,分別是1.0.4,2.0,2.1和2.2。每個版本都包括英語,日語,簡體中文,繁體中文4個語種包。它的功能包括了編譯、打包、模擬執(zhí)行MIDP應用程序。1.0.4版只能夠開發(fā)MIDP1.0應用程序,2.0版只能夠開發(fā)MIDP2.0應用程序,2.1版則可以同時開發(fā)MIDP1.0、JTWI(CLDC1.0,MIDP2.0,WMA1.1)可改用CLDC1.1或加入MMAPI1.1)、自定義(隨機組合Configuration、Profile以及OptionalPackage)三種環(huán)境下的應用程序。2.2版中,WTK全面的支持JTWI規(guī)范。即MIDP2.0、CLDC1.1、WMA2.0、MMAPI1.1、WebServices(JSR172)、FileandPIMAPIs(JSR75)、BluetoothandOBEXAPIs(JSR182)和3DGraphics(JSR184),同時也可以使用該版本開發(fā)面向CLDC1.0和MIDP1.0的應用程序。WTK工具包中的KToolBar是一個可視化的開發(fā)環(huán)境,可以通過一個圖形用戶界面來創(chuàng)建、編譯、打包和測試JavaME應用程序。它也提供了直接的方法來管理MIDlet項目并生成設置。這里我選用WTK2.1作為開發(fā)環(huán)境。安裝WTK2.1后,將得到一個包括多種實用工具的開發(fā)包。以下是安裝顯示的菜單項,見下圖:圖2WTK文件結構無論哪個版本的WTK都會包括以下幾個目錄:appdb目錄:RMS數(shù)據(jù)庫信息apps目錄:WTK自帶的demo程序bin目錄:JavaME開發(fā)工具執(zhí)行文件docs目錄:各種幫助與說明文件lib目錄:JavaME程序庫,Jar包與控制文件session目錄:性能監(jiān)控保存信息wtklib目錄:JWTK主程序與模擬器外觀JavaMEWirelessToolkit(WTK)開發(fā)環(huán)境的簡介打開WTK下的KTookBar。選擇打開項目,WTK會把自身apps目錄下的應用項目全部顯示出來,選擇“打開項目”后,能夠對apps目錄下的MIDlet項目進行開發(fā)更改,見下圖:圖3打開一個項目直接運行MIDP應用程序可以在程序組中直接選擇RunMIDPApplication…。在彈出的對話框中選擇其它路徑中的JAD程序運行。JAD描述文件與其指定的JAR文件需在同一個目錄下。同時運行目錄路徑中不能包含中文。KToolBar的生成功能只能幫將源代碼編譯并預先審核并不會幫產(chǎn)生JAR文件,如果要發(fā)布MIDP程序,除了JAD描述文件,還必須打包成JAR文件。在KToolbar選中Project->Package->CreatePackage,可以把整個程序,包括資源文件打包成JAR文件。形成的JAR保存在項目對應的bin目錄下,如下圖:圖4創(chuàng)建一個包KToolBar除了“產(chǎn)生包”,另外還有“產(chǎn)生混淆包”功能。為了防止別人反編譯后讀取源代碼,將程序(.class文件)進行混淆,經(jīng)過混淆的JavaByteCode可以增加反編譯源代碼的時間。在KToolBar的Edit->Preferences里面提供很多實用的功能,如下圖:圖5選擇Preferences菜單KToolBar除了“產(chǎn)生包”,另外還有“產(chǎn)生混淆包”功能。為了防止別人反編譯后讀取源代碼,將程序(.class文件)進行混淆,經(jīng)過混淆的JavaByteCode可以增加反編譯源代碼的時間。在需要監(jiān)視程序性能的時候,可以在Edit->Preferences里選中“EnableMemoryMonitor”,在下一次模擬器執(zhí)行的時候,就可讀出程序運行時的內存消耗均值,消耗峰值以及具體產(chǎn)生對象的個數(shù)使用情況。除了內存監(jiān)視,還可以執(zhí)行網(wǎng)絡監(jiān)視,設定存儲區(qū)大小和堆棧大小,設定安全簽名和藍牙操作屬性,以盡可能模擬手機實際運行環(huán)境。游戲設計俄羅斯方塊游戲的背景俄羅斯方塊是俄羅斯人阿列克謝·帕基特諾夫(AlexeyPazhitnov)發(fā)明。人們一開始并沒預料到它將會有如此廣泛的吸引力。實際上,在游戲發(fā)明后的數(shù)年間,俄羅斯方塊成了無數(shù)場專利官司和法律糾紛的目標,而許多公司也不遺余力地上陣廝殺,想要將游戲的創(chuàng)意據(jù)為己有。一個最初的版本是Spectrum
Holobyte為IBM兼容機開發(fā)的游戲。1988年,俄羅斯方塊在街機上也變得非常流行,這歸功于Atari,因為他們發(fā)布了一個能讓兩名玩家同時游戲的版本。俄羅斯方塊經(jīng)常被稱為拼圖游戲。玩家需要找出如何能把各塊積木最好的拼在一起的方法。俄羅斯方塊相當于直角的智力拼圖游戲,或者其它一種“在這有限空間內組織幾何體”的拼圖。俄羅斯方塊為了創(chuàng)造真正引人入勝的游戲,它巧妙的平衡了拼圖游戲與動作游戲的機制。因而每個人玩這個游戲都會有一次不同的體驗。俄羅斯方塊所用到的一種動作游戲機制是越來越逼近的威脅感,留給玩家的時間總是非常有限。俄羅斯方塊中積木是從上面落下來。如果玩家不在積木落到屏幕底下或翻轉它,不能給它找一個最有利的位置,這塊積木就可能會堵住某處,而它下面的幾行也就沒有辦法拼接完整,玩家也就離游戲結束又靠近了一行或幾行。在游戲進程中,積木落下來的速度越來越快,這樣對玩家的挑戰(zhàn)也就越來越大,游戲的難度也逐步增加。俄羅斯方塊游戲的規(guī)則俄羅斯方塊游戲的玩法非常簡單易學,游戲界面是一個很高的長方形2D盒子,方塊出現(xiàn)在盒子的上方,這些方塊都由四個小方塊組成,并按照各種方式排列,其中每一個方塊都至少和另一個方塊相連。然后,這些積木慢慢地落向盒子底部,玩家可以把這些方塊左右移動或旋轉。一旦這個方塊碰到阻礙,比如盒底或者另一個方塊,它就會停止,而玩家可以對之加以操作。當屏幕底端的方塊拼滿一橫行時,這個層的方塊就會消失,而這一行以上的所有方塊都會下降一層。而當那些沒有拼完的橫行填滿整個長方形盒子,新的方塊無法再出現(xiàn)時,游戲就結束了。俄羅斯方塊游戲的特性(1)單屏游戲:俄羅斯方塊全部反映在一個屏幕上。玩家可以在同一時間看到整個游戲環(huán)境,在此基礎上決定怎么處理手上的這塊積木。這個游戲當中沒有任何探險成分在內,它不會讓玩家真正大吃一驚,玩家能夠看到讓游戲順利進行下去的所有信息,所以玩家輸了的話只能怪他自己。(2)無限游戲:只要積木還沒有堆到盒頂,俄羅斯方塊就允許玩家一直玩下去,不管他做出了多少錯誤的決定。每次游戲都以失敗而告終,沒有人真正能打敗這個游戲。玩家們總是能找到提高玩俄羅斯方塊技藝的方法,這就是俄羅斯方塊和傳統(tǒng)拼圖游戲的根本不同。一旦玩家拼好了一幅拼圖,只要他還記得他是怎么拼的,那么這個拼圖就對他再也無挑戰(zhàn)了。所以人們通常不會多次玩一個拼圖,但一個設計精巧的游戲卻總能讓人玩上一遍又一遍。俄羅斯方塊正是這樣一個游戲。(3)多條生命:和大多數(shù)的街機游戲不同,最早的俄羅斯方塊只給玩家一條生命。積木一堆到盒子頂部,玩家就輸了。但是游戲的設計允許玩家出現(xiàn)錯誤,同時還不會立即敗下陣來。當積木疊在長方盒子的底部時,玩家可以看到自己所犯的錯誤,在游戲結束前,他還是有時間想一想如何把后面的積木拼放得更合理些。這樣,俄羅斯方塊雖然沒有給玩家多條生命,但卻在玩家重新開始前,給玩家一個改善游戲技巧、獲得一些小小成就的機會。(4)最高分機制:俄羅斯方塊引入一個計分模式,它給玩家計分并把分數(shù)記錄在高分排行榜上。實際上,因為玩家不可能擊敗這個游戲,所以,取得一個更高分數(shù)的可能性就成為玩家反復玩這個游戲真正的動力所在。(5)簡單易學,容易操作:俄羅斯方塊的真正杰出之處在于它的游戲機制簡單平樸,淺顯易懂。玩好這個游戲只需極少的鍵位,所有操作都在屏幕上一覽無余。這意味著,不論是否熟悉計算機游戲,任何人都可以走過來并立即開始玩它。然而,玩家永遠不可能完全掌握這個游戲,因為這個游戲的難度與是遞增并且它在理論上可以玩無限長的時間。游戲系統(tǒng)分析設計系統(tǒng)解決方案本系統(tǒng)在WindowsXP的操作系統(tǒng)下,以JavaMicroEditionWirelessToolkit2.1為開發(fā)工具,用中文版UltraEdit做為代碼編輯器而實現(xiàn)的。在KToolBar開發(fā)包的DefaultColorPhone模擬器下進行調試。系統(tǒng)總體結構系統(tǒng)開發(fā)的主要任務是俄羅斯方塊游戲在無線移動端的實現(xiàn)。本系統(tǒng)的主要實現(xiàn)功能模塊分為:難度選擇模塊、方塊處理模塊、游戲規(guī)則模塊。難度選擇模塊用戶在title屏按鍵數(shù)字鍵選擇0-9種游戲難度,進入相對應游戲關卡。進入游戲進入游戲按鍵輸入(0-9)選擇關卡難度處理輸入選擇關卡難度進入關卡0進入關卡1進入關卡2進入關卡3。。。。。。判斷游戲是否結束圖6Title屏選擇關卡模塊圖方塊處理模塊方塊處理模塊定義方塊的7種狀態(tài),每種狀態(tài)都是由四個小方塊組合而成,如下:圖7方塊形狀模塊圖游戲規(guī)則模塊游戲規(guī)則模塊主要實現(xiàn)俄羅斯方塊游戲基本規(guī)則。比如,積滿一行后消減;能夠快速直接的下落;記錄游戲最高分;方塊翻轉;分數(shù)計算;隨機生成方塊,見下圖:游戲規(guī)則游戲規(guī)則消減積滿行快速下落方塊翻轉分數(shù)計算隨機生成方塊圖8游戲規(guī)則模塊圖游戲中斷處理流程中斷處理是移動設備程序生命周期的重要組成特性,包括下圖三種階段:運行階段(startApp)運行階段(startApp)掛起階段(pauseApp)結束階段(destroyApp)喚醒掛起結束結束圖9系統(tǒng)生命周期圖系統(tǒng)實現(xiàn)與測試系統(tǒng)源文件結構本系統(tǒng)由10個類組成并實現(xiàn)全部功能。項目名字為TetrisMidlet,其項目文件結構如下圖:圖10項目結構圖在項目源文件中,src文件夾下為實現(xiàn)系統(tǒng)的源文件。建了兩個包作為功能劃分,分別為:ui包和model包。難度選擇模塊難度選擇模塊結構ui包里包含以下類:InfoBox.java 用于顯示數(shù)字的信息框TitleBox.java 顯示title屏,包含當前高分提示選擇一個難度NextPieceBox.java 顯示下一個激活方塊TetrisCanvas.java 處理程序的所有UIDisplayBox.java 在屏幕上顯示Box其結構圖如下:ui包ui包InfoBoxTitleBoxNextPieceBoxTetrisCanvasDisplayBox圖11ui包結構圖其中核心類DisplayBox.java的方法圖如下:圖12類DisplayBox的方法圖在DisplayBox.java中方法paint()實現(xiàn)了title屏的顯示,其代碼如下:publicfinalvoidpaint(Graphicsg){ g.setColor(this.bgColor); g.fillRect(x,y,width,height); //box的背景 g.setColor(this.fgColor); g.drawRect(x,y,width,height); //邊框 this.paintBoxContents(g);}下面是TerisCanvas.java中繪制方塊paintBlock()方法的實現(xiàn)代碼:privatevoidpaintBlock(intx,inty,intblockType,Graphicsg){ intblockX=this.boardX+(this.blockSize*x); intblockY=this.boardY+(this.blockSize*(y-TetrisConstants.TOP_VISIBLE_ROW)); if(TetrisConstants.BLOCK_EMPTY!=blockType){ //繪制下落時的陰影 g.setColor(TetrisConstants.COLOR_BLACK); g.fillRect(blockX+1,blockY+1,this.blockSize-1,this.blockSize-1); //繪制一個實際的方塊覆蓋在陰影上 this.setColor(blockType,g); g.fillRect(blockX,blockY,this.blockSize-1,this.blockSize-1); }else{ //繪制顏色 g.setColor(TetrisConstants.COLOR_WHITE); g.fillRect(blockX,blockY,this.blockSize,this.blockSize);}}其中,TOP_VISIBLE_ROW為TetrisConstants下定義,Y坐標的從行0開始索引的位置,初始值為2。BLOCK_EMPTY為TetrisConstants下定義的空方塊,初始值為-1。COLOR_BLACK為TetrisConstants下定義的預設RGB顏色,初始值為0x00000000。COLOR_WHITE為TetrisConstants下定義的預設RGB顏色,初始值為0x00ffffff。難度選擇模塊功能模擬器程序運行,在應用程序列表里顯示可以載入運行的模擬程序,如下圖:圖13載入程序點擊運行程序后,在title屏顯示游戲名稱、作者、最高分記錄和按鍵提示,點擊數(shù)字鍵輸入0-9中的一個數(shù)字,以選擇不同難度的關卡,如下圖:圖14運行游戲在title屏,也可以點擊左軟鍵退出程序。游戲規(guī)則模塊功能游戲規(guī)則模塊結構游戲規(guī)則模塊包含3個類:DropThread.java 處理方塊下落問題TetrisConstants.java常數(shù)定義TetrisMidlet.java 游戲規(guī)則和對鍵盤輸入的捕捉,以及中斷的處理其結構圖如下:TetrisMidletTetrisMidletUi包Model包DropThreadTetrisConstantsTetrisMidlet圖15游戲規(guī)則模塊結構圖其中核心類DropThread.java實現(xiàn)了方塊的下落,它的方法圖如下:圖16類DropThread方法圖其中run()方法實現(xiàn)循環(huán)下落,代碼如下: publicvoidrun(){//運行方法 while(this.running){ //當前下落的方塊 if(this.skipNextTick){ this.skipNextTick=false; }else{ this.game.tick(); } try{ Thread.sleep(this.game.getTickSpeed()); //線程睡眠 }catch(InterruptedExceptionie){ }}}游戲規(guī)則模塊功能游戲規(guī)則模塊實現(xiàn)俄羅斯方塊游戲的主要功能包括,消減積滿的行、快速下落、方塊翻轉、分數(shù)計算、下落碰撞檢測、隨機生成方塊。下面是消減積滿行功能代碼,如下: privateintclearCompletedRows(TetrisPiecepiece){ TetrisBoardboard=this.getBoard(); //檢查方塊的每一行,看是否以完成 for(inti=0;i<TetrisConstants.FOUR_BLOCKS;i++){ introwY=piece.getBlockY(i); //如果一行被填充滿,則標記為完成 if(board.checkRowCompleted(rowY)){ this.markRowCompleted(rowY,true); } } intnumClearedRows=0; for(inty=TetrisConstants.HEIGHT-1;y>=0;y--){//從下到上重復 if(numClearedRows>0){ board.dropRow(y,numClearedRows); } if(this.isRowCompleted(y)){ numClearedRows++; this.markRowCompleted(y,false); //為下一次重置 } } //清除最上面的完成行數(shù) for(inti=0;i<numClearedRows;i++){ board.clearRow(i); } returnnumClearedRows; }為了增加玩家在游戲過程中的游戲性,下落的方塊設置成隨機生成,這里利用rand.nextInt方法得到隨機數(shù),下面是隨機生成方塊功能的部分代碼,如下: privateintgetRandomPieceType(){ returnMath.abs(rand.nextInt()%TetrisConstants.NUM_PIECE_TYPES)+1; } 首先用rand.nextInt()方法得到隨機數(shù)后,用隨機數(shù)除以TetrisCanstants中定義的表示方塊類型數(shù)的常量NUM_PIECE_TYPE,其值初始值為7,取余后加1取其絕對值。實現(xiàn)效果如下圖:圖17游戲進行狀態(tài)圖在前面4.3部分通過圖9的系統(tǒng)生命周期流程圖,已經(jīng)了解了游戲中斷處理的過程。在游戲運行時可以按右軟鍵調用程序生命周期中pauseApp()方法暫停游戲,方塊會停在暫停位置,直到玩家再次點擊右軟鍵恢復游戲,pauseApp()方法代碼如下:protectedvoidpauseApp(){ //掛起程序使游戲進入暫停狀態(tài) if(TetrisConstants.RUNNING_STATE==this.gameState){ this.pauseGame(); }}在pauseApp方法中調用了pauseGame()方法,其實現(xiàn)代碼如下:privatevoidpauseGame(){ //把暫停命令替換成恢復命令 this.gameCanvas.removeCommand(this.pauseCommand); this.gameCanvas.addCommand(this.resumeCommand); //進入暫停狀態(tài)并停止下落 this.setGameState(TetrisConstants.PAUSED_STATE); this.dropThread.stopThread();}游戲暫停階段畫面如下:圖18游戲暫停狀態(tài)圖當點擊右軟件恢復游戲后,方塊從暫停位置繼續(xù)下落,這里用了resumeGame()來實現(xiàn)此功能,代碼如下:privatevoidresumeGame(){ //把恢復命令替換成暫停命令 this.gameCanvas.removeCommand(this.resumeCommand); this.gameCanvas.addCommand(this.pauseCommand); //進入運行狀態(tài)并下落 this.setGameState(TetrisConstants.RUNNING_STATE); this.runDropThread();}游戲恢復階段狀態(tài),如下圖:圖19游戲恢復狀態(tài)圖方塊處理模塊方塊處理模塊結構俄羅斯方塊游戲中出現(xiàn)的七種方塊是由4個小塊組合而成。方塊處理模塊包含在model包中:TetrisPiece.java 當前下落方塊的處理TetrisBoard.java 定義方塊格子的狀態(tài)其類結構圖如下:MModelTetrisPieceTetrisBoard圖20方塊處理模塊結構圖核心類TetrisPiece中實現(xiàn)了七種方塊下落時翻轉方式的下落,方塊翻轉方式分三種方式:自由翻轉(Free)、兩面翻轉(Toggle)、不能翻轉(None),下圖是判斷圖示:兩面翻轉(Toggle)兩面翻轉(Toggle)自由翻轉(Free)無翻轉(None)圖21方塊翻轉方式判斷圖示在四個組成的方塊的小塊中,有一個中心點小塊(1,1)在翻轉的時候坐標是不會變化的,這個坐標在參數(shù)設置類TetrisConstants.java中,名稱為:PIVOT_INDEX,其初始值為1。下面用方塊I舉例說明其進行翻轉判斷的代碼:privatevoidsetAsNewIPiece(intx,inty){this.pieceType=TetrisConstants.I_PIECE;this.rotationType=TetrisConstants.ROTATION_TYPE_TOGGLE;//只能進行兩個方向的旋轉,設置類型為TOGGLE this.rotationToggle=true; //設置TOGGLE標志為TURE this.setBlockCoords(0,x-1,y); this.setBlockCoords(1,x,y); this.setBlockCoords(2,x+1,y); this.setBlockCoords(3,x+2,y);}下圖是類TetrisPiece的方法圖:圖22類TetrisPiece方法圖其中rotate()方法實現(xiàn)了方塊的旋轉,(x,y)為小方塊坐標,其翻轉實現(xiàn)算法如下:(x,y)(x,y)(-y,-x)如向左旋轉:(y,-x)如向右旋轉:(-y,x)(-y+1,x+1)(y+1,-x+1)圖23方塊翻轉算法流程圖方塊翻轉算法流程實現(xiàn)代碼如下:publicvoidrotate(intpivotX,intpivotY,booleanrotateDirection){ if(TetrisConstants.ROTATION_TYPE_TOGGLE==this.rotationType){ //如果翻轉類型為TOGGLE rotateDirection=this.rotationToggle;//判斷翻轉方向 this.rotationToggle=!this.rotationToggle;//如果與canRotate匹配,中心點方塊將被使用 } //重構四個小塊,每個都轉動 for(inti=0;i<TetrisConstants.FOUR_BLOCKS;i++){ intblockX=this.getBlockX(i); intblockY=this.getBlockY(i); //左旋轉:交換x和y坐標,x坐標取反 //右旋轉:交換x和以坐標,y坐標取反 intdx=blockY-pivotY; intdy=blockX-pivotX; if(rotateDirection){ //如向左旋轉 dx*=-1; }else{ //如向右旋轉 dy*=-1; } introtateX=pivotX+dx; introtateY=pivotY+dy; this.setBlockCoords(i,rotateX,rotateY);//得到翻轉后的新坐標 }}方塊處理模塊功能對當前下落方塊的處理,主要功能是及時刷新圖像,保證方塊狀態(tài)及時更新。核心類TetrisBoard.java實現(xiàn)了此功能,其方法圖如下:圖24類TetrisBoard方法結構圖當下落方塊頂端積滿后,游戲系統(tǒng)判斷游戲結束。在TetrisBoard.java中的checkRowCompleted()方法實現(xiàn)了此功能,其代碼如下: publicbooleancheckRowCompleted(introwY){ for(intx=0;x<TetrisConstants.WIDTH;x++){ if(TetrisConstants.BLOCK_EMPTY==this.getBlockType(x,rowY)){ //有空方塊,行不被填充 returnfalse; } } returntrue; }如下圖:圖25方塊下落游戲圖像刷新狀態(tài)圖當游戲結束時立即顯示title屏,計算并顯示出這次游戲的最高分。同時等待玩家鍵入數(shù)字,選擇游戲難度開始新的游戲。其實現(xiàn)由init()方法控制,其代碼如下:privatevoidinit(){ this.board=newTetrisBoard(); this.gameCanvas=newTetrisCanvas(this); this.activePiece=newTetrisPiece();//方塊處理 pletedRows=newboolean[TetrisConstants.HEIGHT];//
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025餐飲業(yè)食品添加劑使用規(guī)范管理合同2篇
- 二零二五年度大學教授學術講座與報告會合同3篇
- 2025年度出租車公司司機權益保障勞動合同范本4篇
- 2025年度個人私有土地買賣合同協(xié)議書范本4篇
- 二零二五年度住宅小區(qū)車位租賃與轉租管理服務協(xié)議4篇
- 二零二四年度員工出差交通及通訊費用報銷協(xié)議3篇
- 二零二五年度馬鈴薯種薯知識產(chǎn)權保護與授權合同4篇
- 二零二五版煤礦地質勘探勞務分包服務協(xié)議4篇
- 2025年度個人與個人二手汽車買賣合同范本3篇
- 2025年度茶葉進口清關代理合同范本3篇
- 機電安裝工程安全培訓
- 洗浴部前臺收銀員崗位職責
- 2024年輔警考試公基常識300題(附解析)
- GB/T 43650-2024野生動物及其制品DNA物種鑒定技術規(guī)程
- 暴發(fā)性心肌炎查房
- 工程質保金返還審批單
- 【可行性報告】2023年電動自行車項目可行性研究分析報告
- 五月天歌詞全集
- 商品退換貨申請表模板
- 實習單位鑒定表(模板)
- 數(shù)字媒體應用技術專業(yè)調研方案
評論
0/150
提交評論