畢業(yè)設(shè)計(jì)---俄羅斯方塊游戲程序設(shè)計(jì)_第1頁(yè)
已閱讀1頁(yè),還剩43頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、<p><b>  1 緒論</b></p><p>  游戲是人們活動(dòng)中一項(xiàng)非常重要的內(nèi)容,有人認(rèn)為如果哪一天人類對(duì)所有的游戲都失去興趣,恐怕世界的末日就要到了。電腦對(duì)游戲的貢獻(xiàn)有目共睹,現(xiàn)在摸過(guò)電腦的人很少有沒(méi)玩過(guò)電腦游戲的,喜歡游戲的人也很少有不玩電腦的。</p><p>  隨著越來(lái)越多的人接觸計(jì)算機(jī)開(kāi)始,人們對(duì)游戲的要求也越來(lái)越高,網(wǎng)絡(luò)游戲占據(jù)著

2、計(jì)算機(jī)游戲非常大的市場(chǎng),但是很多人同時(shí)也特別喜歡玩單機(jī)游戲,單機(jī)游戲(ConsoleGame),指僅使用一臺(tái)計(jì)算機(jī)或者其它游戲平臺(tái)就可以獨(dú)立運(yùn)行的電子游戲。區(qū)別于網(wǎng)絡(luò)游戲,它不需要專門(mén)的服務(wù)器便可以正常運(yùn)轉(zhuǎn)游戲,部分也可以通過(guò)局域網(wǎng)或者戰(zhàn)網(wǎng)進(jìn)行多人對(duì)戰(zhàn)。游戲玩家不連入互聯(lián)網(wǎng)即可在自己的電腦上玩的游戲,模式多為人機(jī)對(duì)戰(zhàn)。為其不能連入互聯(lián)網(wǎng)而互動(dòng)性稍顯差了一些,但以通過(guò)局域網(wǎng)的連接進(jìn)行多人對(duì)戰(zhàn),而不需要專門(mén)服務(wù)器也可以正常運(yùn)行的游戲。所以一

3、個(gè)好的單機(jī)游戲會(huì)受到世界上非常多人的追捧。</p><p>  俄羅斯方塊游戲是一款風(fēng)靡全球的電視游戲機(jī)和掌上游戲機(jī)游戲,目前在QQ游戲和很多的游戲平臺(tái)上都能見(jiàn)到俄羅斯方塊的身影。這款游戲最初是由蘇聯(lián)的游戲制作人Alex Pajitnov制作的,它看似簡(jiǎn)單但卻變化無(wú)窮,令人上癮。相信大多數(shù)用戶都還記得為它癡迷得茶不思飯不想的那個(gè)俄羅斯方塊時(shí)代。究其歷史,俄羅斯方塊最早還是出現(xiàn)在PC機(jī)上,而我國(guó)的用戶都是通過(guò)紅白機(jī)

4、了解、喜歡上它的。現(xiàn)在聯(lián)眾又將重新掀起這股讓人沉迷的俄羅斯方塊風(fēng)潮。對(duì)一般用戶來(lái)說(shuō),它的規(guī)則簡(jiǎn)單,容易上手,且游戲過(guò)程變化無(wú)窮,而在"聯(lián)眾俄羅斯方塊"中,更有一些聯(lián)眾網(wǎng)絡(luò)游戲所獨(dú)有的魅力――有單機(jī)作戰(zhàn)與兩人在線對(duì)戰(zhàn)兩種模式,用戶可任選一種進(jìn)行游戲。網(wǎng)絡(luò)模式還增加了積分制,使用戶既能感受到游戲中的樂(lè)趣,也給用戶提供了一個(gè)展現(xiàn)自己高超技藝的場(chǎng)所。而它曾經(jīng)造成的轟動(dòng)與造成的經(jīng)濟(jì)價(jià)值可以說(shuō)是游戲史上的一件大事。無(wú)可爭(zhēng)議,《俄

5、羅斯方塊》是有史以來(lái)最偉大的游戲之一?它是永恒的娛樂(lè)經(jīng)典,但它實(shí)際上又和那些傳統(tǒng)的經(jīng)典娛樂(lè)方式不同,因?yàn)樗谋举|(zhì)是電子化的,所以它的確屬于現(xiàn)代產(chǎn)物?《俄羅斯方塊》舉世聞名的游戲性,在該游戲新鮮出爐時(shí)就顯得非常直觀?某些與墜落的玩</p><p>  1.1 電子游戲及其分類</p><p>  電子游戲,也就是運(yùn)行在家用電腦、家用電子游戲機(jī)或是掌中寶游戲機(jī)及街機(jī)上的電子游戲程序。電子游戲是

6、一種結(jié)合劇情故事、美術(shù)、音樂(lè)、動(dòng)畫(huà)、程序等技術(shù)于一身的互動(dòng)型娛樂(lè)軟件,涉及到多個(gè)行業(yè)。</p><p>  從電子游戲的分類來(lái)看,有著多種分類方式。傳統(tǒng)的游戲分類是按照游戲類型,將其分為即時(shí)戰(zhàn)略游戲、第一人稱射擊游戲、角色扮演游戲、策略型游戲等類別。根據(jù)游戲運(yùn)行平臺(tái)的不同,可將電子游戲分為游戲機(jī)游戲、單機(jī)版PC 游戲、互動(dòng)電視游戲、在線游戲和手機(jī)游戲。</p><p>  1.2 電子游戲

7、發(fā)展現(xiàn)狀</p><p>  1.2.1電子游戲在國(guó)外的發(fā)展現(xiàn)狀</p><p>  真正的電子游戲機(jī)產(chǎn)生于20世紀(jì)70年代。1971年,麻省理工學(xué)院的學(xué)生Nolan Bushnell設(shè)計(jì)了世界上的黑白電視機(jī)作為顯示屏,用一個(gè)控制柄作為操縱器,不過(guò)由于市場(chǎng)因素這款游戲以失敗告終。但是最后他在電子游戲的發(fā)展上取得了非凡的成就??梢哉f(shuō)時(shí)至今日,電子游戲仍然是外國(guó)的天下。</p>

8、<p>  1.2.2 電子游戲在國(guó)內(nèi)的發(fā)展現(xiàn)狀</p><p>  與電子游戲發(fā)達(dá)的國(guó)家相比,我國(guó)在電子游戲方面還存在比較大的差距。目前,我國(guó)游戲市場(chǎng)正處于發(fā)展階段,但市場(chǎng)上的游戲軟件主要來(lái)自日本、美國(guó)、韓國(guó)等地,但由本土游戲制作人開(kāi)發(fā)創(chuàng)作的游戲正在高速增加,國(guó)產(chǎn)原創(chuàng)的游戲即將成為游戲的主流。</p><p><b>  2 可行性研究</b></

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

10、系統(tǒng)開(kāi)發(fā)的總體任務(wù)是實(shí)現(xiàn)游戲的可操作性、美觀性、及時(shí)性。開(kāi)發(fā)過(guò)程遵循軟件工程師規(guī)范,可采用結(jié)構(gòu)化或面向?qū)ο蠓治鲈O(shè)計(jì)方法。主要實(shí)現(xiàn)windows的GUI程序開(kāi)發(fā),對(duì)游戲中的圖形圖像進(jìn)行鍵盤(pán)控制。游戲者可以通過(guò)上下左右鍵來(lái)對(duì)游戲進(jìn)行操作。</p><p>  主要開(kāi)發(fā)目標(biāo):采用結(jié)構(gòu)化設(shè)計(jì)方法,開(kāi)發(fā)出一個(gè)可操作性、美觀性、及時(shí)性的游戲,實(shí)現(xiàn)windows的GUI程序開(kāi)發(fā),并通過(guò)此次軟件開(kāi)發(fā)過(guò)程全面提高自身的綜合素質(zhì)。&

11、lt;/p><p>  條件假定和限制:由于本軟件目前是我的初次版本,可能還存在一些問(wèn)題。如果該軟件提高版本,本軟件需要根據(jù)游戲者得要求進(jìn)行一步的修改。</p><p>  可行性研究所采用的方法和步驟:通過(guò)研究分析俄羅斯方塊所具備的能力及實(shí)現(xiàn)的方法、確定主體結(jié)構(gòu)。利用現(xiàn)階段我所能達(dá)到的能力,以最簡(jiǎn)潔、最容易的辦法,邊開(kāi)發(fā)邊測(cè)試邊修改,實(shí)現(xiàn)一個(gè)初級(jí)游戲軟件。</p><p&

12、gt;  評(píng)價(jià)尺度:由于本軟件是一個(gè)初級(jí)產(chǎn)品,對(duì)其要求不是太苛刻,所以能夠達(dá)到俄羅斯游戲的一般功能即可。</p><p>  2.3 可行性分析</p><p>  技術(shù)可行性:開(kāi)發(fā)本游戲的編程語(yǔ)言有多種,考慮到自身對(duì)語(yǔ)言的掌握程度,JAVA 語(yǔ)言進(jìn)行游戲的開(kāi)發(fā),采用JAVA GUI 編程來(lái)實(shí)現(xiàn)界面以及事件的控制。</p><p>  經(jīng)濟(jì)可行性:本游戲的開(kāi)發(fā)旨在

13、完成畢業(yè)設(shè)計(jì),不注重直接的經(jīng)濟(jì)效益和其后的發(fā)展方向,只在注重自身水平和能力的提高,對(duì)自身的經(jīng)濟(jì)要求也不高,只要有一臺(tái)能運(yùn)行相應(yīng)JAVA 程序的電腦便可,所以不用考慮到經(jīng)濟(jì)問(wèn)題。</p><p>  社會(huì)可行性:本游戲的開(kāi)發(fā)主要為了完成畢業(yè)設(shè)計(jì),開(kāi)發(fā)的主體是個(gè)人,不存在法律上的侵權(quán)行為,也不會(huì)為社會(huì)造成影響,這方面是完全可行的。</p><p><b>  3 需求分析</

14、b></p><p><b>  3.1 游戲需求</b></p><p>  俄羅斯方塊游戲由28種不同狀態(tài)的方塊隨機(jī)產(chǎn)生,方塊定時(shí)下移,下落的時(shí)候玩家下、左、右控制鍵來(lái)控制方塊的移動(dòng),由上控制鍵來(lái)控制方塊的翻轉(zhuǎn),以便玩家可以得到合適的形狀和位置落下。如果方塊落下后能完全填滿一層,則這一層消去,并且給玩家加分,若是方塊把所有的顯示方框的窗口填滿,則游戲失敗。

15、游戲功能需求如下:游戲界面需求:設(shè)計(jì)良好的游戲界面可以讓玩家充分感受到游戲帶來(lái)的娛樂(lè)性,游戲的背景、方塊用的顏色可以根據(jù)喜好來(lái)自己設(shè)定,在一定的區(qū)域內(nèi)運(yùn)動(dòng)和變形,落下后的障礙物可以用不同顏色顯示,這樣看起來(lái)會(huì)有一定的美感。游戲形狀需求:用數(shù)組作為存儲(chǔ)方塊28 種狀態(tài)的數(shù)據(jù)結(jié)構(gòu),即長(zhǎng)條形、Z 字形、反Z 形、田字形、7 字形、反7 形、T 字型,各個(gè)方塊要能實(shí)現(xiàn)它的變形,可設(shè)為順時(shí)針或逆時(shí)針變形,一般為逆時(shí)針。鍵盤(pán)處理事件需求:方塊下落時(shí)

16、,可通過(guò)鍵盤(pán)方向鍵(上、下、左、右鍵)對(duì)該方塊進(jìn)行向上(變形),向下(加速)、向左、向右移動(dòng)。鼠標(biāo)處理事件需求:通過(guò)點(diǎn)擊菜單欄中相應(yīng)的菜單項(xiàng),可以實(shí)現(xiàn)游戲的開(kāi)始、結(jié)束,方塊形狀的變換的顯示,以及游戲幫助等功能。顯示需求:當(dāng)不同的方塊填滿一行時(shí)可以消行,剩余方塊向下移動(dòng)并統(tǒng)計(jì)分?jǐn)?shù)</p><p><b>  3.2 接口控制</b></p><p>  本游戲通過(guò)鍵盤(pán)

17、進(jìn)行操作,在Windows的操作系統(tǒng)下,利用鍵盤(pán)的上、下、左、右鍵對(duì)方塊進(jìn)行移動(dòng)變形,要使用鍵盤(pán)的接口事件。</p><p><b>  3.3 方案論證</b></p><p>  學(xué)?,F(xiàn)已開(kāi)設(shè)的課程有C語(yǔ)言、C++,java,自己本身自學(xué)了Java,通過(guò)網(wǎng)上以及圖書(shū)館的資料,知道可以通過(guò)C,C++,VB,Delphi,Java實(shí)現(xiàn)俄羅斯方塊游戲的設(shè)計(jì)。下面簡(jiǎn)單介

18、紹下Java的優(yōu)點(diǎn):</p><p>  3.3.1 Java的優(yōu)點(diǎn)</p><p><b>  (1) 安全性</b></p><p>  Java 是一種安全的網(wǎng)絡(luò)編程語(yǔ)言,不支持指針類型,一切對(duì)內(nèi)存的訪問(wèn)都必須通過(guò)對(duì)象的實(shí)例來(lái)實(shí)現(xiàn)。這樣能夠防止他人使用欺騙手段訪問(wèn)對(duì)象的私有成員,也能夠避免在指針操作中易產(chǎn)生的錯(cuò)誤。此外,Java 的安全

19、性體現(xiàn)在多個(gè)層次上:在編譯層,有語(yǔ)法檢查;在解釋層,有字節(jié)碼校驗(yàn)器,可進(jìn)行代碼段格式測(cè)試和規(guī)則檢查、訪問(wèn)權(quán)限和類型轉(zhuǎn)換合法性檢查、操作數(shù)堆棧的上溢和下溢檢測(cè)、代碼參數(shù)類型合法性檢查等;在平臺(tái)層上,通過(guò)配置策略,可設(shè)定訪問(wèn)資源域,無(wú)須區(qū)分本地或遠(yuǎn)程。</p><p><b>  (2) 可移植性</b></p><p>  Java 具備有很好的移植性,這主要得益于它與

20、平臺(tái)無(wú)關(guān)的特性。同時(shí),Java 的類庫(kù)中也實(shí)現(xiàn)了與平臺(tái)無(wú)關(guān)的接口,這使得這些類庫(kù)也能移植。同時(shí),Java 編譯器主要是由Java 本身來(lái)實(shí)現(xiàn)的,Java 的運(yùn)行系統(tǒng)(解釋器)由標(biāo)準(zhǔn)C 語(yǔ)言實(shí)現(xiàn),因而整個(gè)Java系統(tǒng)都具有可移植性。</p><p><b>  (3) 多線程機(jī)制</b></p><p>  Java 具有多線程機(jī)制,這使得應(yīng)用程序能夠并行地執(zhí)行。它的同

21、步機(jī)制也保證了對(duì)共享數(shù)據(jù)的共享操作,而且線程具有優(yōu)先級(jí)的機(jī)制,有助于分別使用不同線程完成特定行為,也提高了交互的實(shí)時(shí)響應(yīng)能力。Java 的多線程技術(shù)使網(wǎng)上實(shí)時(shí)交互實(shí)現(xiàn)很容易,從而為解決網(wǎng)上大數(shù)量的客戶訪問(wèn)提供了技術(shù)基礎(chǔ)。</p><p><b>  (4) 跨平臺(tái)</b></p><p>  通常,在Windows 下編寫(xiě)的程序是不能直接拿到UNIX 上運(yùn)行的,因?yàn)槌?/p>

22、序的執(zhí)行最終必須轉(zhuǎn)換成為計(jì)算機(jī)硬件的機(jī)器指令來(lái)執(zhí)行,專門(mén)為某種計(jì)算機(jī)硬件和操作系統(tǒng)編寫(xiě)的程序是不能夠直接放到其他類型的計(jì)算機(jī)硬件上執(zhí)行的,至少要做移植工作。要想讓程序能夠在不同的計(jì)算機(jī)上運(yùn)行,就要求程序設(shè)計(jì)語(yǔ)言能夠跨越各種軟件和硬件平臺(tái),而Java 恰恰滿足了這一需求。Java 編譯器能夠產(chǎn)生一種與計(jì)算機(jī)體系結(jié)構(gòu)無(wú)關(guān)的字節(jié)指令,只要安裝了Java 虛擬機(jī),Java 就可以在相應(yīng)的處理機(jī)上執(zhí)行。</p><p> 

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

24、;p>  面向?qū)ο蟮某绦蛟O(shè)計(jì),是通過(guò)數(shù)據(jù)和代碼建立分塊的內(nèi)存區(qū)域,以便提供對(duì)程序進(jìn)行模塊化的一種程序設(shè)計(jì)方法,這些模塊可以被用作樣板,在需要時(shí)再建立其副本。C++和Java在面向?qū)ο筮@方面比VB要強(qiáng),所以我排除了用VB做的可能性。但是C++為了與C語(yǔ)言兼容,其是包含了些面向過(guò)程的成分;Java除了C++中非面向過(guò)程的部分,其程序編寫(xiě)過(guò)程就是設(shè)計(jì)、實(shí)現(xiàn)類,定義其屬性、行為的過(guò)程。還有Java特有的“沙箱”機(jī)制是其安全性的保障,同時(shí)它

25、去除了C++中易造成的錯(cuò)誤指針,增加了自動(dòng)內(nèi)存管理等措施,保證了Java程序運(yùn)行的可靠性。</p><p>  所以經(jīng)過(guò)再三比較了三種語(yǔ)言后,決定采用Java語(yǔ)言編寫(xiě)俄羅斯方塊。</p><p>  3.4 軟硬件需求</p><p><b>  4 概要設(shè)計(jì)</b></p><p>  4.1 游戲設(shè)計(jì)所要遵循的

26、規(guī)范</p><p>  一個(gè)良好的程序,在編寫(xiě)之前,必須要制定各種編寫(xiě)規(guī)范,以便組內(nèi)各成員協(xié)調(diào)工作。當(dāng)然,本游戲只是一個(gè)小程序,過(guò)多的規(guī)范制定顯得沒(méi)有必要,但是,也必須制定一個(gè)對(duì)于變量的命名規(guī)則,這有利于設(shè)計(jì)出一個(gè)可讀性高的程序。</p><p>  本程序變量的命名規(guī)則為:</p><p>  ·所有變量一律使用相應(yīng)的英文單詞命名</p>

27、<p>  ·如果同一類中需要?jiǎng)?chuàng)建多個(gè)同一類型,功能相似的變量,變量的前綴應(yīng)使用統(tǒng)一的英文單詞,后綴為下劃線“_”加數(shù)字。</p><p>  比如,從JButton對(duì)象創(chuàng)建開(kāi)始按鈕,可以命名為:startbutton。再如,創(chuàng)建多個(gè)道具按鈕,可以命名為toolbutton_1,toolbutton_2等等。</p><p>  ·方法命名盡量使用能夠描述本

28、方法功能的英文單詞</p><p>  比如,游戲初始化可以用gameinitial。</p><p>  ·類名字命名也應(yīng)當(dāng)使用能夠描述本類功能的英文單詞。</p><p>  如方塊類,可以用class block。</p><p>  4.2 游戲總體設(shè)計(jì)分析</p><p>  Java為純面向?qū)ο?/p>

29、(Object-Oriented,OO)的程序語(yǔ)言,它的諸多優(yōu)點(diǎn)在此就不作論述了。從面向?qū)ο蟮挠^念出發(fā),本程序主要可分為以下幾個(gè)模塊:</p><p>  1 客戶端GUI模塊</p><p>  2 方塊及地圖數(shù)據(jù)模塊</p><p>  3 音頻文件播放模塊</p><p><b>  4 道具使用模塊</b><

30、;/p><p>  4.3 系統(tǒng)流程結(jié)構(gòu)設(shè)計(jì)</p><p><b>  生產(chǎn)</b></p><p>  觸發(fā)按鍵事件 </p><p>  4.4 功能模塊圖的設(shè)計(jì)</p><p>  4.4.1 模型層功能模塊圖設(shè)計(jì)</p><p>  4.4.2

31、視圖層功能模塊圖設(shè)計(jì)</p><p>  4.4.3 控制層功能模塊圖設(shè)計(jì)</p><p>  4.4.4 俄羅斯方塊流程圖</p><p>  4.4.5 旋轉(zhuǎn)方塊控制線程工作圖</p><p><b>  否</b></p><p><b>  否 </b><

32、/p><p><b>  是</b></p><p><b>  是</b></p><p>  否 是</p><p><b>  5 詳細(xì)設(shè)計(jì)</b></p><p>  5.1 運(yùn)用的各種類</p>

33、<p><b>  Shape類</b></p><p>  Void moveLeft(); //左移</p><p>  Void moveRidgt(); //右移</p><p>  Void moveDown(); //下移</p>

34、<p>  Void rotatel(); //旋轉(zhuǎn)(變形)</p><p>  Void drawMe(); //顯示</p><p><b>  Ground 類</b></p><p>  Void accept(Shape); //接受圖形,把圖形變

35、成障礙物</p><p>  Void drawMe(); //顯示</p><p>  游戲顯示面板 </p><p>  GamePanel 類</p><p>  Void display(); //顯示</p><p>  Shape F

36、actory 類(圖形工廠)</p><p>  Shape getShape(); //生產(chǎn)出不同形狀的圖形</p><p>  5.2 圖形的產(chǎn)生</p><p>  通過(guò)圖形工廠類ShapeFactory 的getShape(ShapeListener listener)方法隨機(jī)產(chǎn)生方塊的某種狀態(tài),這里運(yùn)用了工廠設(shè)計(jì)模式,這種設(shè)計(jì)模式

37、是為了實(shí)現(xiàn)高內(nèi)聚低耦合而存在的,這種設(shè)計(jì)模式的通俗解釋就是:想要一個(gè)產(chǎn)品,需要讓工廠給生產(chǎn)一個(gè),要告訴工廠要生產(chǎn)什么產(chǎn)品,就把需要生產(chǎn)的這個(gè)產(chǎn)品當(dāng)做參數(shù)傳給工廠類的生產(chǎn)產(chǎn)品的方法,然后根據(jù)傳進(jìn)來(lái)的產(chǎn)品,而決定工廠人生產(chǎn)什么產(chǎn)品,產(chǎn)生出來(lái)產(chǎn)品后,最后要返回要的這個(gè)東西。</p><p>  5.3 方塊的翻轉(zhuǎn)與移動(dòng)</p><p>  方塊的翻轉(zhuǎn)與移動(dòng)比較容易實(shí)現(xiàn),方塊移動(dòng)只需要改變方塊的

38、橫坐標(biāo)或縱坐標(biāo),然后重新繪制方塊即可。方塊翻轉(zhuǎn)也只需要改變方塊數(shù)據(jù)第二維turnstate的值,然后重新繪制方塊即可。但是,這里邊也會(huì)出現(xiàn)一個(gè)問(wèn)題,這何種時(shí)候,方塊不能再翻轉(zhuǎn)和移動(dòng)。</p><p>  5.3.1 方塊的移動(dòng)</p><p>  很顯然,當(dāng)方塊移動(dòng)到地圖的左右邊界處,或者落下去后,不能再繼續(xù)移動(dòng);另一種情況就是,當(dāng)方塊要移動(dòng)的方向被其他方塊擋住時(shí),方塊不能再移動(dòng)。<

39、;/p><p>  確定方塊移動(dòng)的規(guī)則后,接下來(lái)就是如何將這種規(guī)則用算法表示的問(wèn)題了。比如,當(dāng)方塊移動(dòng)的左邊界處時(shí),方塊不能再繼續(xù)往左移動(dòng)了,這個(gè)時(shí)候,肯定有一個(gè)條件成立,那就是方塊的橫坐標(biāo)必定是小于或者等于零的。</p><p>  如果方塊的橫坐標(biāo)等于0,方塊就不能再移動(dòng),那么方塊數(shù)組的第一列至少有一個(gè)值為1,這種情況比較簡(jiǎn)單,但是,如果方塊數(shù)組的第一列全為0時(shí),也就是說(shuō),當(dāng)方塊數(shù)組有1的

40、那列碰到邊界時(shí),方塊才不能移動(dòng),這個(gè)時(shí)候,首次出現(xiàn)1的那列的橫坐標(biāo)為0,而方塊數(shù)組的橫坐標(biāo)肯定已經(jīng)小于0了。</p><p>  假定我們以x記錄方塊數(shù)組的橫坐標(biāo),以j記錄方塊不能移動(dòng)時(shí),方塊數(shù)組中首次出現(xiàn)1的那列,當(dāng)方塊不能移動(dòng)時(shí),x+j的值必定是等于0的。</p><p>  同理,當(dāng)方塊到達(dá)右邊界不能移動(dòng)時(shí),我們可以從方塊數(shù)組的右邊開(kāi)始檢測(cè),記錄下首先出現(xiàn)1的那列的值,這個(gè)時(shí)候,x+

41、j一定是等于14的。</p><p>  當(dāng)方塊落下后,方塊同樣不能再移動(dòng)。這又分為兩種情況,一種是要墜下的地方還沒(méi)有方塊,這個(gè)時(shí)候,只要可以記錄下方塊數(shù)組中最后出現(xiàn)1的那一行,假定那是第i行,這樣,只要y+i等于24,就可以認(rèn)定方塊已經(jīng)落到游戲地圖的底部,不能再繼續(xù)下落。</p><p>  當(dāng)要方塊下邊或者左右有方塊時(shí),可以確定下邊有方塊的那一格在游戲地圖中的縱坐標(biāo)是橫坐標(biāo)或縱坐標(biāo)是x

42、+j+1或者y+i+1,假定那一格的縱坐標(biāo)坐標(biāo)或者橫坐標(biāo)為y或x,那么游戲地圖數(shù)組中[x+j+1][y]或者[x][y+i+1]這個(gè)元素的值必定是2。</p><p>  綜合以上幾種情況,我們可以列出方塊移動(dòng)條件判定表,如表5.1所示:</p><p>  表 5.1 方塊移動(dòng)條件判定表</p><p>  5.3.2 方塊的翻轉(zhuǎn)</p><

43、p>  大多數(shù)的俄羅斯方塊游戲的翻轉(zhuǎn)判定條件都比較簡(jiǎn)單,即方塊處在邊界處時(shí)就不能再翻轉(zhuǎn),因?yàn)檫@種時(shí)候翻轉(zhuǎn)會(huì)發(fā)生數(shù)組越界錯(cuò)誤。試想一下,當(dāng)方塊移動(dòng)到邊界處,甚至還沒(méi)有到邊界處時(shí),就不能再翻轉(zhuǎn)了,無(wú)疑會(huì)給操作帶來(lái)大大地不方便性。</p><p>  方塊翻轉(zhuǎn)的另一個(gè)問(wèn)題就是,當(dāng)方塊下落過(guò)程中,左右兩邊都有方塊,周圍的空間不能再容許它翻轉(zhuǎn),往往很多游戲沒(méi)有注意到這一點(diǎn),這就導(dǎo)致,方塊翻轉(zhuǎn)之后把原來(lái)存在的方塊給擠掉

44、了,這個(gè)問(wèn)題本質(zhì)上也是翻轉(zhuǎn)越界。</p><p>  為了解決以上問(wèn)題,游戲設(shè)計(jì)中應(yīng)該增加一個(gè)對(duì)于方塊能否翻轉(zhuǎn)的判定以及翻轉(zhuǎn)越界糾正功能。</p><p><b>  1.方塊翻轉(zhuǎn)判定</b></p><p>  如上所述,在兩種情況下一種是方塊落下去固定住以后,第二種是周圍的空間不允許它進(jìn)行翻轉(zhuǎn)。</p><p>  

45、第一種情況好辦,只要參考方塊落下去后不能夠再移動(dòng)的判定即可。</p><p>  對(duì)于第二種情況,在每次方塊翻轉(zhuǎn)前,必須首先計(jì)算出方塊周圍的空間,如果空間允許則翻轉(zhuǎn),否則,不能翻轉(zhuǎn)。</p><p>  這里面又出現(xiàn)一個(gè)棘手的問(wèn)題,因?yàn)槠叻N方塊是不規(guī)則的,每種方塊要求的翻轉(zhuǎn)空間都是不一樣的,甚至是在它的不同翻轉(zhuǎn)狀態(tài)下,所要求的翻轉(zhuǎn)空間也是不一樣的,首先想到的自然就是為每一種方塊,方塊的每一

46、種狀態(tài)都寫(xiě)一個(gè)判定條件,然后根據(jù)當(dāng)前的blocktype和turnstate值,選擇哪種判定條件進(jìn)行判定,但是這樣做未免過(guò)于麻煩。</p><p>  根據(jù)觀察,不難發(fā)現(xiàn),七種形態(tài)的方塊,長(zhǎng)條形的方塊如果以橫條的形態(tài)下落,則只有能夠下落,就能翻轉(zhuǎn),如果以豎條的形態(tài)下落,那么它翻轉(zhuǎn)后所處的位置必須要有4x1個(gè)格子的空間才能夠翻轉(zhuǎn);對(duì)于田字形的方塊,只有能夠繼續(xù)下墜,就一定能夠翻轉(zhuǎn),所以田子型的方塊只要沒(méi)有落下,就一

47、直能夠翻轉(zhuǎn);而其它五種形態(tài)的方塊,又有一個(gè)共同點(diǎn),就是它們都有兩種翻轉(zhuǎn)狀態(tài)橫向占三個(gè)格子的空間,豎直方向占兩個(gè)空間,另外兩種翻轉(zhuǎn)狀態(tài)橫向占兩個(gè)格子的空間,豎直方向占三個(gè)格子空間,如果他們是以橫向占三個(gè)格子的狀態(tài)下落,那么只要能下落,就一定能夠翻轉(zhuǎn),如果是以橫向兩個(gè)格子的狀態(tài)下落,那么在翻轉(zhuǎn)后,周圍必須要有3x2個(gè)格子的空間。</p><p>  所以,方塊翻轉(zhuǎn)的判定,要分三種情況。第一種情況是方塊落下去后不能翻轉(zhuǎn)

48、;第二種情況是對(duì)豎直狀態(tài)出現(xiàn)的長(zhǎng)條形的方塊進(jìn)行翻轉(zhuǎn)判定;第三種情況是對(duì)除長(zhǎng)條形和田字形之外的其它五種以橫向占兩個(gè)格子的狀態(tài)出現(xiàn)的方塊進(jìn)行翻轉(zhuǎn)判定。</p><p>  何種情況下方塊能夠翻轉(zhuǎn)的問(wèn)題解決了,接下來(lái),我們就應(yīng)該解決方塊翻轉(zhuǎn)后所處的位置的問(wèn)題了,因?yàn)橹挥惺孪戎婪綁K翻轉(zhuǎn)后所處的位置,才能夠?qū)δ莻€(gè)位置的空間范圍進(jìn)行判定,判定它是否能夠容納方塊。</p><p>  可以確定的是,無(wú)

49、論方塊怎么翻轉(zhuǎn),都處在方塊數(shù)組中,也就是說(shuō)方塊必定是在游戲地圖中某一4x4個(gè)格子的空間范圍內(nèi)。</p><p>  方塊數(shù)組在游戲地圖中的坐標(biāo)是確定的,不確定的是方塊翻轉(zhuǎn)后到底處在方塊數(shù)組的哪個(gè)位置,為了解決這個(gè)問(wèn)題,我們可以限定方塊在方塊數(shù)組中的存儲(chǔ)原則是靠左、靠上,這樣,無(wú)論翻轉(zhuǎn)怎么翻轉(zhuǎn),方塊數(shù)組中第一行和第一列都是有方塊的,這樣也就確定了方塊在方塊數(shù)組中的位置,也就可以得知方塊翻轉(zhuǎn)后在游戲地圖中的位置了。&

50、lt;/p><p>  假定方塊數(shù)組的橫縱坐標(biāo)是x和y,那么,這個(gè)位置就是,長(zhǎng)條形的方塊翻轉(zhuǎn)后所處的那一行是游戲地圖的第y行,所占的列是第x到x+3列,長(zhǎng)條形和田字形以外的五種方塊翻轉(zhuǎn)后的所占的行數(shù)是游戲地圖的第y和第y+1行,所占的列是第x到x+2列。</p><p>  所以,如果以上空間有空格子,方塊就能夠翻轉(zhuǎn)。</p><p>  據(jù)此,我們可以列出方塊翻轉(zhuǎn)的條

51、件判定表,如圖:</p><p><b>  2.翻轉(zhuǎn)越界糾正</b></p><p>  由上述判定表可以看出,只要方塊翻轉(zhuǎn)后所處的空間足夠,方塊就能夠翻轉(zhuǎn),但是,如果方塊翻轉(zhuǎn)后所處的空間不足夠,而在它的另一邊卻有足夠的空間。</p><p>  比如,一個(gè)方塊在它左邊正好差一個(gè)格子的空間才能夠翻轉(zhuǎn),但是它的右邊恰好有一個(gè)格子的空間,這種情況

52、,如果方塊不能夠翻轉(zhuǎn),就不方便用戶操作,如果能夠翻轉(zhuǎn),就會(huì)發(fā)生越界,將已經(jīng)存在的方塊擠占掉。要想實(shí)現(xiàn)翻轉(zhuǎn)又不發(fā)生越界,那么,就應(yīng)該在方塊翻轉(zhuǎn)后把它往右邊移動(dòng)一個(gè)格子,然后再繪制方塊,這樣,方塊就不會(huì)擠占掉其它已經(jīng)固定住的方塊了。</p><p>  同樣,方塊在邊界處時(shí),翻轉(zhuǎn)后不僅可能翻出地圖外,還可能發(fā)生數(shù)組越界,當(dāng)然,只需要將地圖數(shù)組定義得大一些,就能夠避免數(shù)組越界錯(cuò)誤,對(duì)于方塊越界,如果在它的另一邊有足夠空

53、間,那么,就應(yīng)該把方塊往另一個(gè)方向移動(dòng)適當(dāng)?shù)膯挝唬m正方塊越界錯(cuò)誤。</p><p>  結(jié)合上述判定表,可以列出方塊翻轉(zhuǎn)-越界糾正判定表,如表5.3所示:</p><p>  表5.3 方塊翻轉(zhuǎn)-越界糾正判定表</p><p>  方塊翻轉(zhuǎn)處理的流程圖如圖5.12所示:</p><p>  圖5.12 方塊翻轉(zhuǎn)處理流程圖</p>

54、<p>  5.3.3 滿行消除</p><p>  JAVA圖形類中提供了一個(gè)方法,copyArea(int x, int y, int width, int height, int dx, int dy),這個(gè)方法的作用是將組建的某一區(qū)域復(fù)制到由dx和dy指定的水平距離和垂直距離所在的區(qū)域。利用這個(gè)方法,可以消除滿行。</p><p>  那么,當(dāng)方塊落下去后,如何判斷

55、有行需要消除。</p><p>  如概要設(shè)計(jì)中所述,游戲地圖中有方塊的區(qū)域可以用1表示,當(dāng)方塊落下去后,判斷某一行是否全部為1,如果全為1,即表示這一行已滿,需要消除,這個(gè)時(shí)候,就可以利用copyArea這個(gè)方法將這一行消去了。</p><p>  消去一行后,要繼續(xù)向下檢測(cè),如果下一行是滿行,消除,否則再往下檢測(cè),一直將落下的方塊所占的行數(shù)全部檢測(cè)完為止。</p><

56、;p>  假定,以豎直狀態(tài)落下一個(gè)長(zhǎng)條形的方塊,很顯然,方塊一共占據(jù)了四行。這時(shí)候,應(yīng)該從長(zhǎng)條形的方塊占據(jù)的第一行開(kāi)始檢測(cè),不管期間是否有消行,都必須將長(zhǎng)條形的方塊所占據(jù)的四行全部檢測(cè)完為止。并且記錄下消去的行數(shù),方塊消行完成后,增加相應(yīng)積分。</p><p>  但是,這里面又會(huì)遇到一個(gè)問(wèn)題,因?yàn)椴⒉皇撬蟹綁K所占的行數(shù)都一樣,方塊落下后到底該檢測(cè)多少行呢?考慮到方塊落下后最多占據(jù)四行,以及計(jì)算機(jī)運(yùn)算的高

57、速性,可以設(shè)定每一次方塊落下后都往下檢測(cè)四行。</p><p><b>  方塊消行的流程圖:</b></p><p><b>  5.4 游戲控制</b></p><p>  處理圖形觸發(fā)的 shapeMovedDown (圖形下落) 事件 將會(huì)重新顯示</p><p>  public vo

58、id shapeMovedDown(Shape s) {</p><p>  // TODO Auto-generated method stub</p><p>  if (playing && ground != null && shape != null)</p><p>  gamePanel.redisplay(ground

59、, shape);</p><p><b>  開(kāi)始一個(gè)新游戲</b></p><p>  public void newGame() {</p><p>  playing = true;</p><p>  ground.init();</p><p>  ground.addGroundLi

60、stener(this);</p><p>  Global.CURRENT_SPEED = Global.DEFAULT_SPEED;</p><p>  shape = shapeFactory.getShape(this);</p><p>  if (playing)</p><p>  gamePanel.redisplay(gro

61、und, shape);</p><p>  if (gameInfoLabel != null)</p><p>  gameInfoLabel.setText(this.getNewInfo());</p><p>  for (GameListener l : listeners)</p><p>  l.gameStart();<

62、;/p><p><b>  }</b></p><p><b>  停止當(dāng)前游戲</b></p><p>  public void stopGame() {</p><p>  if (shape == null)</p><p><b>  return;</

63、b></p><p>  playing = false;</p><p>  for (GameListener l : listeners)</p><p>  l.gameOver();</p><p><b>  }</b></p><p><b>  暫停游戲</b

64、></p><p>  public void pauseGame() {</p><p>  if (shape == null)</p><p><b>  return;</b></p><p>  shape.setPause(true);</p><p>  for (GameLi

65、stener l : listeners)</p><p>  l.gamePause();</p><p><b>  }</b></p><p><b>  繼續(xù)游戲</b></p><p>  public void continueGame() {</p><p> 

66、 shape.setPause(false);</p><p>  for (GameListener l : listeners)</p><p>  l.gameContinue();</p><p><b>  }</b></p><p><b>  5.5 游戲顯示</b></p&g

67、t;<p>  5.5.1 游戲顯示界面</p><p>  5.5.2 開(kāi)始暫??刂撇藛?lt;/p><p>  5.5.3 調(diào)整背景顏色障礙物顏色菜單</p><p><b>  6 系統(tǒng)測(cè)試</b></p><p>  6.1 測(cè)試的意義及注意事項(xiàng)</p><p>  軟

68、件測(cè)試是軟件工程中及其重要的一個(gè)環(huán)節(jié),目的是保證軟件的質(zhì)量。測(cè)試的好壞將直接影響軟件的好壞,進(jìn)行測(cè)試可以找出其中的錯(cuò)誤及不足加以改進(jìn),從而得到一個(gè)高效、可靠的系統(tǒng)。進(jìn)行軟件測(cè)試主要作用有以下幾點(diǎn):</p><p>  1.軟件測(cè)試是為了發(fā)現(xiàn)程序中的錯(cuò)誤而執(zhí)行程序的過(guò)程。</p><p>  2.好的軟件測(cè)試方案是極可能發(fā)現(xiàn)尚未發(fā)生錯(cuò)誤的方法。</p><p>  3

69、.程序的測(cè)試是發(fā)現(xiàn)了至今尚未發(fā)現(xiàn)的錯(cuò)誤。</p><p>  軟件應(yīng)從多角度進(jìn)行測(cè)試和分析,這樣才能找出其中錯(cuò)誤的地方。測(cè)試的時(shí)間最好找一些與設(shè)計(jì)系統(tǒng)無(wú)關(guān)的人員,或者分析人員。因?yàn)樵陂_(kāi)發(fā)軟件的時(shí)候,開(kāi)發(fā)人員已經(jīng)形成了自己的思維定勢(shì),在測(cè)試的時(shí)候始終受到這種思想的束縛,很難找出其中的錯(cuò)誤而與設(shè)計(jì)無(wú)關(guān)的人員和那些分析人員很容易找出錯(cuò)誤所在。</p><p>  在程序調(diào)試過(guò)程中一定要耐心仔細(xì),

70、一個(gè)細(xì)微的錯(cuò)誤將會(huì)導(dǎo)致整個(gè)功能不能實(shí)現(xiàn)會(huì)浪費(fèi)很多的時(shí)間來(lái)修改。</p><p>  6.2 游戲界面菜單選項(xiàng)的功能測(cè)試</p><p>  (1) “控制”菜單測(cè)試</p><p> ?、冱c(diǎn)擊“游戲”??“開(kāi)始”</p><p><b>  輸出:游戲開(kāi)始</b></p><p><b&g

71、t;  結(jié)果:正常</b></p><p> ?、邳c(diǎn)擊“游戲”??“結(jié)束”</p><p>  輸出:彈出游戲結(jié)束提示框</p><p><b>  結(jié)果:正常</b></p><p>  (3) “變換”菜單測(cè)試</p><p>  ①點(diǎn)擊“變換”??“改變方塊”</p>

72、<p>  輸出:在游戲面板中顯示隨機(jī)產(chǎn)生的某種方塊</p><p><b>  結(jié)果:正常</b></p><p>  6.3 按鍵事件的功能測(cè)試</p><p>  (1) 方塊移動(dòng)測(cè)試</p><p>  游戲過(guò)程中,點(diǎn)擊“左、右、下”方向鍵</p><p>  輸出:方塊正

73、常移動(dòng),不會(huì)移出邊界</p><p><b>  結(jié)果:正常</b></p><p>  (2) 方塊反轉(zhuǎn)測(cè)試</p><p>  游戲過(guò)程中,點(diǎn)擊向上方向鍵</p><p>  輸出:方塊無(wú)邊界和障礙物阻擋的情況下可反轉(zhuǎn)</p><p><b>  結(jié)果:正常</b><

74、;/p><p>  6.4 方塊堆砌與消行測(cè)試</p><p>  當(dāng)方塊下落到最底面或與障礙物接觸時(shí)</p><p>  輸出:方塊成功堆砌在底部</p><p><b>  結(jié)果:正常</b></p><p>  (2) 當(dāng)出現(xiàn)滿行現(xiàn)象時(shí)</p><p>  輸出:所有滿

75、行被消除,方塊依次下移</p><p><b>  結(jié)果:正常</b></p><p>  6.5 測(cè)試結(jié)果分析</p><p>  經(jīng)過(guò)測(cè)試,本游戲?qū)崿F(xiàn)了基本的功能,不過(guò)整體功能還不是很強(qiáng)大,作為開(kāi)發(fā)的第一個(gè)版本,游戲在很多方面還需要進(jìn)一步完善。</p><p><b>  結(jié) 論</b>&l

76、t;/p><p>  經(jīng)過(guò)一個(gè)月的努力,本游戲的開(kāi)發(fā)工作至此告一段落,游戲能夠正確運(yùn)行,雖然說(shuō)本游戲還只是一個(gè)初級(jí)產(chǎn)品,但是比起很多俄羅斯方塊游戲,它的功能算是比非常豐富的,界面也具有一定的美觀度,可以說(shuō)取得了初步性的成功。</p><p>  這一個(gè)月來(lái),我學(xué)到了很多東西。先前,對(duì)于JAVA,基本上還停留在理論階段,但是通過(guò)這一個(gè)月的努力,完成了代碼超過(guò)數(shù)千行的俄羅斯方塊游戲,在JAVA學(xué)習(xí)

77、方面,我能夠感覺(jué)到自己的進(jìn)步。當(dāng)然,在這期間,我也遇到了不少問(wèn)題,如方塊的繪制上,曾出現(xiàn)過(guò)太閃爍,刷新不徹底等問(wèn)題。還有,圖像截屏傳輸時(shí)編譯器總是提示端口號(hào)已經(jīng)被占用,經(jīng)過(guò)檢查,原來(lái)是我每次截屏發(fā)送圖像數(shù)據(jù)時(shí),都重新構(gòu)造端口號(hào),這是因?yàn)樽兞慷x的錯(cuò)誤,將變量定義成全局變量,問(wèn)題就解決了。</p><p>  總得來(lái)說(shuō),大的問(wèn)題沒(méi)有遇到,遇到的都是一些邏輯、算法上以及變量定義的錯(cuò)誤問(wèn)題,通過(guò)程序測(cè)試,這些問(wèn)題都很容

78、易地解決了。</p><p>  回顧這個(gè)設(shè)計(jì)過(guò)程,我學(xué)到了許多書(shū)本上沒(méi)有學(xué)到的知識(shí)。通過(guò)這次自己制作的軟件,豐富了自己的實(shí)踐技能,擴(kuò)展了本專業(yè)的知識(shí)面,使我受益非淺,同時(shí)也體驗(yàn)到了搞軟件開(kāi)發(fā)的困難度。在這次設(shè)計(jì)的同時(shí),我又從中學(xué)到了許多東西。但由于我對(duì)這樣的軟件開(kāi)發(fā)還只是一個(gè)開(kāi)始,了解的不多,這其中或許還有很多的不足,有些模塊做得不是很好,有些功能還不能夠完全的實(shí)現(xiàn),如不能把要裝載的方塊提前顯示出來(lái)。因此做得不

79、是很好,界面的設(shè)計(jì)及整體的布局還比較簡(jiǎn)單,沒(méi)有突出特色出來(lái),這也可能是我這個(gè)系統(tǒng)的不足之處。</p><p><b>  致 謝</b></p><p>  畢業(yè)設(shè)計(jì)是大學(xué)里的最后一堂課,從開(kāi)始進(jìn)入課題研究到論文順利完成的兩個(gè)月的時(shí)間里,我經(jīng)歷了大學(xué)期間最為難忘的一段時(shí)光。在這段時(shí)間里,我學(xué)到了很多以前不曾接觸的東西,這兩個(gè)月經(jīng)歷對(duì)我未來(lái)的人生都會(huì)有很大的幫助和影響

80、。</p><p>  首先衷心感謝我的指導(dǎo)老師***老師給予我的無(wú)微不至的關(guān)懷和細(xì)心的指導(dǎo)。在設(shè)計(jì)過(guò)程中xx老師為我們提出了許多寶貴的意見(jiàn)和建議,在此我要由衷的向xx老師致以最衷心的感謝和深深的敬意。</p><p>  在此過(guò)程中同學(xué)們也給予我很大幫助,感謝我的同學(xué)們。在我遇到的一個(gè)又一個(gè)問(wèn)題時(shí)同學(xué)們都熱心的幫助我,幫我分析和我探討,提出了許多解決問(wèn)題的好方法和建議,使我最終解決了一個(gè)

81、又一個(gè)問(wèn)題,感謝我的同學(xué)們。</p><p>  由于我的學(xué)識(shí)有限,加之時(shí)間倉(cāng)促,文中不免有錯(cuò)誤和待改,不足之處,真誠(chéng)歡迎各位師長(zhǎng)、同學(xué)提出寶貴意見(jiàn)。最后,祝愿所有的教師和同學(xué)們,愿你們身體健康,工作順利!</p><p><b>  參考文獻(xiàn)</b></p><p>  [1] 王樹(shù)偉 著,《Visual C++游戲編程基礎(chǔ)》,北京:電子工

82、業(yè)出版社,2005年。</p><p>  [2]榮欽科技編著.Visual C++游戲設(shè)計(jì).北京:科海電子出版社。</p><p>  [3] 劉新. 清華大學(xué)出版社.Java開(kāi)發(fā)技術(shù)大全.2009-02-01</p><p>  [4] 閻宏, 電子工業(yè)出版社.Java與模式. 2002-10-01</p><p>  [5]王曉東 .

83、電子工業(yè)出版社 .計(jì)算機(jī)算法設(shè)計(jì)與分析.2007-05</p><p>  [6] 徐立 、孫計(jì)安.清華大學(xué)出版社 .Java應(yīng)用于開(kāi)發(fā)案例教程.2005-07</p><p>  [7] 薛為民 夏文紅 解侖.清華大學(xué)出版社.北京交通大學(xué)出版社.Java應(yīng)用教程.2005-09</p><p>  [8] 彭波.機(jī)械工業(yè)出版社.數(shù)據(jù)結(jié)構(gòu)及算法.2008-01<

84、;/p><p>  [9]雍俊海 .清華大學(xué)出版社.Java程序設(shè)計(jì).20004-08</p><p>  [10] robert lafore. 中國(guó)電力出版社. Java數(shù)據(jù)結(jié)構(gòu)和算法.2007-06</p><p>  [11]趙滿來(lái). 清華大學(xué)出版社.可視化java gui程序設(shè)計(jì)--基于eclipse ve開(kāi)發(fā)環(huán)境.2010-11</p><

85、;p>  [12]肖剛. 清華大學(xué)出版社.java gui程序設(shè)計(jì).1998-11</p><p>  [13] 羅偉堅(jiān)著.Visual C++經(jīng)典游戲程序設(shè)計(jì)[M].北京:人民郵電出版社,2006.2</p><p>  [14] 朱福喜著. Java 程序設(shè)計(jì)技巧與開(kāi)發(fā)實(shí)例[M].北京:人民郵電出版社,2004.2</p><p>  [15] 趙東躍著.

86、俄羅斯方塊編程[M].電腦編程技巧與維護(hù),1998 年第六期</p><p>  [16] 陸惠恩著. 實(shí)用軟件工程[M].北京:清華大學(xué)出版社,2006.5</p><p>  [17] 黃復(fù)賢著.俄羅斯方塊游戲的敏捷設(shè)計(jì)與開(kāi)發(fā)[M]. 電腦編程技巧與維護(hù),2005.4</p><p>  [18] (美)Bruce Eckel 著,陳昊天譯.Java 編程思想[

87、M].北京:機(jī)械工業(yè)出版社,2007.6</p><p>  [19] 高凌琴,陳青華著. 俄羅斯方塊游戲關(guān)鍵技術(shù)探討[M].信息技術(shù)與信息化研究探討,2008 年第</p><p><b>  二期.</b></p><p>  [20] 王宇,戰(zhàn)學(xué)剛,高國(guó)偉著. 計(jì)算機(jī)算法解決俄羅斯方塊中的數(shù)學(xué)與計(jì)算問(wèn)題[M].計(jì)算機(jī)應(yīng)用與</p&g

88、t;<p>  軟件,第二十四卷第三期,2007.3 .</p><p>  [21]朱福喜,黃昊著. Java 項(xiàng)目開(kāi)發(fā)與畢業(yè)設(shè)計(jì)指導(dǎo)[M].北京:清華大學(xué)出版社,2008.6</p><p>  [22] 鄭人杰,殷人昆,陶永雷著.實(shí)用軟件工程[M].北京:清華大學(xué)出版社,2004.11</p><p>  [23]David Freeman.Cr

89、cating Emotion in Games[M].北京:紅旗出版社,2003</p><p>  [24]Ben Sawyer.游戲軟件設(shè)計(jì)與開(kāi)發(fā)指南[M].北京:人民郵電出版社.1998.8</p><p>  [25]Sierra.K.Bares.B著.OReilly Taiwan公司譯.張然等改編.Head First Java.中國(guó)電力出版社.2007.</p>

90、<p><b>  附錄:</b></p><p>  package cn.tetris.controller;</p><p>  import java.awt.Font;</p><p>  import java.awt.event.KeyAdapter;</p><p>  import java.

91、awt.event.KeyEvent;</p><p>  import java.util.HashSet;</p><p>  import java.util.Set;</p><p>  import javax.swing.JLabel;</p><p>  import cn.tetris.entities.Ground;<

92、/p><p>  import cn.tetris.entities.Shape;</p><p>  import cn.tetris.entities.ShapeFactory;</p><p>  import cn.tetris.listener.GameListener;</p><p>  import cn.tetris.liste

93、ner.GroundListener;</p><p>  import cn.tetris.listener.ShapeListener;</p><p>  import cn.tetris.util.Global;</p><p>  import cn.tetris.view.GamePanel;</p><p><b> 

94、 /**</b></p><p><b>  * 控制器<BR></b></p><p>  * 控制Ground, Snake, Food<BR></p><p>  * 負(fù)責(zé)游戲的邏輯<BR></p><p>  * 處理按鍵事件<BR></p>

95、<p><b>  * <BR></b></p><p><b>  * </b></p><p>  * @version 1.0, 03/03/11</p><p><b>  * </b></p><p>  * @author 張龍飛</

96、p><p><b>  * </b></p><p><b>  */</b></p><p>  public class Controller extends KeyAdapter implements ShapeListener,</p><p>  GroundListener {</p&

97、gt;<p>  protected Set<GameListener> listeners = new HashSet<GameListener>();</p><p><b>  /**</b></p><p><b>  * 圖形工廠</b></p><p><b> 

98、 * </b></p><p><b>  */</b></p><p>  protected ShapeFactory shapeFactory;</p><p>  protected Shape shape;</p><p>  protected Ground ground;</p>

99、<p>  protected GamePanel gamePanel;//游戲面板</p><p>  protected JLabel gameInfoLabel;//游戲信息標(biāo)簽</p><p><b>  /**</b></p><p><b>  * 當(dāng)前的游戲狀態(tài)</b></p><

100、;p><b>  */</b></p><p>  protected boolean playing;</p><p><b>  /**</b></p><p><b>  * 控制器</b></p><p>  * @param shapeFactory</p

101、><p>  * @param ground</p><p>  * @param gamePanel</p><p><b>  */</b></p><p>  public Controller(ShapeFactory shapeFactory, Ground ground,</p><p>

102、  GamePanel gamePanel) {</p><p><b>  super();</b></p><p>  this.shapeFactory = shapeFactory;</p><p>  this.ground = ground;</p><p>  this.gamePanel = gamePa

103、nel;</p><p><b>  }</b></p><p><b>  /**</b></p><p>  * 多接受一個(gè) JTextComponent, 可以給在這個(gè)組件上顯示提示信息</p><p><b>  * </b></p><p> 

104、 * @param shapeFactory</p><p>  * @param ground</p><p>  * @param gamePanel</p><p>  * @param gameInfoLabel</p><p><b>  */</b></p><p>  public

105、Controller(ShapeFactory shapeFactory, Ground ground,</p><p>  GamePanel gamePanel, JLabel gameInfoLabel) {</p><p>  this(shapeFactory, ground, gamePanel);</p><p>  this.setGameInfoL

106、abel(gameInfoLabel);</p><p><b>  }</b></p><p><b>  /**</b></p><p>  * 處理鍵盤(pán)按鍵 <BR></p><p>  * LEFT: 向左移動(dòng)<BR></p><p>  *

107、RIGHT:向右移動(dòng)<BR></p><p>  * DOWN: 向下移動(dòng)<BR></p><p>  * UP: 變形<BR></p><p>  * PAGE UP: 加快速度<BR></p><p>  * PAGE DOWN: 減慢速度<BR></p><

108、p>  * Y: 重新開(kāi)始游戲<BR></p><p>  * ENTER: 暫停/繼續(xù)</p><p><b>  */</b></p><p><b>  @Override</b></p><p>  public void keyPressed(KeyEvent e) {&

109、lt;/p><p>  if (e.getKeyCode() != KeyEvent.VK_Y && !playing)</p><p><b>  return;</b></p><p>  switch (e.getKeyCode()) {</p><p><b>  /**</b>

110、</p><p><b>  * 方向左</b></p><p><b>  */</b></p><p>  case KeyEvent.VK_LEFT:</p><p>  if (isPausingGame()) {</p><p>  this.continueGam

111、e();</p><p><b>  }</b></p><p>  shape.setSwift(false);</p><p>  if (isPlaying() && ground.isMoveable(shape, Shape.LEFT))</p><p>  shape.moveLeft();&

112、lt;/p><p><b>  break;</b></p><p><b>  /**</b></p><p><b>  * 方向右</b></p><p><b>  */</b></p><p>  case KeyEvent.

113、VK_RIGHT:</p><p>  if (isPausingGame()) {</p><p>  this.continueGame();</p><p><b>  }</b></p><p>  shape.setSwift(false);</p><p>  if (isPlayin

114、g() && ground.isMoveable(shape, Shape.RIGHT))</p><p>  shape.moveRight();</p><p><b>  break;</b></p><p><b>  /**</b></p><p><b>  *

115、 方向上</b></p><p><b>  */</b></p><p>  case KeyEvent.VK_UP:</p><p>  if (isPlaying()) {</p><p>  if (!shape.isPause()) {</p><p>  if (groun

116、d.isMoveable(shape, Shape.ROTATE)) {</p><p>  shape.setSwift(false);</p><p>  shape.rotate();</p><p><b>  }</b></p><p><b>  } else {</b></p&g

117、t;<p>  if (ground.isMoveable(shape, Shape.UP))</p><p>  shape.moveUp();</p><p><b>  else {</b></p><p>  shape.die();</p><p>  shape = shapeFactory.g

118、etShape(this);</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  break;</b></p><p><b>

119、;  /**</b></p><p><b>  * 方向下</b></p><p><b>  */</b></p><p>  case KeyEvent.VK_DOWN:</p><p>  if (isPausingGame()) {</p><p>  

120、this.continueGame();</p><p><b>  }</b></p><p>  if (isPlaying() && isShapeMoveDownable(shape))</p><p>  shape.moveDown();</p><p><b>  break;&l

121、t;/b></p><p><b>  /**</b></p><p><b>  * PAGE UP</b></p><p><b>  */</b></p><p>  case KeyEvent.VK_PAGE_UP:</p><p>  s

122、hape.speedUp();</p><p><b>  break;</b></p><p><b>  /**</b></p><p>  * PAGE DOWN</p><p><b>  */</b></p><p>  case KeyEve

溫馨提示

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

評(píng)論

0/150

提交評(píng)論