java俄羅斯方塊畢業(yè)論文_第1頁
已閱讀1頁,還剩40頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、<p><b>  第1章 緒論</b></p><p><b>  1.1 游戲的歷史</b></p><p>  游戲是人類生活的重要組成部分,從第一個電子游戲開發(fā)至今已經(jīng)有30多年,在這個短暫的時期里,隨著硬件水平的提高,游戲開發(fā)新技術(shù)層出不窮,經(jīng)典游戲比比皆是。</p><p>  1.1.1 從頭談起

2、</p><p>  真正的電子游戲機(jī)產(chǎn)生于20世紀(jì)70年代。1971年,麻省理工學(xué)院的學(xué)生Nolan Bushnell設(shè)計(jì)了世界上的第一個業(yè)務(wù)用游戲機(jī)(俗名街機(jī)),叫做《電腦空間》。這臺游戲機(jī)用一臺黑白電視機(jī)作為顯示屏,用一個控制柄作為操縱器,不過由于市場因素這款游戲以失敗告終。但是最后他在電子游戲的發(fā)展上取得了非凡的成就。</p><p>  上面介紹的是專用機(jī)游戲的歷史,而最早的電腦

3、游戲可以追溯到1972年,一個叫Crowther的工程師用當(dāng)時最流行的主機(jī)――DEC公司的PDP-10編寫一段簡單的FORTRAN程序。在這個程序里,Crowther設(shè)計(jì)了一張地圖,地圖上不規(guī)則的分布著陷阱,游戲者必須尋找路徑避開陷阱。這個程序被公認(rèn)為是最早的電腦游戲程序。</p><p>  1989年,BroderBund公司的設(shè)計(jì)師喬丹.麥克納根據(jù)阿拉伯民族的古老傳說《一千零一夜》在Apple平臺上制作了一

4、部動作冒險(xiǎn)相結(jié)合的電腦游戲――波斯王子。這個游戲獲得了第一作,它代表了當(dāng)時電腦技術(shù)的最高水平。</p><p>  1986年,任天堂公司發(fā)售了一款真正的游戲巨作――超級馬里奧。</p><p>  20世紀(jì)80年代IBM PC兼容機(jī)的出現(xiàn)打破了Apple公司的壟斷地位。</p><p>  到了20世紀(jì)90年代,游戲業(yè)才真正成熟起來,成為了一種產(chǎn)業(yè)。</p&

5、gt;<p>  由于PC機(jī)價格非常低而且硬件速度越來越快,游戲逐漸成為人們生活中不可缺少的一部分。游戲產(chǎn)業(yè)也逐漸發(fā)展成熟。</p><p>  1.1.2 圖形硬件的革命</p><p>  圖形硬件的飛速發(fā)展是近些年來的事情,部分原因是來自工業(yè)方面的壓力,例如在軍事和醫(yī)療方面對于實(shí)時圖形的需求很強(qiáng)烈,而交互娛樂產(chǎn)業(yè)也極大的推動了圖形硬件的發(fā)展。技術(shù)上的因素同樣也推動著圖形

6、硬件的發(fā)展,許多圖形算法可以很容易地表達(dá)為并行方式,這樣硬件執(zhí)行的效率變得很高。摩樂定律也起了作用,越來越多的晶體管可以集成到一塊單獨(dú)的芯片上。</p><p>  在所謂的GPU(圖形處理器)概念出現(xiàn)以前,特殊的圖形硬件只出現(xiàn)在諸如SGI和E&S系統(tǒng)里面,這些硬件價格太昂貴,不過這些公司提供了第一代基于硬件的頂點(diǎn)變換和紋理映射的解決方案。</p><p>  1.2游戲的意義與內(nèi)

7、涵</p><p>  游戲這個名稱一直就存在于每個人的日常生活中,如猜拳游戲、猜謎游戲、大地游戲、球類游戲等,林林總總,不勝枚舉,甚至于有些流行歌曲把人生也比喻為游戲,好比“一場游戲一場夢” 。因此,游戲?qū)τ诂F(xiàn)代人的成長歷程,絕對是一個不可或缺的重要角色。</p><p>  1.2.1 游戲的組成要素</p><p>  “游戲”,最簡單的定義,就是一種供人們娛

8、樂休閑的快樂元素。從更專業(yè)的角度形容, “游戲”是具有特定行為模式、規(guī)則條件、身心娛樂及輸贏的一種行為表現(xiàn)。這種行為表現(xiàn)具備以下4個要素。</p><p>  行為模式:“游戲”最簡單的要素就是游戲有特定的流程模式,這種流程模式貫穿于整個游戲的行為,用戶必須依照它的模式流程來執(zhí)行。倘若一種游戲沒有了特定的行為模式,那么就沒有執(zhí)行的行為;在沒有執(zhí)行的行為之后,這個游戲也玩不下去了。舉個例子來說,如果猜拳游戲沒有了剪

9、刀、石頭、布等行為模式,那么這還能叫做“猜拳游戲” 嗎?所以不管游戲的流程有多么復(fù)雜還是多么簡單,一定要有特定的行為模式。</p><p>  條件規(guī)則:當(dāng)游戲有了一定的行為模式后,接著就必須制定出一系列的條件規(guī)則。簡單來說,這些游戲的條件規(guī)則就是大家必須去遵守的游戲行為守則,只要是大家一致以為的游戲行為,在游戲中,玩家就必須遵守它,如果不遵守這種游戲行為,那么就失去了公平性。如同一種簡單的球賽,打球的英文解釋可

10、以用PLAY GAME來加以說明,按照英文字面上的解釋,它就是執(zhí)行游戲的行為,而球賽必須有一定的條件規(guī)則,并且參與者都要必須去遵守它,不能遵守它就叫作“犯規(guī)”。所以不管是什么游戲,它都會具備一組規(guī)則條件,在游戲進(jìn)行的時候才會有足夠的公平性。</p><p>  娛樂身心:一種游戲所帶來的娛樂性,關(guān)鍵就在于為玩家所帶來的刺激感,這也是游戲的精華所在。簡單來說,不管是很多人玩的游戲,還是一個人玩的單機(jī)游戲,游戲本身就

11、會存在它的娛樂和刺激性,使得玩家們想要去玩它。</p><p>  輸贏:其實(shí)針對游戲而言,輸贏是所有游戲的最終目的。一個沒有輸贏的游戲,也就沒有了它存在的意義,如同我們常常接觸到的猜拳游戲,說穿了最終目的就是為了分出勝負(fù)而己。</p><p>  一般而言,游戲又可以分為動態(tài)和靜態(tài)兩種形態(tài)。動態(tài)的游戲必須配合肢體動作,如猜拳游戲;而靜態(tài)游戲則是較偏向思考的行為,如同紙上游戲。然而不管是動

12、態(tài)或是靜態(tài)游戲,只要具備上述4項(xiàng)組成要素,都可以將它稱為“游戲”。</p><p>  1.3 俄羅斯方塊游戲</p><p>  俄羅斯方塊是一款風(fēng)靡全球的電視游戲機(jī)和掌上游戲機(jī)游戲,它曾經(jīng)造成的轟動與造成的經(jīng)濟(jì)價值可以說是游戲史上的一件大事。這款游戲最初是由蘇聯(lián)的游戲制作人Alex Pajitnov制作的,它看似簡單但卻變化無窮,令人上癮。</p><p>  

13、但是經(jīng)過時代的變遷,當(dāng)初簡單卻變化無窮的俄羅斯方塊游戲如今卻已失去了它的市場,究其原因,主要是因?yàn)橛螒蛴布约凹夹g(shù)的革新使得優(yōu)秀的游戲接二連三地推出,而俄羅斯方塊游戲作為一款形式、內(nèi)容過于簡單的游戲勢必經(jīng)受不住時間的沖擊的。</p><p>  現(xiàn)在作者將改寫這個固定的游戲模式,通過增加一系列的新功能,開發(fā)出一種全新的俄羅斯方塊游戲,使游戲用戶重新燃起對俄羅斯方塊游戲的熱愛。</p><p&g

14、t;  第2章 可行性研究</p><p><b>  2.1 設(shè)計(jì)目的</b></p><p>  綜合運(yùn)用在校期間所學(xué)理論知識和技能,設(shè)計(jì)開發(fā)俄羅斯方塊,使自己熟悉應(yīng)用系統(tǒng)的開發(fā)過程,培養(yǎng)獨(dú)立思考能力,檢驗(yàn)學(xué)習(xí)效果和動手能力,提高工程實(shí)踐能力,為將來實(shí)際工作打下堅(jiān)實(shí)的基礎(chǔ)。</p><p>  2.2 可行性研究前提</p>

15、<p>  基本需求:系統(tǒng)開發(fā)的總體任務(wù)是實(shí)現(xiàn)游戲的可操作性、美觀性、及時性,及適當(dāng)?shù)墓δ軘U(kuò)展。</p><p>  主要開發(fā)目標(biāo):采用結(jié)構(gòu)化設(shè)計(jì)方法,開發(fā)出一個可操作性、美觀性、及時性的游戲,并通過此次軟件開發(fā)過程全面提高自身的綜合素質(zhì)。</p><p>  可行性研究所采用的方法和步驟:通過研究分析俄羅斯方塊所具備的能力及實(shí)現(xiàn)的方法、確定主體結(jié)構(gòu)。利用現(xiàn)階段我所能達(dá)到的能力

16、,以最簡潔、最容易的辦法,邊開發(fā)邊測試邊修改,實(shí)現(xiàn)一個有一定可玩性的游戲軟件。</p><p>  評價尺度:本游戲盡量追求游戲操作的合理性及正確性,但是仍不排除會出現(xiàn)一些偶然性的錯誤;同時游戲也盡量追求界面的美觀性及功能的豐富性,但是基于時間的關(guān)系,可能會有極少數(shù)的拓展功能不能實(shí)現(xiàn)。</p><p><b>  2.3 可行性分析</b></p>&l

17、t;p>  管理可行性: 本游戲設(shè)計(jì)的目的只在于提高自身實(shí)踐水平,并不對外發(fā)布,因此完全具有管理可行性。</p><p>  經(jīng)濟(jì)可行性:由于本游戲的主要背景是畢業(yè)課程設(shè)計(jì),不注重直接的經(jīng)濟(jì)效益和其后的發(fā)展方向,只在注重自身水平和能力的提高,對自身的經(jīng)濟(jì)要求也不高,只要有一臺電腦便可,所以不用考慮到經(jīng)濟(jì)問題。</p><p>  技術(shù)可行性:可用與本游戲的編程語言有VB,VC,Jav

18、a,Delphi等,考慮到用于編寫程序的困難度,和對語言的了解程度,選擇JAVA作為編程語言。需要對圖形界面設(shè)計(jì)、事件處理、多媒體、網(wǎng)絡(luò)編程等有一定了解。</p><p>  社會可行性:本游戲的開發(fā)作為畢業(yè)課程設(shè)計(jì)以鞏固先前所學(xué)的知識,以個人為單位,僅供個人平常娛樂所用,無須考慮有可能造成的社會影響,不用考慮到法律、版權(quán)等的社會因素,所以在這方面是完全可行的。</p><p><b

19、>  2.4 結(jié)論</b></p><p>  綜上所述,本游戲軟件的技術(shù)成熟、完備。各方面均無重大問題,因此本游戲軟件可開始著手編寫</p><p><b>  第3章 需求分析</b></p><p><b>  3.1 引言</b></p><p>  對軟件需求完全理解對于

20、軟件開發(fā)工作的成功是至關(guān)重要的,需求說明的任務(wù)是發(fā)現(xiàn)、規(guī)范的過程,有益于提高軟件開發(fā)過程中的能見度,便于對軟件開發(fā)過程中的控制與管理,便于采用工程方法開發(fā)軟件,提高軟件的質(zhì)量,便于開發(fā)人員、維護(hù)人員、管理人員之間的交流、協(xié)作,并作為工作成果的原始依據(jù),并且在向潛在用戶傳遞軟件功能、性能需求,使其能夠判斷該軟件是否與自己的需求相關(guān)。</p><p>  3.2 游戲功能需求</p><p>

21、  3.2.1 游戲界面需求</p><p>  良好的用戶界面設(shè)計(jì)。本游戲主要有三個界面,一是用于主游戲區(qū)的游戲畫布,用來顯示游戲時運(yùn)動和落下去的方塊,二是用于控制游戲的各種控件以及顯現(xiàn)游戲信息的一些組件,這是一個面板,三是進(jìn)行網(wǎng)絡(luò)對戰(zhàn)時用以顯示對方游戲信息的面板。</p><p>  3.2.2 游戲控制需求</p><p>  方塊下落時,可通過鍵盤方向鍵(上

22、、下、左、右鍵)對該方塊進(jìn)行向上(變形),向下(加速)、向左、向右移動。</p><p>  3.2.3 圖形顯示需求</p><p>  隨機(jī)給出不同的形狀(長條形、Z字形、反Z形、田字形、7字形、反7形、T字型)下落填充給定的區(qū)域,若填滿一條便消掉,記分,當(dāng)達(dá)到一定的分?jǐn)?shù)時,過關(guān),一共設(shè)置十關(guān),每關(guān)方塊下落的速度不同,游戲中先結(jié)束的一方為本局輸家,十關(guān)過后,勝出局?jǐn)?shù)多的為贏家。<

23、/p><p>  3.2.4 音樂播放需求</p><p>  本游戲,應(yīng)該具備播放背景音樂和發(fā)生相應(yīng)操作時的音效的功能,比如,方塊落下、滿行消除時的音效。</p><p>  3.2.5 道具使用需求</p><p>  本游戲,可以具備幾種道具的使用功能,比如,這些道具可以是某些特殊的方塊,比如,可以定義一種旋轉(zhuǎn)的方塊,也可以定義一種炸彈,能

24、夠炸毀一定數(shù)量的方塊,以增強(qiáng)游戲的趣味性。</p><p>  3.2.6 網(wǎng)絡(luò)對戰(zhàn)需求</p><p>  本游戲,具備網(wǎng)絡(luò)對戰(zhàn)功能,所以要求玩家能夠看到對方的游戲信息。</p><p>  3.3 運(yùn)行環(huán)境及系統(tǒng)性能的需求</p><p>  本游戲?qū)\(yùn)行環(huán)境及系統(tǒng)性能的需求如表3.1所示:</p><p>  表

25、3.1 游戲?qū)\(yùn)行環(huán)境及系統(tǒng)性能需求分析表</p><p><b>  3.4 接口需求</b></p><p>  本軟件需求通過鍵盤進(jìn)行操作,在Windows的操作系統(tǒng)下,利用鍵盤的上、下、左、右鍵對方塊進(jìn)行移動變形,要使用鍵盤的接口事件。</p><p><b>  3.5 方案論證</b></p>&

26、lt;p>  可用于較好地實(shí)現(xiàn)俄羅斯方塊的語言有C++、VB、JAVA,所以客觀上說來,可用Jave,VB和C++這三種語言編寫俄羅斯方塊程序。下面結(jié)合自身實(shí)際情況分別論述三種語言的優(yōu)缺點(diǎn)并從中選擇一種適合的編寫語言。</p><p>  3.6.1 VB的特點(diǎn)</p><p>  VB是完全中文化的環(huán)境使用,語句生成器和快速提示幫助使用戶不必記憶成千上萬的屬性和方法,在較短的時間內(nèi)

27、就能開發(fā)出功能強(qiáng)大的應(yīng)用程序。Internet應(yīng)用程序的開發(fā)功能更加強(qiáng)大和容易,支持動態(tài)HTML技術(shù)的應(yīng)用程序。種類繁多,功能強(qiáng)大的多媒體控件,能幫助用戶在較短的時間內(nèi)用較少的語句編寫出圖文聲像并茂的多媒體程序。能對多種數(shù)據(jù)庫進(jìn)行讀寫操作。它所提供的可視化數(shù)據(jù)管理器能幫助用戶構(gòu)造多種類型的數(shù)據(jù)庫。用戶自定義類型可以作為參數(shù)或作為公共屬性和方法的返回值,函數(shù)可以返回?cái)?shù)組變量,動態(tài)數(shù)組可以賦值,文件系統(tǒng)對象,按名調(diào)用,增強(qiáng)創(chuàng)建對象函數(shù)和St

28、rConv函數(shù)。應(yīng)用程序安裝向?qū)軒椭脩糇詣由删哂幸欢üδ艿膽?yīng)用程序,加快了程序的開發(fā)速度。</p><p>  3.6.2 C++的特點(diǎn)</p><p>  C++是對C語言的擴(kuò)充,擴(kuò)充的絕大部分來自著名語言中的最佳特性:從SIMULA 67中吸取了類,從ALGOL 68中吸取了運(yùn)算符一名多用、引用和在分程序中任何地方說明變量,綜合了Ada的類屬和Clu的模塊特點(diǎn),從BCPL中吸取異

29、常處理,從BCPL中吸取了用//表示注釋。</p><p>  C++保持了C的緊湊、靈活、高效和易移植強(qiáng)的優(yōu)點(diǎn),它對數(shù)據(jù)抽象的支持主要在于類概念和機(jī)制,對面向?qū)ο箫L(fēng)范的支持主要通過虛擬函數(shù)。C++既有數(shù)據(jù)抽象和面向?qū)ο竽芰ΓZ言運(yùn)行性能高多,加上C語言的普及,而從C至C++的過渡較為平滑,以及C++與C的兼容程度可使數(shù)據(jù)巨大的C程序能方便地在C++環(huán)境中重用。</p><p>  盡管C

30、++當(dāng)初的設(shè)計(jì)本意是幫助管理大型程序,但其用途并不僅限于此。C++的面向?qū)ο蟮奶匦钥捎行У赜糜趯?shí)際的程序設(shè)計(jì)工作。C++常常用于設(shè)計(jì)編輯器、數(shù)據(jù)庫、個人文件系統(tǒng)以及通訊程序等。而且,由于C++共享C的效率,所以用C++可以構(gòu)成很多高性能的系統(tǒng)軟件。</p><p>  3.6.3 Java的特點(diǎn)</p><p>  Java是定義位于網(wǎng)絡(luò)計(jì)算的計(jì)算機(jī)語言,它幾乎所有的特點(diǎn)也是圍繞著這一中心

31、展開的并為之服務(wù)的,這些特點(diǎn)使得Java語言特別適全于用來開發(fā)網(wǎng)絡(luò)上的應(yīng)用程序;另外,作為一種面世較晚的語言,Java也集中體現(xiàn)和充分利用了若于當(dāng)代軟件技術(shù)新成果,如面向?qū)ο?、多線程等,這些也都在它的特點(diǎn)中有所反映。</p><p>  平臺無關(guān)性:如前所述,Java語言獨(dú)特的運(yùn)行機(jī)制使得它具有良好的可移植性,利用Java,開發(fā)人員可以編寫出與具體平臺無關(guān)、普遍適用的應(yīng)用程序,大大降低了開發(fā)、維護(hù)和管理的開銷。&

32、lt;/p><p>  面向?qū)ο螅篔ava是純面向?qū)ο蟮木幊陶Z言。面向?qū)ο蠹夹g(shù)較好地適應(yīng)了當(dāng)今軟件開發(fā)過程中新出現(xiàn)的種種傳統(tǒng)面向過程語言所不能處理的問題,包括軟件開發(fā)的規(guī)模擴(kuò)大、升級加快、維護(hù)量增大經(jīng)及開發(fā)分工日趨細(xì)化、專業(yè)化和標(biāo)準(zhǔn)化等,是一種迅速成熟、推廣的軟件開發(fā)方法。面向?qū)ο蠹夹g(shù)的核心是以更接近人類思維的方式建立計(jì)算機(jī)邏輯模型,它利用類和對象的機(jī)制將數(shù)據(jù)與其上的操作封裝在一起,并通過統(tǒng)一的接口與外界交互,使反映

33、現(xiàn)實(shí)世界實(shí)體的各個類在程序中能夠獨(dú)立、自治、繼承;這種方法非常有利于提高程序的可維護(hù)性和可重用性,大大提高了開發(fā)效率和程序的可管理性,使得面向過程語言難于操縱的大規(guī)模軟件可以很方便的創(chuàng)建、使用和維護(hù)。</p><p>  多線程機(jī)制:多線程是當(dāng)今軟件技術(shù)的又一重要成果,已成功應(yīng)用在操作系統(tǒng)、應(yīng)用開發(fā)等多個領(lǐng)域。多程序技術(shù)允許同一個程序有兩個執(zhí)行線索,即同時做兩件事情,滿足了一些復(fù)雜軟件的需求。Java不但內(nèi)置多線

34、程功能,而且提供語言級的多線程支持,即定義了一些用于建立、管理多線程的類和方法,使得開發(fā)具有多線程功能的程序變得簡單、容易和有效。</p><p>  簡單易學(xué):如前所述,衍生自C++的Java語言,出于安全穩(wěn)定性的考慮,去除了C++中不容不得易理解和掌握的部分,如最典型的指針操作等,降低了學(xué)習(xí)的難度;同時 Java還有一個特點(diǎn)就是它的基本語法部分與C語言幾乎一模一樣。這樣,無論是學(xué)過Java再學(xué)C,還

35、是已經(jīng)掌握了C語言再業(yè)學(xué)Java,都會感到易于入門。</p><p><b>  3.6.方案選擇</b></p><p>  面向?qū)ο笫且环N認(rèn)識世界的方法,是一種程序設(shè)計(jì)方法。面向?qū)ο蟮挠^點(diǎn)認(rèn)為,客觀世界是由各種各樣的實(shí)體,即對象組成的。每種對象都有自己的內(nèi)部狀態(tài)和運(yùn)動規(guī)律,不同對象間的相互聯(lián)系和相互作用就構(gòu)成了各種不同的系統(tǒng),并進(jìn)而構(gòu)成整個客觀世界。按照這樣的思想

36、設(shè)計(jì)程序,就是面向?qū)ο蟮某绦蛟O(shè)計(jì)。</p><p>  面向?qū)ο蟮某绦蛟O(shè)計(jì)吸取了結(jié)構(gòu)化程序設(shè)計(jì)的先進(jìn)思想,并把它們同幾個支持用戶用新方法進(jìn)行程序設(shè)計(jì)的有力概念結(jié)合在一起。</p><p>  所有面向?qū)ο蟮某绦蛟O(shè)計(jì)語言一般都包含三個概念:封裝、多態(tài)性和繼承性。</p><p>  這種方法要求語言必須具備抽象、封裝、繼承和多態(tài)性這幾個關(guān)鍵要素。</p>

37、<p>  面向?qū)ο蟮某绦蛟O(shè)計(jì),是通過數(shù)據(jù)和代碼建立分塊的內(nèi)存區(qū)域,以便提供對程序進(jìn)行模塊化的一種程序設(shè)計(jì)方法,這些模塊可以被用作樣板,在需要時再建立其副本。</p><p>  C++和Java在面向?qū)ο筮@方面比VB要強(qiáng),所以我排除了用VB做的可能性。但是C++主觀上在校期間學(xué)校并沒有這方面的授課內(nèi)容,雖然自學(xué)了一些內(nèi)容,對C++也有一定了解,但是若用C++實(shí)現(xiàn),必定是基于windows應(yīng)用程序的V

38、isual C++設(shè)計(jì),對于windows編程,我還有待提高,而我對JAVA的掌握,相對而言,比較熟悉,綜合考慮,決定采用Java語言編寫俄羅斯方塊。</p><p><b>  第4章 概要設(shè)計(jì)</b></p><p>  4.1 游戲設(shè)計(jì)所要遵循的規(guī)范</p><p>  一個良好的程序,在編寫之前,必須要制定各種編寫規(guī)范,以便組內(nèi)各成員協(xié)

39、調(diào)工作。當(dāng)然,本游戲只是一個小程序,過多的規(guī)范制定顯得沒有必要,但是,也必須制定一個對于變量的命名規(guī)則,這有利于設(shè)計(jì)出一個可讀性高的程序。</p><p>  本程序變量的命名規(guī)則為:</p><p>  ·所有變量一律使用相應(yīng)的英文單詞命名</p><p>  ·如果同一類中需要創(chuàng)建多個同一類型,功能相似的變量,變量的前綴應(yīng)使用統(tǒng)一的英文單詞,

40、后綴為下劃線“_”加數(shù)字。</p><p>  比如,從JButton對象創(chuàng)建開始按鈕,可以命名為:startbutton。再如,創(chuàng)建多個道具按鈕,可以命名為toolbutton_1,toolbutton_2等等。</p><p>  ·方法命名盡量使用能夠描述本方法功能的英文單詞</p><p>  比如,游戲初始化可以用gameinitial。<

41、/p><p>  ·類名字命名也應(yīng)當(dāng)使用能夠描述本類功能的英文單詞。</p><p>  如方塊類,可以用class block。</p><p>  4.2 游戲總體設(shè)計(jì)分析</p><p>  Java為純面向?qū)ο螅∣bject-Oriented,OO)的程序語言,它的諸多優(yōu)點(diǎn)在此就不作論述了。從面向?qū)ο蟮挠^念出發(fā),本程序主要可分為

42、以下幾個模塊:</p><p><b>  客戶端GUI模塊</b></p><p><b>  方塊及地圖數(shù)據(jù)模塊</b></p><p><b>  音頻文件播放模塊</b></p><p><b>  道具使用模塊</b></p>&l

43、t;p><b>  網(wǎng)絡(luò)傳輸模塊</b></p><p>  分析對象的技巧在于它的功能的擴(kuò)展性及維護(hù)效率。試想,如果因?yàn)橥獠凯h(huán)境或者用戶需求的變化需要對程序進(jìn)行功能擴(kuò)展或者維護(hù),就要對代碼作大幅度的更動甚至重寫,這樣就失去了面向?qū)ο蟮膬?yōu)勢,所以在本程序分析時將獨(dú)立性高的模塊作為一個對象,以提高程序的可擴(kuò)展性和可維護(hù)性。</p><p>  4.3 各模塊的算法

44、設(shè)計(jì)</p><p>  4.3.1客戶端接口的設(shè)計(jì)</p><p>  “客戶端控制器”是指游戲界面上顯示游戲相關(guān)信息及排布游戲控件的面板。游戲客戶端控制器上集合了游戲的各種事件處理,包括游戲定時控制,鍵盤控制,道具控制,音樂播放,選擇網(wǎng)絡(luò)對戰(zhàn)等各種控制命令。本模塊是程序的主模塊,其它四個模塊都由本模塊進(jìn)行控制。</p><p>  1 客戶端接口的結(jié)構(gòu),如圖4.

45、1所示:</p><p>  圖4.1 客戶端結(jié)構(gòu)圖</p><p>  2 客戶端接口的實(shí)現(xiàn)</p><p>  一個程序,在追求程序性能的同時,應(yīng)該同時注重GUI的美觀度,基于此,本游戲應(yīng)該采用JAVA中swing組件包,swing組件是一組完全由JAVA語言編寫的輕量級組件,沒有本地代碼,不依賴本機(jī)操作系統(tǒng)的支持,所以swing比AWI具有更強(qiáng)的實(shí)用性,比起A

46、WI組件,swing組件在美觀度和控制性能方面具有如下幾方面的優(yōu)點(diǎn):</p><p><b>  ·可插入的外觀感覺</b></p><p>  在AWI組件中,猶豫控制組件外形惡對等類與具體平臺相關(guān),使得AWI組件總是只有與本機(jī)相關(guān)的單一的L&F。swing對PL&F的支持改變了單一圖形界面的觀感,即實(shí)現(xiàn)了在任意平臺上運(yùn)行同一個swing程

47、序能有不同惡L&F。變成人員可以在GUI程序設(shè)計(jì)中加入相應(yīng)的開關(guān),使得程序運(yùn)行時可以根據(jù)喜好選擇不同的L&F,呈現(xiàn)不同個性化界面。</p><p><b>  ·設(shè)置邊框</b></p><p>  可以使用相應(yīng)的方法為swing組件設(shè)置一個或多個邊框。Swing中提供了各種各樣的邊框供用戶選用,也能夠給通過變成人員的組合來設(shè)計(jì)個性邊框。充分

48、利用邊框設(shè)計(jì),可以協(xié)助布局管理器對組件進(jìn)行合理的布局。</p><p><b>  ·使用圖標(biāo)</b></p><p>  此特性使得swing組件較之AWI組件具有更強(qiáng)的外觀感受。與AWT組件不同,許多swing組件如按鈕、標(biāo)簽,不僅可以使用文字,還可以使用圖標(biāo)來加強(qiáng)外觀效果。</p><p><b>  ·支持

49、鍵盤操作</b></p><p>  在swing組件中,使用Jcomponent類的registerKeyboardAction方法,能使用戶通過鍵盤操作來替代鼠標(biāo)驅(qū)動GUI上swing組件的相應(yīng)動作。</p><p><b>  ·可存取性支持</b></p><p>  所有swing組件都實(shí)現(xiàn)了可存取性接口,提供對

50、可存取性的支持,使得輔助功能如屏幕閱讀器、語音識別系統(tǒng),能十分方便地從swing組件中得到信息。</p><p><b>  ·MVC體系結(jié)構(gòu)</b></p><p>  Swing組件設(shè)置三個通訊對象:模型、視圖和控件,并將模型與視圖奮力開來,這樣可以方便用戶直接通過模型管理數(shù)據(jù),實(shí)現(xiàn)基于一種模型的多種視圖處理。</p><p> 

51、 基于swing組件的優(yōu)點(diǎn),結(jié)合本程序的設(shè)計(jì)目標(biāo),程序的界面將使用swing組件實(shí)現(xiàn)。</p><p>  4.3.2方塊及地圖數(shù)據(jù)模塊的設(shè)計(jì)</p><p>  這是俄羅斯方塊游戲最基本的功能模塊,本游戲的設(shè)計(jì)思想是只要有客戶端控制器及方塊地圖數(shù)據(jù)模塊,就能實(shí)現(xiàn)游戲的基本功能。本模塊其實(shí)可以分開為方塊和地圖兩個模塊,但考慮到二者聯(lián)系緊密,需要共享數(shù)據(jù)結(jié)構(gòu),屬于公共耦合,耦合性過高,將二者

52、分開也有悖于作者設(shè)計(jì)的游戲算法,增加了程序的編寫難度,故把它們并作了一個對象。</p><p><b>  1.方塊數(shù)據(jù)</b></p><p>  方塊數(shù)據(jù)存儲了七種不同形態(tài)的方塊,以及每個方塊的四種形態(tài),可用一個7x4x4x4的四維數(shù)組表示,例如,定義一個四維數(shù)組block[7][4][4][4],數(shù)組block的第一維表示七種不同形態(tài)的方塊,第二維代表方塊的四種

53、不同翻轉(zhuǎn)狀態(tài)。數(shù)組的第三維和第四維代表某一種形態(tài)的方塊的某一狀態(tài)。</p><p>  假定,block[0][0][i][j]的值如以下:</p><p><b>  1,1,0,0</b></p><p><b>  0,1,0,0</b></p><p><b>  0,1,0,0&

54、lt;/b></p><p><b>  0,0,0,0</b></p><p>  則,block[0][0][i][j]代表“7”字型的方塊。當(dāng)方塊翻轉(zhuǎn)時,只需改變第二維的下標(biāo)即可,即,block[0][0][i][j]變?yōu)閎lock[0][1][i][j]。而如果更改方塊形態(tài),就改變數(shù)組第一維坐標(biāo)。 </p><p><b&g

55、t;  2.地圖數(shù)據(jù)</b></p><p>  本游戲的游戲地圖為25x15格,故應(yīng)當(dāng)用一個25行15列的二維數(shù)組存儲游戲地圖數(shù)據(jù),但是考慮到本游戲嵌入了方塊越界自動糾正功能,而方塊越界,實(shí)際上就是游戲地圖數(shù)組越界。假定,方塊數(shù)據(jù)有以下數(shù)據(jù)模式,代表長條形的一種方塊:</p><p><b>  0,0,0,1</b></p><p&

56、gt;<b>  0,0,0,1</b></p><p><b>  0,0,0,1</b></p><p><b>  0,0,0,1</b></p><p>  當(dāng)以上數(shù)據(jù)模式所代表的方塊處在游戲的左邊界區(qū),并且發(fā)生翻轉(zhuǎn)時,方塊可能翻出游戲地圖外,在這種情況下,就發(fā)生了游戲地圖數(shù)組越界,JAVA異

57、常處理系統(tǒng)會拋出ArrayIndexOutOfBoundsException,為避免這種情況的發(fā)生,游戲地圖數(shù)組應(yīng)當(dāng)適當(dāng)增大,故本游戲?qū)⒌貓D數(shù)組長度和寬度各擴(kuò)大了三個單位,定義成為28x18模式的數(shù)組。</p><p>  3.建立游戲的坐標(biāo)系統(tǒng)</p><p>  俄羅斯方塊,最終是要將方塊繪到游戲地圖中,如何確定方塊在地圖上的位置,就需要一個方塊數(shù)組與游戲地圖數(shù)組的映射關(guān)系。建立一個合

58、理的坐標(biāo)系統(tǒng),對于游戲的設(shè)計(jì)有莫大的方便。結(jié)合JAVA的坐標(biāo)系統(tǒng),綜合游戲設(shè)計(jì)上的考慮,本程序最終確定了將游戲地圖的左上角坐標(biāo)表示為(0,0),同樣,方塊在游戲地圖中表示為記錄方塊左上角在游戲地圖中的坐標(biāo)。</p><p>  4.對方塊數(shù)據(jù)和游戲數(shù)據(jù)的操作</p><p>  確定了方塊數(shù)據(jù)與地圖數(shù)據(jù)的映射關(guān)系,對方塊和游戲數(shù)據(jù)的操作就變得簡便了。對方塊的操作包括方塊的左移、右移、下移等

59、,當(dāng)方塊左移時,只需將方塊數(shù)組左上角的坐標(biāo)往左方向移動一個單位即可,同理,方塊右移、下移時,只需將坐標(biāo)往右、往下移動一個單位。</p><p>  如果以X代表方塊左上角的橫坐標(biāo),以Y代表縱坐標(biāo),方塊左移,執(zhí)行的操作是X--,方塊右移,執(zhí)行的操作是X++,方塊下落,執(zhí)行的操作是Y++。</p><p><b>  5.游戲繪圖</b></p><p

60、>  俄羅斯方塊具有七種不同形態(tài)的方塊,而方塊又分別有正在下落和已經(jīng)落下固定兩種不同狀態(tài),如何在游戲地圖中實(shí)現(xiàn)靜態(tài)和動態(tài)地繪制出七種不同形態(tài)的方塊,具有一定的挑戰(zhàn)性。經(jīng)過反復(fù)思考論證,本游戲決定采用不同的繪制模式來分別實(shí)現(xiàn)繪制動態(tài)和靜態(tài)方塊。</p><p>  ·遍歷方塊數(shù)組繪制動態(tài)方塊</p><p>  假定調(diào)用Graphics類中的fill3DRect(int x,

61、int y,int width,int height,Boolean raised)方法繪制方塊,再假定方塊數(shù)組左上角在地圖中的坐標(biāo)為x和y,則繪制動態(tài)方塊可采用如下方式實(shí)現(xiàn)。</p><p>  for(int i=0;i<=3;i++)</p><p>  for(int j=0;j<=3;j++)</p><p>  if(Block[block

62、type][turnstate][i][j]==1)</p><p>  g.fill3DRect((y+j)*width,(x+i)*width,width,width,raised);</p><p>  這種繪制方式的原理是每一次繪制一個單位長度的正方形格子,在將這些格子組合成某一種的形態(tài)方塊。這里面,某一種形態(tài)的方塊是由方塊數(shù)組中的參數(shù)i和j決定的,具體是哪種形態(tài)的方塊,方塊的哪一

63、種翻轉(zhuǎn)狀態(tài),是由參數(shù)blocktype和turnstate決定的。而參數(shù)y+j表示的當(dāng)前格子的左上角在游戲地圖中的橫坐標(biāo),x+i表示的是小格子的縱坐標(biāo)。</p><p>  ·遍歷游戲地圖數(shù)組實(shí)現(xiàn)墜下方塊的消行繪制</p><p>  當(dāng)墜下的方塊有滿行需要重新繪制時,需要進(jìn)行消行繪制。首先,可用一個數(shù)值代表游戲地圖數(shù)組的某一個區(qū)域是否有方塊填充,假定這個數(shù)值是2,即如果地圖數(shù)組

64、中某一個元素的值為2,則表示這個元素所代表的地圖區(qū)域存在方塊。進(jìn)行消行繪制時需要判斷地圖數(shù)組的某一行是否全為2,如果全為2,則可以認(rèn)為這行被方塊填滿,需要進(jìn)行消行,然后再繼續(xù)往下判斷下一行,直到所有滿行被消除為止。</p><p>  圖4.2 消行流程圖</p><p>  4.3.3音樂播放模塊的設(shè)計(jì)</p><p>  音頻文件的播放涉及到IO操作,不管是何種

65、系統(tǒng),對于IO操作,都是比較慢的,如果當(dāng)程序運(yùn)行到需要播放音效時,再從文件中取得音頻數(shù)據(jù),然后播放,很可能會造成一種“卡”的感覺,影響用戶體驗(yàn)?;诖耍?jīng)過反復(fù)論證,本游戲決定采用以剪輯的方式來播放音頻文件。</p><p>  JAVA語言中的剪輯Clip,是一種在播放之前就提前加載于內(nèi)存中的特殊的音頻數(shù)據(jù)流,當(dāng)需要用時,只需直接從內(nèi)存中調(diào)出即可,省去了IO讀取所需的大量時間,而且剪輯播放完畢后,仍舊存儲在內(nèi)存

66、中,對于游戲的背景音樂及音效這類需要反復(fù)多次播放的音頻,這種方式是非常有用的。</p><p>  單單采用剪輯還是不夠的,音頻文件的播放,應(yīng)當(dāng)另外開啟線程來控制,這樣既可以更方便地控制音頻的播放、暫停等操作,也不會程序執(zhí)行其它的操作。</p><p><b>  1.音效播放</b></p><p>  在游戲開始、暫停,方塊落下及消行時添加

67、相應(yīng)的音效既可以提醒用戶發(fā)生某種變化,又能增強(qiáng)程序的表現(xiàn)效果。音效,相對來說是比較小的音頻文件,對于音效,可選取wav格式的音頻文件,不但音頻質(zhì)量好,在系統(tǒng)支持、存儲性方面也占有優(yōu)勢。</p><p>  根據(jù)多線程及剪輯的思想,首先在程序初始化時應(yīng)該把音效載入內(nèi)存,游戲開始后開啟一個線程,當(dāng)滿足音效播放的條件時,即播放音效,音效播放完畢后,應(yīng)當(dāng)將相應(yīng)的音頻文件的剪輯位置重新置為開始處。</p>&

68、lt;p><b>  2.背景音樂播放</b></p><p>  同音效的播放,背景音樂的播放也應(yīng)當(dāng)采用剪輯的形式,以方便音樂的循環(huán)多次播放,同樣,背景音樂播放可能是貫穿于整個游戲過程,背景音樂的播放必須采用單獨(dú)的線程控制,以不影響程序執(zhí)行其它操作。</p><p>  因?yàn)楸尘耙魳凡捎脝为?dú)線程播放,這里面會出現(xiàn)一個問題,當(dāng)用戶選擇暫停背景音樂播放時,背景音樂

69、播放線程是進(jìn)入wait狀態(tài)還是以另一種方式實(shí)現(xiàn)暫停?如果背景音樂進(jìn)入wait狀態(tài),則當(dāng)用戶取消暫停播放時,必須再創(chuàng)建一個線程去喚醒它,新建一個線程只是控制背景音樂播放,不免浪費(fèi)資源,而且也增加程序編寫難度。</p><p>  考慮到背景音樂極可能在玩家的整個游戲過程中都處在播放狀態(tài),當(dāng)暫停時,玩家也隨時會取消暫停,故而在游戲結(jié)束之前,本程序會將背景音樂播放線程一直處在執(zhí)行狀態(tài),如果玩家暫停音樂播放,則讓線程轉(zhuǎn)去

70、處理檢測玩家是否取消暫停,當(dāng)檢測到暫停取消后,繼續(xù)播放音樂。</p><p>  4.3.4道具使用模塊</p><p>  目前已經(jīng)存在的俄羅斯方塊游戲鮮有能夠使用道具的,開發(fā)一款能夠使用道具功能的俄羅斯方塊游戲具有一定挑戰(zhàn)度,因?yàn)榈谰叩拈_發(fā)不僅涉及到游戲策劃等創(chuàng)意性的內(nèi)容,也與圖形圖像處理等美工技術(shù)息息相關(guān),而作者對美工卻是不擅長的,基于此,本游戲最初版本的道具可能只有一個,但是為了將

71、來版本提升的方便,本程序另外預(yù)留了三種道具的使用接口。</p><p>  本游戲一共設(shè)計(jì)了五種道具,旋轉(zhuǎn)方塊、炸彈、地雷、仙女、惡魔,這四種道具是程序現(xiàn)今或?qū)戆姹咎嵘笠褂玫降?,暫時,本游戲?qū)⒅粚?shí)現(xiàn)旋轉(zhuǎn)方塊和炸彈兩種道具。</p><p><b>  1.旋轉(zhuǎn)方塊</b></p><p>  旋轉(zhuǎn)方塊是一種增加游戲難度的道具,它本身其實(shí)就

72、是方塊,和正常的方塊的不同之處就在于,正常方塊在下落時,如果沒有接受到用戶的控制命令是不會旋轉(zhuǎn)的,而旋轉(zhuǎn)方塊則會不斷地旋轉(zhuǎn)下降。這樣,用戶便很難控制旋轉(zhuǎn)方塊下墜到指定的位置。</p><p>  對于旋轉(zhuǎn)方塊的定時下落,可以借用方塊控制線程,但是旋轉(zhuǎn)方塊的定時旋轉(zhuǎn),則只能依靠另一個線程實(shí)現(xiàn)。</p><p><b>  2.炸彈</b></p><

73、p>  本游戲定義的炸彈能夠像方塊一樣從地圖的頂部墜落,當(dāng)下墜到地圖下部與堆積的方塊碰撞時會發(fā)生“爆炸”,爆炸將炸毀一定數(shù)量的方塊。</p><p>  炸彈的視圖模型以現(xiàn)成的方塊模型為依據(jù),即除了添加的“炸彈”標(biāo)記,它和七種方塊在外形上是沒有任何區(qū)別的。炸彈,可以看成是一種特殊類型的方塊。</p><p>  對于炸彈的殺傷力,有一個規(guī)則,如果炸彈能夠沒入已經(jīng)墜下的方塊中,則可以將

74、這個“炸彈”所占的行數(shù)全部炸毀,并增加相應(yīng)的積分,如果本身已經(jīng)能夠消行,則額外再獎勵一倍的積分。否則,炸彈將只炸毀它左右各兩個格子范圍內(nèi)的方塊。</p><p>  4.3.5網(wǎng)絡(luò)對戰(zhàn)模塊</p><p>  目前的俄羅斯方塊游戲中,也鮮有具備網(wǎng)絡(luò)對戰(zhàn)功能的,這是因?yàn)榇祟愋∮螒虿痪邆湓诰W(wǎng)絡(luò)對戰(zhàn)方面的可玩性,當(dāng)然,如果能夠利用道具進(jìn)行網(wǎng)絡(luò)對攻,那就另當(dāng)別論了。就如QQ上的火并俄羅斯方塊一樣,

75、要實(shí)現(xiàn)利用道具進(jìn)行網(wǎng)絡(luò)對攻,其中一方玩家必須能夠看到他的對手的游戲信息,但這并限于看到對手的道具數(shù)量,下一個方塊預(yù)告。所以,本游戲要求將游戲地圖中方塊的實(shí)時信息遠(yuǎn)程傳輸?shù)搅硪环酵婕业娘@示平臺。</p><p>  圖像的遠(yuǎn)程傳輸首先要求將游戲地圖中的方塊信息轉(zhuǎn)化為圖像資源,然后將圖像資源轉(zhuǎn)化成基于某種圖片格式的數(shù)據(jù)流,進(jìn)行打包發(fā)送,在接收端上,再把圖像數(shù)據(jù)從數(shù)據(jù)包上提取出來,進(jìn)行解碼,生成相應(yīng)的圖像,然后再把圖像

76、繪制到游戲畫布中。</p><p>  進(jìn)行網(wǎng)絡(luò)傳輸,首先應(yīng)當(dāng)選定一種網(wǎng)絡(luò)傳輸協(xié)議。TCP套接字協(xié)議和UDP數(shù)據(jù)報(bào)協(xié)議二者中前者傳輸速率慢,但是提供可靠性保證,準(zhǔn)確率高,后者傳輸速率快,但是并提供可靠性保證。對于游戲的網(wǎng)絡(luò)對戰(zhàn)來說,對網(wǎng)絡(luò)傳輸?shù)膶?shí)時性要求比較高,一方玩家必須能夠看到另一方玩家游戲狀況的實(shí)時信息,這就要求圖像的傳輸速率必須要快,同樣因?yàn)樗膶?shí)時性,即使某一次傳輸錯誤,后面一幀圖像也會馬上覆蓋前面的圖

77、像,人的肉眼基本上不能辨別出這種錯誤,基于此,本游戲的網(wǎng)絡(luò)對戰(zhàn)傳輸方式應(yīng)該采用基于UDP的用戶數(shù)據(jù)報(bào)協(xié)議。</p><p><b>  4.4 可靠性設(shè)計(jì)</b></p><p>  游戲在設(shè)計(jì)時應(yīng)當(dāng)盡量注意降低各個模塊之間的耦合性,增強(qiáng)模塊的獨(dú)立性,以便將來需求時進(jìn)行游戲版本的提升以及相關(guān)維護(hù)。</p><p>  4.5 概要設(shè)計(jì)評審<

78、;/p><p>  經(jīng)過反復(fù)論證,上面提出的設(shè)計(jì)方案,尤其是游戲設(shè)計(jì)的各個功能模塊間的算法確實(shí)可行,因此,本游戲可進(jìn)入詳細(xì)設(shè)計(jì)階段。</p><p><b>  第5章 詳細(xì)設(shè)計(jì)</b></p><p><b>  5.1 客戶端設(shè)計(jì)</b></p><p>  客戶端是游戲非常重要的一部分,它是所有游

79、戲功能的開關(guān),上面集合了許多的圖像用戶接口,客戶端的實(shí)現(xiàn)應(yīng)該確定一種合理的組織架構(gòu)。圖5.1是客戶端的組織結(jié)構(gòu)圖:</p><p>  圖5.1 客戶端的組織架構(gòu)圖</p><p>  游戲客戶端采用swing組件開發(fā),并且向其注冊監(jiān)聽器,以實(shí)現(xiàn)各種控制功能,綜合游戲前面的設(shè)計(jì),客戶端上至少要注冊三個監(jiān)聽器,分別是窗口監(jiān)聽器(WindowListener)、動作監(jiān)聽器(ActionList

80、ener)、鍵盤監(jiān)聽器(KeyListener)、選項(xiàng)監(jiān)聽器(ItemListener)。</p><p>  根據(jù)初步設(shè)計(jì),可以確定客戶端上所要用到的Swing組件對象有JFrame對象、JPanel對象,JLabel對象、JButton對象、JMenuBar對象、JMenu對象、JMenuItem對象、JTextField對象、JTextArea對象、JDialog對象、JRadioButton對象、JTab

81、bedPane對象,至少十二個swing組件對象。</p><p>  JFrame用以創(chuàng)建窗體,考慮到本游戲具備單機(jī)和網(wǎng)絡(luò)對戰(zhàn),JFrame對象的大小并不是不變的,在單機(jī)游戲和網(wǎng)絡(luò)對戰(zhàn)時,JFrame對象分別會呈現(xiàn)出不同大小,以適應(yīng)不同的游戲環(huán)境需求。</p><p>  在主界面上,可以確定有四個JPanel對象。第一個JPanel對象是用來繪制方塊的游戲地圖,第二個JPanel對象是

82、用來排列其它各種組件的容器組件,做游戲信息顯示面板,可以放在游戲地圖的左邊,第三個JPanel對象是用來顯示NEXT方塊的,應(yīng)該畫在第二個JPanel對象上,第三個JPanel對象是當(dāng)網(wǎng)絡(luò)對戰(zhàn)時,用來繪制另一方玩家游戲地圖的繪圖面板,放在游戲信息顯示面板的右邊。</p><p>  可以確定,主界面上,本游戲的按鈕有五個,一個“開始游戲”按鈕,四個道具按鈕,排列在游戲信息顯示面板上,可以將“開始游戲”按鈕放在頂端

83、,當(dāng)按下“開始游戲”按鈕后,應(yīng)該改變“開始游戲”按鈕的文本內(nèi)容為“暫停游戲”,按下“暫停游戲”按鈕后,再將其文本內(nèi)容重新設(shè)置為“開始游戲”。至于四個道具按鈕,可以放在信息顯示面板的中部位置。</p><p>  JTextArea對象用來顯示游戲時的相關(guān)信息,比如網(wǎng)絡(luò)對戰(zhàn)時顯示雙方玩家的比分等信息。JTextArea應(yīng)該放在游戲信息面板的底部。</p><p>  JTextField對象

84、至少應(yīng)該有兩個,用來顯示雙方玩家的分?jǐn)?shù)信息,考慮到對戰(zhàn)時的局時設(shè)置,還應(yīng)該增加一個文本框用來計(jì)時,計(jì)時的文本框最好放在JTextArea對象的上方,這樣,兩個分?jǐn)?shù)文本框則布置在道具按鈕和計(jì)時文本框之間。</p><p>  本游戲主界面上的JLabel對象至少應(yīng)該有四個。首先,應(yīng)該為NEXT方塊畫布添加一個標(biāo)簽,然后在四個道具按鈕上也應(yīng)該添加一個道具標(biāo)簽,最后,在兩個顯示分?jǐn)?shù)的文本框上方也應(yīng)該添加一個標(biāo)簽最后,在

85、游戲主界面的頂端要添加一個菜單欄,菜單欄上添加幾個菜單對象。</p><p>  綜合以上信息,可以大概確定本游戲的主界面,如圖5.2所示:</p><p>  圖5.2 游戲界面圖</p><p>  5.2音效播放控制模塊設(shè)計(jì)</p><p>  本游戲的音效播放采用剪輯及多線程的方式實(shí)現(xiàn)。音頻播放需要用到JAVA中的sound包。首先,

86、利用AudioSystem這個音頻工廠的getAudioInputstream()方法從音頻文件中取得一個音頻輸入流,其次,從這個音頻輸入流創(chuàng)建一個Clip,然后打開這個Clip。這樣,當(dāng)需要時,就可以利用Clip中的start()方法播放這個剪輯,重復(fù)播放,可以用setFramePosition(0)這個方法將剪輯的位置重新置為0。</p><p>  音效剪輯的播放控制流程圖如圖5.3所示:</p>

87、;<p>  圖5.3 音效播放流程圖</p><p>  5.3背景音樂播放控制模塊設(shè)計(jì)</p><p>  同音效的播放,背景音樂的播放也應(yīng)當(dāng)采用剪輯的形式,以方便音樂的循環(huán)多次播放,同樣,背景音樂播放也要單獨(dú)的線程進(jìn)行控制。</p><p>  前面概要設(shè)計(jì)提出了一個問題。因?yàn)楸尘耙魳凡捎脝为?dú)線程播放,當(dāng)用戶選擇暫停背景音樂播放時,背景音樂播放線

88、程如果以進(jìn)入wait狀態(tài)來暫停的話,則當(dāng)用戶取消暫停時必須還需要一個線程來喚醒它,額外增加一個線程的話,不免浪費(fèi)系統(tǒng)資源,而且也會增加編寫的難度。</p><p>  從另一個角度來說,背景音樂極可能在玩家的整個游戲過程中都處在播放狀態(tài),當(dāng)暫停時,玩家也隨時會取消暫停,因此,可以讓背景音樂線程從游戲開始后就一直處在執(zhí)行狀態(tài),如果用戶暫停播放,可以讓線程轉(zhuǎn)去循環(huán)處理檢測用戶是否取消暫停,當(dāng)檢測到用戶取消暫停時,繼續(xù)

89、播放音樂。</p><p>  背景音樂播放控制的算法流程如圖5.4所示:</p><p>  圖5.4 背景音樂播放控制流程圖</p><p>  5.4網(wǎng)絡(luò)對戰(zhàn)模塊設(shè)計(jì)</p><p>  如圖5.2游戲界面圖所示,可以在菜單欄中“游戲”菜單項(xiàng)中添加一個“網(wǎng)絡(luò)對戰(zhàn)”菜單選項(xiàng),當(dāng)用戶單擊“網(wǎng)絡(luò)對戰(zhàn)”菜單選項(xiàng)后,彈出一個對話框,提示用戶輸入要

90、連接的主機(jī)的IP地址,用戶輸入IP地址后,程序會記錄下這個IP地址,當(dāng)用戶開啟游戲后,數(shù)據(jù)傳輸線程會將數(shù)據(jù)發(fā)送到這個IP地址的指定端口號上。</p><p>  對于實(shí)現(xiàn)網(wǎng)絡(luò)傳輸?shù)募夹g(shù),可以用UDP數(shù)據(jù)報(bào)傳輸方式。首先從AWT包中的Robot創(chuàng)建一個實(shí)例,這個類的實(shí)例是有關(guān)本機(jī)屏幕資源的信息,它有一個createScreenCapture()方法,可以用它來創(chuàng)建屏幕上指定坐標(biāo)位置,指定大小的一副圖像。</p

91、><p>  當(dāng)然,在此之前,我們還需要獲得游戲地圖所在屏幕的坐標(biāo)。Component類中提供了一個獲取組件屏幕坐標(biāo)的方法getLocationOnScreen(),我們可以利用這個方法獲取組件在屏幕上的坐標(biāo),然后把這個坐標(biāo)賦給一個Point對象,再從Rectangle類中創(chuàng)建一個指定屏幕坐標(biāo)位置,指定寬和高的矩形,然后就可以用createScreenCapture()創(chuàng)建一副包含游戲地圖區(qū)域的圖像了。</p&

92、gt;<p>  創(chuàng)建圖像信息以后,可以利用imageio包ImageIO類中的write(RenderedImage im, String formatName, OutputStream output)方法將圖像文件寫入到一個輸出流中,然后可以用toByteArray()從輸出流中取得數(shù)據(jù),最后就是將數(shù)據(jù)打包發(fā)送了。</p><p>  對于接收端接收到的數(shù)據(jù)包,可

93、以先從數(shù)據(jù)包中將圖像字節(jié)數(shù)據(jù)提出出來放到一個字節(jié)數(shù)組中,然后利用Toolkit包中的createImage(byte[] imagedata)方法將圖像字節(jié)數(shù)據(jù)轉(zhuǎn)化成圖像,最后將圖像畫到游戲畫布中即可。</p><p>  相應(yīng)的算法流程如圖5.5所示:</p><p>  (a) 圖像發(fā)送流程 (b) 圖像接收流程</p>

94、<p>  圖5.5 圖像發(fā)送和接收流程圖</p><p><b>  5.5道具模塊設(shè)計(jì)</b></p><p>  5.5.1旋轉(zhuǎn)方塊的設(shè)計(jì)</p><p>  旋轉(zhuǎn)方塊的出現(xiàn)是隨機(jī)的,而隨著游戲級別的提升,每一關(guān)出現(xiàn)的旋轉(zhuǎn)方塊的數(shù)量也會不同,對于七種方塊來說,它們在任何一段時間內(nèi)出現(xiàn)的概率都是一致的,再者,旋轉(zhuǎn)方塊需要兩個定時器

95、,定時下落和定時旋轉(zhuǎn)。旋轉(zhuǎn)方塊的這個性質(zhì)要求它必須要兩個線程才能控制,但是為了充分利用資源,我們可以利用方塊控制線程去控制旋轉(zhuǎn)方塊定時下落,然后只需再創(chuàng)建一個線程控制它定時旋轉(zhuǎn)即可。</p><p>  確定了兩個線程共同控制旋轉(zhuǎn)方塊,就會出現(xiàn)一個線程協(xié)調(diào)工作的問題。如果一個新方塊出現(xiàn)的時機(jī)正好也是旋轉(zhuǎn)方塊出現(xiàn)的時機(jī),程序就會出現(xiàn)紊亂,所以必須保證,在同一時間,正常方塊和旋轉(zhuǎn)方塊只能出現(xiàn)一個。</p>

96、<p>  因?yàn)閮蓚€線程需要共同控制旋轉(zhuǎn)方塊,所以不能用wait()和notify()這兩個方法去協(xié)調(diào)線程,而應(yīng)當(dāng)利用其它條件去協(xié)調(diào)兩個線程。</p><p>  首先,游戲開始后,旋轉(zhuǎn)方塊控制線程可以隨機(jī)休眠一定時間(這個休眠時間應(yīng)該是隨著游戲級別的提升而縮短的)。休眠時間結(jié)束后,循環(huán)檢測正常方塊是否已經(jīng)落下,當(dāng)檢測到方塊落下后,馬上得到一個新方塊,然后開啟一個循環(huán),在方塊沒有落下之前讓它按一定的

97、時間頻率旋轉(zhuǎn),成為一個旋轉(zhuǎn)方塊。</p><p>  對于方塊控制線程,在方塊落下時應(yīng)該休眠一定數(shù)量的時間,以讓旋轉(zhuǎn)方塊控制線程有得到旋轉(zhuǎn)方塊的機(jī)會,如果超出這個休眠時間,旋轉(zhuǎn)方塊控制線程還沒有得到新方塊,則可以認(rèn)為旋轉(zhuǎn)方塊控制線程還處在休眠中,方塊控制線程得到一個新方塊。</p><p>  相應(yīng)的算法流程如圖5.6和圖5.7所示:</p><p>  圖5.6

98、旋轉(zhuǎn)方塊控制線程工作圖</p><p>  圖5.7 方塊控制線程對旋轉(zhuǎn)方塊的控制示意圖</p><p>  5.5.2炸彈的設(shè)計(jì)</p><p>  道具的出現(xiàn)是隨機(jī)的。本游戲中要實(shí)現(xiàn)的道具“炸彈”和方塊一樣,從游戲地圖頂部降落,每隔一個時間間隔,會自動降落一格。對于炸彈的控制,可以添加到道具(旋轉(zhuǎn)方塊)控制線程中。</p><p>  炸

99、彈控制的算法流程如圖5.8所示:</p><p>  圖5.8 炸彈的算法流程圖</p><p>  綜合以上信息,道具的詳細(xì)設(shè)計(jì)如圖5.9所示:</p><p>  圖5.9 道具的詳細(xì)設(shè)計(jì)圖</p><p>  5.6 主模塊——方塊與地圖模塊設(shè)計(jì)</p><p>  方塊與地圖模塊是游戲中最主要的模塊,本模塊存儲

100、了游戲最重要的兩個數(shù)據(jù)結(jié)構(gòu)——方塊四維數(shù)組和地圖坐標(biāo)二維數(shù)組,以及對這兩個數(shù)據(jù)結(jié)構(gòu)的操作。這些操作就構(gòu)成了游戲中最基本也是最主要的功能,如得到方塊、方塊的翻轉(zhuǎn)移動、滿行消除等等。</p><p>  本模塊中方塊的數(shù)據(jù)結(jié)構(gòu)用一個四維數(shù)組存儲,數(shù)組的第一維代表方塊的形態(tài),即是哪一種方塊,第二維代表某種方塊的一個翻轉(zhuǎn)狀態(tài),第三和第四代表的是具體的方塊。</p><p>  例如,定義一個四維數(shù)

101、組,int block[blocktype][turnstate][i][j],這就是七種方塊、四種狀態(tài),一共二十八個方塊的模型。當(dāng)然,這其中,有一些方塊的幾種翻轉(zhuǎn)狀態(tài)是一樣的,比如,長條形的方塊,只有兩種翻轉(zhuǎn)狀態(tài),田字形的方塊,只有一種翻轉(zhuǎn)狀態(tài),這些方塊在方塊數(shù)組中存儲的多種狀態(tài)也就是一樣的。</p><p>  如何將方塊繪制到地圖中去,可以說是游戲主模塊中最大的難題,有了良好的方塊數(shù)據(jù)結(jié)構(gòu)和地圖數(shù)據(jù)結(jié)構(gòu),這

102、個難題也就變得簡單了。只要得到方塊數(shù)組在游戲地圖中的坐標(biāo),然后遍歷方塊數(shù)組,將方塊數(shù)組中值為1的地方繪上一個單位的正方形格子,方塊數(shù)組遍歷完畢后,也就在地圖上繪制出了形狀不規(guī)則的方塊。</p><p>  良好的數(shù)據(jù)結(jié)構(gòu)讓方塊的移動,滿行消除等操作變得簡單。方塊的移動和滿行消除,涉及到的是對游戲地圖數(shù)據(jù)的操作,例如方塊往下移,需要將游戲地圖的橫坐標(biāo)也隨著往下移動一個單位,往左往右移動也同樣如此。</p>

103、;<p>  方塊滿行消除,需要遍歷游戲地圖數(shù)組,發(fā)現(xiàn)某一行數(shù)值全為2,即認(rèn)為這一行被方塊填滿,應(yīng)該消去,行消去之后,應(yīng)該把這行以上的數(shù)據(jù)全部向下移動一行,然后再繼續(xù)往下檢測,有滿行就消行,再把上面的數(shù)據(jù)整體往下移動一行,如此重復(fù),直到將所墜下方塊占據(jù)的行數(shù)檢測完為止。最后得到的就是消行之后方塊的堆積狀況和游戲地圖數(shù)據(jù)了。</p><p>  本模塊的主流程圖如圖5.10所示:</p>

104、<p>  圖5.10 方塊和地圖數(shù)據(jù)模塊流程圖</p><p>  5.6.1 得到方塊</p><p>  如圖5.10所示,游戲中得到方塊分兩種,一是當(dāng)方塊落下后得到一個新方塊,顯示在游戲地圖中,接著得到一個NEXT方塊,顯示在NEXT方塊畫布中。這里,將要解決的問題就是怎么得到一個新方塊,怎么得到一個NEXT方塊,又怎么將NEXT方塊作為下一個新方塊。</p>

105、;<p>  方塊是有模型和顏色的,在得到一個方塊前,還得先得到要出現(xiàn)的方塊的模型和顏色,然后才能在畫布中繪制出指定模型、指定顏色的方塊。</p><p><b>  1.方塊的模型</b></p><p>  每得到一個新方塊,都是隨機(jī)從七種形態(tài)的方塊中選取一種。由概要設(shè)計(jì)中可以得出分析,可以定義一個變量,代表新方塊的模型。比如定義int型變量bloc

106、ktype代表方塊模型,方塊的模型只有七種,所以blocktype的取值也只有七個,可以設(shè)定blocktype取值從0到6。</p><p>  即,0<=blocktype<=6</p><p>  那么,當(dāng)方塊落下需要得到新方塊時,只需隨機(jī)得到一個blocktype值,然后再把這個blocktype值賦給方塊數(shù)組的第一維即可。</p><p>  剩

107、下的問題就是應(yīng)該怎么隨機(jī)到一個blocktype?</p><p>  JAVA語言包中的Math類提供了一個換取隨機(jī)數(shù)的方法random(),調(diào)用這個方法會產(chǎn)生一個值在0-1之間的雙精度浮點(diǎn)數(shù)。所以每次要得到新方塊時,只需調(diào)用一次這個方法,得到一個0-1的雙精度浮點(diǎn)數(shù),然后把這個數(shù)乘以一個稍大的整數(shù),比如1000,得到的結(jié)果除以7,然后取余,最后將余數(shù)取整,取整后的結(jié)果就是一個大于等于0,小于等于6的block

108、type值了。</p><p><b>  2.方塊的顏色</b></p><p>  如果游戲中只有一種單色的方塊,游戲未免顯得過于單調(diào),因此本游戲期望能夠設(shè)計(jì)出彩色的方塊。</p><p>  對于色彩值的得到,也可以用上面的方法,比如可以預(yù)先定義幾種顏色,然后隨機(jī)得到某一個數(shù),這個數(shù)代表其中一種顏色,但是這樣游戲的色彩還是顯得有些單調(diào)。本

109、游戲的期望是設(shè)計(jì)出色彩繽紛的方塊,這個色彩繽紛甚至可以是整個游戲中出現(xiàn)的方塊顏色都可以不一樣。為了達(dá)到這個目的,在每次構(gòu)造一個新方塊時,就需要從顏色庫中構(gòu)造一個新顏色。</p><p>  我們知道,顏色其實(shí)是由紅、綠、藍(lán)三種顏色復(fù)合成的,這三種顏色復(fù)合時每一種顏色分量的不同,都會產(chǎn)生一種不同視覺效果的顏色。所以,在構(gòu)造顏色時,我們可以分別給紅、綠、藍(lán)隨機(jī)出一個不同的顏色值。</p><p&g

110、t;  JAVA抽象窗口工具包中提高了Color顏色類,其中有一個構(gòu)造方法,是通過指定紅綠藍(lán)三種顏色分量來構(gòu)造一個新color,有了這個構(gòu)造方法,再利用Math類中的random方法,就可以達(dá)到“色彩繽紛”的效果了。</p><p>  3.如何得到一個新方塊</p><p>  在隨機(jī)出一個新的blocktype值后,要得到新方塊就變得非常簡單了,只需要將blocktype值傳遞給方塊數(shù)

溫馨提示

  • 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論