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

下載本文檔

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

文檔簡介

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

27、<p>  ·如果同一類中需要創(chuàng)建多個同一類型,功能相似的變量,變量的前綴應(yīng)使用統(tǒng)一的英文單詞,后綴為下劃線“_”加數(shù)字。</p><p>  比如,從JButton對象創(chuàng)建開始按鈕,可以命名為:startbutton。再如,創(chuàng)建多個道具按鈕,可以命名為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è)計分析</p><p>  Java為純面向?qū)ο?/p>

29、(Object-Oriented,OO)的程序語言,它的諸多優(yōu)點在此就不作論述了。從面向?qū)ο蟮挠^念出發(fā),本程序主要可分為以下幾個模塊:</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è)計</p><p><b>  生產(chǎn)</b></p><p>  觸發(fā)按鍵事件 </p><p>  4.4 功能模塊圖的設(shè)計</p><p>  4.4.1 模型層功能模塊圖設(shè)計</p><p>  4.4.2

31、視圖層功能模塊圖設(shè)計</p><p>  4.4.3 控制層功能模塊圖設(shè)計</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è)計</b></p><p>  5.1 運用的各種類</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>  通過圖形工廠類ShapeFactory 的getShape(ShapeListener listener)方法隨機(jī)產(chǎn)生方塊的某種狀態(tài),這里運用了工廠設(shè)計模式,這種設(shè)計模式

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

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

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

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

41、j一定是等于14的。</p><p>  當(dāng)方塊落下后,方塊同樣不能再移動。這又分為兩種情況,一種是要墜下的地方還沒有方塊,這個時候,只要可以記錄下方塊數(shù)組中最后出現(xiàn)1的那一行,假定那是第i行,這樣,只要y+i等于24,就可以認(rèn)定方塊已經(jīng)落到游戲地圖的底部,不能再繼續(xù)下落。</p><p>  當(dāng)要方塊下邊或者左右有方塊時,可以確定下邊有方塊的那一格在游戲地圖中的縱坐標(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]這個元素的值必定是2。</p><p>  綜合以上幾種情況,我們可以列出方塊移動條件判定表,如表5.1所示:</p><p>  表 5.1 方塊移動條件判定表</p><p>  5.3.2 方塊的翻轉(zhuǎn)</p><

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

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

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

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

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

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

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

50、lt;/p><p>  假定方塊數(shù)組的橫縱坐標(biāo)是x和y,那么,這個位置就是,長條形的方塊翻轉(zhuǎn)后所處的那一行是游戲地圖的第y行,所占的列是第x到x+3列,長條形和田字形以外的五種方塊翻轉(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>  比如,一個方塊在它左邊正好差一個格子的空間才能夠翻轉(zhuǎn),但是它的右邊恰好有一個格子的空間,這種情況

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

53、間,那么,就應(yīng)該把方塊往另一個方向移動適當(dāng)?shù)膯挝?,糾正方塊越界錯誤。</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圖形類中提供了一個方法,copyArea(int x, int y, int width, int height, int dx, int dy),這個方法的作用是將組建的某一區(qū)域復(fù)制到由dx和dy指定的水平距離和垂直距離所在的區(qū)域。利用這個方法,可以消除滿行。</p><p>  那么,當(dāng)方塊落下去后,如何判斷

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

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

57、速性,可以設(shè)定每一次方塊落下后都往下檢測四行。</p><p><b>  方塊消行的流程圖:</b></p><p><b>  5.4 游戲控制</b></p><p>  處理圖形觸發(fā)的 shapeMovedDown (圖形下落) 事件 將會重新顯示</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>  開始一個新游戲</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 開始暫??刂撇藛?lt;/p><p>  5.5.3 調(diào)整背景顏色障礙物顏色菜單</p><p><b>  6 系統(tǒng)測試</b></p><p>  6.1 測試的意義及注意事項</p><p>  軟

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

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

70、一個細(xì)微的錯誤將會導(dǎo)致整個功能不能實現(xiàn)會浪費很多的時間來修改。</p><p>  6.2 游戲界面菜單選項的功能測試</p><p>  (1) “控制”菜單測試</p><p>  ①點擊“游戲”??“開始”</p><p><b>  輸出:游戲開始</b></p><p><b&g

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

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

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

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

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

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

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

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

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

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

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

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

83、電子工業(yè)出版社 .計算機(jī)算法設(shè)計與分析.2007-05</p><p>  [6] 徐立 、孫計安.清華大學(xué)出版社 .Java應(yīng)用于開發(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è)計.20004-08</p><p>  [10] robert lafore. 中國電力出版社. Java數(shù)據(jù)結(jié)構(gòu)和算法.2007-06</p><p>  [11]趙滿來. 清華大學(xué)出版社.可視化java gui程序設(shè)計--基于eclipse ve開發(fā)環(huán)境.2010-11</p><

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

86、俄羅斯方塊編程[M].電腦編程技巧與維護(hù),1998 年第六期</p><p>  [16] 陸惠恩著. 實用軟件工程[M].北京:清華大學(xué)出版社,2006.5</p><p>  [17] 黃復(fù)賢著.俄羅斯方塊游戲的敏捷設(shè)計與開發(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é)剛,高國偉著. 計算機(jī)算法解決俄羅斯方塊中的數(shù)學(xué)與計算問題[M].計算機(jī)應(yīng)用與</p&g

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

89、cating Emotion in Games[M].北京:紅旗出版社,2003</p><p>  [24]Ben Sawyer.游戲軟件設(shè)計與開發(fā)指南[M].北京:人民郵電出版社.1998.8</p><p>  [25]Sierra.K.Bares.B著.OReilly Taiwan公司譯.張然等改編.Head First Java.中國電力出版社.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>  * 多接受一個 JTextComponent, 可以給在這個組件上顯示提示信息</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>  * 處理鍵盤按鍵 <BR></p><p>  * LEFT: 向左移動<BR></p><p>  *

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

108、p>  * Y: 重新開始游戲<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. 本站所有資源如無特殊說明,都需要本地電腦安裝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

提交評論