版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p> 畢 業(yè) 設(shè) 計(jì)</p><p> 題 目: 俄羅斯方塊單人游戲的實(shí)現(xiàn) </p><p> 院 、系: 軟件工程系 </p><p> 姓 名: </p><p> 指導(dǎo)教師: &l
2、t;/p><p> 系 主 任: </p><p> 2012 年 06 月 20 日</p><p> 俄羅斯方塊單人游戲的實(shí)現(xiàn)</p><p><b> 摘 要</b></p><p> 論文描述了電腦游戲的發(fā)展現(xiàn)狀,和開(kāi)發(fā)此游戲的意義。遵循
3、軟件工程的知識(shí),從軟件問(wèn)題定義開(kāi)始,接著進(jìn)行了主要功能的描述、實(shí)現(xiàn)原理的分析、詳細(xì)設(shè)計(jì),最后對(duì)軟件進(jìn)行了測(cè)試,整個(gè)開(kāi)發(fā)過(guò)程貫穿軟件工程的知識(shí)體系。此次設(shè)計(jì)在Microsoft Windows XP系統(tǒng)下,以Java為開(kāi)發(fā)語(yǔ)言,在Eclipse開(kāi)發(fā)平臺(tái)上進(jìn)行游戲的設(shè)計(jì)與實(shí)踐。</p><p> 本游戲開(kāi)發(fā)的總體任務(wù)就是實(shí)現(xiàn)游戲的可操作性,以及界面的簡(jiǎn)單清晰性。整個(gè)開(kāi)發(fā)過(guò)程遵循軟件工程規(guī)范,采用JAVA GUI編程
4、來(lái)實(shí)現(xiàn)界面以及事件的控制,用戶(hù)根據(jù)鍵盤(pán)的四個(gè)方向鍵控制翻轉(zhuǎn)、向左、向右和向下操作,通過(guò)菜單欄中的相應(yīng)菜單選項(xiàng)實(shí)現(xiàn)游戲的開(kāi)始、結(jié)束、變換方塊、積分以及等級(jí)的功能。由于知識(shí)以及能力的限制,本游戲所實(shí)現(xiàn)的功能不夠強(qiáng)大,可對(duì)本游戲進(jìn)行改善,從而增強(qiáng)游戲的功能。通過(guò)研究分析俄羅斯方塊所具備的能力及實(shí)現(xiàn)的方法、確定主體結(jié)構(gòu)。利用現(xiàn)階段我所能達(dá)到的能力,以最簡(jiǎn)潔、最容易的辦法,邊開(kāi)發(fā)邊測(cè)試邊修改,實(shí)現(xiàn)一個(gè)初級(jí)游戲軟件。</p><
5、p> 關(guān)鍵詞 電腦游戲;俄羅斯方塊游戲;Java語(yǔ)言</p><p> Single game of Tetris</p><p><b> Abstract</b></p><p> The paper describes the development status of the computer game, and the
6、 development of the significance of this game. Follow the knowledge of software engineering, start from the definition of a software problem, followed by a description of the main functions of the principle of analysis,
7、detailed design, the final test of the software throughout the development process throughout the software engineering body of knowledge. The design of the Microsoft Windows XP systems, the Java development l</p>
8、<p> The development of the overall mission of this game is to achieve operability of the game, as well as clear and simple interface. Throughout the development process follows the software engineering specificati
9、ons, using JAVA GUI programming interface and control of events, according to the four directions of the keyboard keys to control flip, left, right and down operation, selected through the menu bar of the corresponding m
10、enuthe game start, end, transform the box score and level of functional</p><p> Keywords Computer game;Tetris game;Java language</p><p><b> 目錄</b></p><p><b> 摘
11、 要I</b></p><p> AbstractII</p><p><b> 第1章 緒論1</b></p><p> 1.1 電腦游戲的發(fā)展現(xiàn)狀1</p><p> 1.2 開(kāi)發(fā)意義2</p><p> 第2章 主要功能的描述3</p>&
12、lt;p> 2.1 游戲的主要功能3</p><p> 2.2 Java GUI功能3</p><p> 2.3 多線(xiàn)程的功能4</p><p> 第3章 實(shí)現(xiàn)的原理5</p><p> 3.1 Java GUI實(shí)驗(yàn)原理5</p><p> 3.1.1基本窗口類(lèi)5</p>&
13、lt;p> 3.1.2原子構(gòu)件7</p><p> 3.1.3菜單類(lèi)8</p><p> 3.1.4事件處理9</p><p> 3.1.5布局管理10</p><p> 3.1.6圖形類(lèi)與圖形的繪制11</p><p> 3.2 Java多線(xiàn)程機(jī)制11</p><p&
14、gt; 第4章 設(shè)計(jì)的方案及實(shí)現(xiàn)12</p><p> 4.1設(shè)計(jì)方案12</p><p> 4.1.1游戲界面設(shè)計(jì)12</p><p> 4.1.2游戲控制設(shè)計(jì)12</p><p> 4.1.3基本類(lèi)設(shè)計(jì)12</p><p> 4.2 程序?qū)崿F(xiàn)17</p><p>
15、4.2.1菜單類(lèi)的實(shí)現(xiàn)17</p><p> 4.2.2方格類(lèi)的實(shí)現(xiàn)18</p><p> 4.2.3方塊類(lèi)的實(shí)現(xiàn)18</p><p> 4.2.4主類(lèi)的實(shí)現(xiàn)18</p><p> 4.2.5控制面板類(lèi)的實(shí)現(xiàn)19</p><p> 4.2.6游戲畫(huà)布類(lèi)的實(shí)現(xiàn)19</p><p&
16、gt;<b> 第5章 測(cè)試20</b></p><p> 5.1 菜單界面測(cè)試20</p><p> 5.2 功能測(cè)試23</p><p> 5.3 測(cè)試總結(jié)27</p><p><b> 結(jié)論28</b></p><p><b> 致謝3
17、0</b></p><p><b> 參考文獻(xiàn)32</b></p><p><b> 附錄33</b></p><p><b> 第1章 緒論</b></p><p> 1.1 電腦游戲的發(fā)展現(xiàn)狀</p><p> 游戲在一般人
18、眼中應(yīng)該是休閑娛樂(lè)的東西,尤其電腦游戲更為如此,在傳統(tǒng)觀念理念上,電腦游戲應(yīng)該是小孩子玩的東西,成年人再玩的話(huà)無(wú)非是玩物喪志,但是時(shí)代發(fā)展如此迅速的當(dāng)代,這個(gè)理念必須要有所改變,中國(guó)的游戲事業(yè)在全世界起步還算早,但是由于種種原因發(fā)展不是十分迅速,在成效上看來(lái)并不十分樂(lè)觀。</p><p> 電腦游戲是一種新興的文化現(xiàn)象,也是一個(gè)新型的朝陽(yáng)企業(yè)。作為這么文化類(lèi)別的后來(lái)者,我們與發(fā)達(dá)國(guó)家、發(fā)達(dá)地區(qū)相比,無(wú)論是理論、
19、開(kāi)發(fā)、研究還是投入等方面仍有一段不算小的距離,但當(dāng)務(wù)之急需要解決的,也許還不僅僅是上述問(wèn)題,游戲開(kāi)發(fā)者們對(duì)所從事的這項(xiàng)工作的敬業(yè)態(tài)度,與自省、自重可能比玩家口袋里的銀子還要可貴得多。</p><p> 與單機(jī)游戲日益衰落正相反的是,網(wǎng)絡(luò)游戲方興未艾,遍地開(kāi)花。國(guó)內(nèi)網(wǎng)絡(luò)游戲開(kāi)發(fā)、制造商也有非常成功的,比如,九城、盛大、網(wǎng)易、金山、久游等等。但是,與此同時(shí),我們也看到了,在繁榮的背后,潛在的商機(jī),一是來(lái)自國(guó)內(nèi)游戲制
20、作者在是做理念上的不足和困乏,另外就是資金問(wèn)題。這兩方面與歐美的制作距離很大,隨著魔獸世界的成功代理,接踵而來(lái)的是更多高品質(zhì),高水準(zhǔn),高制作的國(guó)外網(wǎng)絡(luò)游戲進(jìn)入中國(guó),最近,“九域”即將代理的奇跡世界,卓越之劍,公會(huì)戰(zhàn)爭(zhēng)三款大制作,都是目前在歐美頂級(jí)的作品,這無(wú)疑對(duì)國(guó)產(chǎn)網(wǎng)絡(luò)游戲帶來(lái)巨大競(jìng)爭(zhēng)壓力和市場(chǎng)的威脅。如果國(guó)內(nèi)制作游戲商還停留在紛紛推出所謂的“免費(fèi)”游戲而實(shí)際上是在變相收費(fèi)的運(yùn)營(yíng)層面上,無(wú)疑是作繭自縛,相當(dāng)于自己在毀掉已取得的成績(jī)。&l
21、t;/p><p> 中國(guó)的游戲發(fā)展緩慢的原因有很多種,例如盜版的橫行,開(kāi)發(fā)游戲人員的創(chuàng)新意識(shí)不強(qiáng),守舊的思想風(fēng)靡等等。例如現(xiàn)在PC游戲的行情就不十分景氣。因此我覺(jué)得創(chuàng)新方面還有很多改進(jìn)的余地和改進(jìn)的方面:</p><p> 1、著眼于品質(zhì):看到臺(tái)灣一個(gè)電玩節(jié)目,里面就回顧了DOS版的仙劍,這款游戲在全亞洲都很流行,可悲的是,這十幾年來(lái),我們只有這一款。</p><p&g
22、t; 2、低價(jià)化:當(dāng)年暴雪很有想法的把魔獸爭(zhēng)霸3交給中國(guó)的奧美科技,推出只有20元的低價(jià)正版還能享受BATTLENET,何樂(lè)而不為呢。</p><p> 3、開(kāi)闊眼界:騰訊官方統(tǒng)計(jì)QQ農(nóng)場(chǎng)最高日在線(xiàn)人數(shù)達(dá)到1600萬(wàn),而植物大戰(zhàn)僵尸僅一家游戲網(wǎng)站,中英版本合計(jì)下載數(shù)量可達(dá)到近百萬(wàn)。這可是說(shuō)是將WOW、DNF、CSOL等大眾網(wǎng)絡(luò)游戲遠(yuǎn)遠(yuǎn)地拋在了后面,這不能不說(shuō)明一個(gè)問(wèn)題,這兩款游戲是非常成功的。他們憑借的創(chuàng)新的
23、思維簡(jiǎn)單的操作等方面吸引玩家。這也是游戲公司成功的案例,值得很多同樣的網(wǎng)絡(luò)游戲公司所借鑒。</p><p> 相信中國(guó)游戲的發(fā)展,是會(huì)有很光明的未來(lái)的。這在于我們這代的程序設(shè)計(jì)人員的創(chuàng)新與努力,我們已經(jīng)有很好的技術(shù)支持了,加上優(yōu)秀的思想定然會(huì)有很高的前景的[1]。</p><p><b> 1.2 開(kāi)發(fā)意義</b></p><p> 在現(xiàn)
24、金電子信息高速發(fā)展的時(shí)代,電子游戲已深入人們的日常生活,由于經(jīng)典有趣,因而得到了廣泛的流行,成為老少皆宜的娛樂(lè)方式。俄羅斯方塊是一款風(fēng)靡全球的游戲,最初是由蘇聯(lián)人制作的,規(guī)則簡(jiǎn)單,容易上手且游戲全過(guò)程變化無(wú)窮,可以讓玩家充分感受游戲中的樂(lè)趣。</p><p> 俄羅斯方塊游戲可以說(shuō)是隨計(jì)算機(jī)的發(fā)展而發(fā)展,并不斷推陳出新演變出各種類(lèi)似游戲, 深受廣大玩家喜愛(ài)。這個(gè)游戲有的簡(jiǎn)單, 有的復(fù)雜, 但其根本原理是一樣的都
25、是對(duì)運(yùn)動(dòng)的方塊進(jìn)行組合, 來(lái)訓(xùn)練玩家的反應(yīng)能力。談到游戲軟件, 大多數(shù)人都認(rèn)為其神妙莫測(cè), 高不可及。而一般游戲軟件也確實(shí)具有很高的技術(shù)難度, 隨著開(kāi)發(fā)工具及軟件開(kāi)發(fā)方法學(xué)的不斷發(fā)展, 動(dòng)手開(kāi)發(fā)游戲也不是十分困難的。俄羅斯方塊游游戲軟件不計(jì)其數(shù), 網(wǎng)上就有好多關(guān)于實(shí)現(xiàn)的復(fù)雜算法和設(shè)計(jì), 其難度讓一般初學(xué)者望而卻步。而俄羅斯方塊是編程的入門(mén)項(xiàng)目,它可以檢驗(yàn)編輯人員的知識(shí)熟練程度。在游戲設(shè)計(jì)方面,俄羅斯方塊游戲的設(shè)計(jì)工作既復(fù)雜又富有挑戰(zhàn)性,
26、它包含的內(nèi)容多,涉及的知識(shí)廣泛,與圖形界面聯(lián)系比較大。在設(shè)計(jì)過(guò)程中必將涉及到各個(gè)方面的知識(shí),這對(duì)于JAVA設(shè)計(jì)者而言,是個(gè)很好的鍛煉機(jī)會(huì)[2]。 </p><p> 游戲是一種新興的媒體,是一種新的設(shè)計(jì)領(lǐng)域,也是一種新的藝術(shù)形式。同時(shí)開(kāi)發(fā)電腦游戲可以提高學(xué)生研究和學(xué)習(xí)的興趣,培養(yǎng)他們通過(guò)互聯(lián)網(wǎng)收集和獲得信息、分析整理信息、撰寫(xiě)報(bào)告論文等能力。俄羅斯方塊的開(kāi)發(fā)無(wú)疑是給電腦游戲的增加了色彩,拓寬了電腦游戲的平臺(tái)
27、,給人們帶來(lái)樂(lè)趣。</p><p> 第2章 主要功能的描述</p><p> 2.1 游戲的主要功能</p><p> 游戲開(kāi)發(fā)至今已經(jīng)有30多年,在這個(gè)短暫的時(shí)期里,隨著硬件水平的提高,游戲開(kāi)發(fā)新技術(shù)層出不窮,經(jīng)典游戲比比皆是。</p><p> 俄羅斯方塊是一個(gè)非常復(fù)雜但是比較有趣并且耐玩的,也是大家比較熟悉的單擊小游戲。游戲中
28、共有7種方塊,每種方塊由4個(gè)方格組成。這7種方塊可以旋轉(zhuǎn)90度、180度、270度,因此每種方塊有4種狀態(tài),7種方塊總共有28種狀態(tài)。28種狀態(tài)的方塊隨機(jī)產(chǎn)生,自由下落,落下時(shí)可由玩家用上、下、左、右控制鍵控制翻轉(zhuǎn)和移動(dòng),以便以玩家所需要的形態(tài)和位置落下。如果落下時(shí),方塊的方格能填滿(mǎn)某一行,則這一行可消去。消去一行后,游戲可給玩家加分,若由存在空格的方塊填滿(mǎn)整個(gè)窗口,則游戲失敗。游戲功能需求如下:</p><p>
29、; 游戲界面需求:設(shè)計(jì)良好的游戲界面可以讓玩家充分感受到游戲帶來(lái)的娛樂(lè)性,游戲的背景色和方塊的顏色都在設(shè)計(jì)之內(nèi),在一定的區(qū)域內(nèi)運(yùn)動(dòng)和變形,落下后的障礙物用黃色顯示,這樣看起來(lái)會(huì)有一定的美感。</p><p> 游戲形狀需求:用數(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>
30、<p> 處理事件需求:方塊下落時(shí),可通過(guò)鍵盤(pán)方向鍵(上、下、左、右鍵)對(duì)該方塊進(jìn)行向上(變形),向下(加速)、向左、向右移動(dòng)。</p><p> 顯示需求:當(dāng)不同的方塊填滿(mǎn)一行時(shí)可以消行,剩余方塊向下移動(dòng)并統(tǒng)計(jì)分?jǐn)?shù)。當(dāng)達(dá)到一定分?jǐn)?shù)的時(shí)候,會(huì)增加相應(yīng)的等級(jí)。</p><p> 2.2 Java GUI功能</p><p> 利用Java實(shí)現(xiàn)的俄羅斯
31、方塊游戲幾乎能用到Java GUI(Graphical User Interface)的所有方面,其中包括Sun公司為Java提供的兩個(gè)圖形界面類(lèi)庫(kù)。</p><p> 1、AWT(Abstract Windowing Toolkit),中文譯為抽象窗口工具包,AWT是Sun公司最早推出的GUI類(lèi)庫(kù),其中提供了建立和設(shè)置Java的圖形用戶(hù)界面的基本工具。AWT由Java中的java.awt包提供,里面包含了許多
32、可用來(lái)建立與平臺(tái)無(wú)關(guān)的圖形用戶(hù)界面(GUI)的類(lèi),這些類(lèi)被稱(chēng)為構(gòu)件(Components)。</p><p> 2、Swing包是Java Foundation Classes(JFC)的一部分,與AWT的重量級(jí)構(gòu)件不同,Swing中大部分是輕量級(jí)構(gòu)件。正是這個(gè)原因,Swing幾乎無(wú)所不能,不但有各式各樣先進(jìn)的構(gòu)件,而且更為美觀易用。所以一開(kāi)始使用AWT的程序員很快就轉(zhuǎn)向使用Swing了。</p>
33、<p> 本設(shè)計(jì)中俄羅斯方塊的實(shí)現(xiàn)的界面,主要是采用了Swing類(lèi)庫(kù)。</p><p> (1) 本游戲的基本窗口類(lèi)包括JFrame、JWindow、JPanel和JDialog等。</p><p> ?。?)在這里原子構(gòu)件會(huì)用到標(biāo)簽類(lèi)JLabel、按鈕類(lèi)JButton、JColorChooser類(lèi)文本域JTextField。</p><p> (
34、3)對(duì)一個(gè)大的GUI程序而言通常包含各種菜單,俄羅斯方塊游戲中也包含許多種菜單,如JMenu、JMenuItem、JMenuBar等.</p><p> (4)俄羅斯方塊中的處理事件一般會(huì)用到ActionEvent類(lèi)、ActionListener類(lèi)、KeyEvent類(lèi)、KeyEvent類(lèi)、KeyListener接口、KeyAdapter類(lèi)。</p><p> ?。?)俄羅斯方塊的主界面采
35、用的是BorderLayout布局。</p><p> BorderLayout由5個(gè)區(qū)域來(lái)放置構(gòu)件,分別標(biāo)記為North、South、East、West和Center。用add方法加入構(gòu)件時(shí)要用一個(gè)標(biāo)記來(lái)指定構(gòu)件放到5個(gè)區(qū)域中的哪一個(gè)。</p><p> ?。?)使用Graphics類(lèi)提供的繪圖方法“public void paint(Graphics g)”可以畫(huà)出線(xiàn)條、矩形、圓形等
36、圖形[3]。</p><p> 2.3 多線(xiàn)程的功能</p><p> 俄羅斯方塊游戲的實(shí)現(xiàn)充分利用了Java的線(xiàn)程功能。由于游戲中方塊的動(dòng)態(tài)性,每個(gè)方塊有一定的生命周期,所以選用線(xiàn)程來(lái)實(shí)現(xiàn)方塊。一個(gè)方塊用一個(gè)線(xiàn)程類(lèi)對(duì)象實(shí)現(xiàn),該類(lèi)繼承于Thread類(lèi),當(dāng)一個(gè)方塊出現(xiàn)時(shí)也就表示一個(gè)線(xiàn)程對(duì)象產(chǎn)生并開(kāi)始運(yùn)行。通過(guò)對(duì)鍵盤(pán)消息的響應(yīng),實(shí)現(xiàn)移動(dòng)、下落、變形等操作。</p><p
37、> 在Java中可通過(guò)run()方法為線(xiàn)程指明要完成的任務(wù),用繼承Thread類(lèi)并覆蓋run方法和通過(guò)實(shí)現(xiàn)Runnable接口的類(lèi)調(diào)用run()方法這兩種技術(shù)為線(xiàn)程提供run()方法[4]。</p><p><b> 第3章 實(shí)現(xiàn)的原理</b></p><p> 游戲塊的運(yùn)行采用多線(xiàn)程(Thread)機(jī)制,界面利用JavaSwing提供的圖形類(lèi)實(shí)現(xiàn)。游戲
38、采用開(kāi)源開(kāi)發(fā)環(huán)境Eclipse。在整個(gè)游戲的開(kāi)發(fā)過(guò)程中涉及了Java基本知識(shí)的大部分內(nèi)容。</p><p> 3.1 Java GUI實(shí)驗(yàn)原理</p><p> 3.1.1基本窗口類(lèi) </p><p> 圖形用戶(hù)界面的程序效果類(lèi)似于Windows系統(tǒng)下運(yùn)行的程序。在俄羅斯方塊游戲中用到JFrame、JWindow、JPanel和JDialog等幾種窗口類(lèi):
39、 </p><p><b> 1、JFrame類(lèi)</b></p><p> JFrame類(lèi)與Frame類(lèi)略微不兼容。與其他所有JFC/Swing頂層容器一樣,JFrame包含一個(gè)JRootPane作為其唯一的子容器,即ContentPane,該內(nèi)容面板直接或間接地容納其他可視構(gòu)件。為了方便地使用add方法及add方法的其他版本,JFrame類(lèi)重寫(xiě)了
40、remove和setLayout方法。</p><p> ContentPane始終一直都是是非NULL的。若試圖將其設(shè)置為NULL會(huì)導(dǎo)致JFrame拋出異常。默認(rèn)的內(nèi)容窗格上會(huì)設(shè)置有BorderLayout管理器。</p><p> 與Frame不同,當(dāng)用戶(hù)試圖關(guān)閉窗口時(shí)JFrame知道如何進(jìn)行響應(yīng)。用戶(hù)關(guān)閉窗口時(shí)默認(rèn)的行為僅僅是簡(jiǎn)單地隱藏JFrame。若要更改默認(rèn)的行為可調(diào)用方法s
41、etDefaultCloseOperation(int)。</p><p> JFrame類(lèi)的構(gòu)造方法有如下幾個(gè)版本。</p><p> JFrame():構(gòu)造一個(gè)初始時(shí)不可見(jiàn)的新窗口;JFrame(String title):創(chuàng)建一個(gè)新的、初始不可見(jiàn)的、具體指定標(biāo)題的JFrame;JFrame(GraphicsConfigurationgc):以屏幕設(shè)備的指定GraphicsCon
42、figuration和空白標(biāo)題創(chuàng)建一個(gè)JFrame;JFrame(String title,GraphicsConfiguration gc):創(chuàng)建一個(gè)具體的指定標(biāo)題和指定屏幕設(shè)備的GraphicsConfiguration 的 JFrame。</p><p> 2、JWindow類(lèi)</p><p> JWindow類(lèi)繼承于Window類(lèi)。Window類(lèi)表示一個(gè)沒(méi)有邊界和菜單的最高層的
43、窗口,默認(rèn)的是使用BoederLayout布局,在這個(gè)布局中可以包含AWT的其他構(gòu)件。窗口初始化時(shí)也是不可見(jiàn)的。一個(gè)基本的GUI程序應(yīng)該能夠在屏幕上顯示信息,而且至少要包含一個(gè)GUI構(gòu)件使得用戶(hù)能夠輕松地響應(yīng)用戶(hù)的要求,這就需要用到事件響應(yīng)類(lèi)。</p><p><b> 3、JPanel類(lèi)</b></p><p> JPanel類(lèi)的構(gòu)造方法有如下幾個(gè)版本:<
44、/p><p> (1)Jpanel():創(chuàng)建具有雙緩沖和流布局的Jpanel。</p><p> ?。?)Jpanel(boolean isDoubleBuffered):創(chuàng)建具有FlowLayout布局和指定緩沖策略的Jpanel。</p><p> ?。?)Jpanel(LayoutManager layout):創(chuàng)建具有指定布局管理器的Jpanel。</p
45、><p> ?。?)Jpanel(LayoutManager layout,boolean isDoubleBuffered):創(chuàng)建具有指定布局管理器和緩沖策略的Jpanel。</p><p> 4、JDialog類(lèi)</p><p> Dialog類(lèi)具有兩種類(lèi)型的對(duì)話(huà)窗口:</p><p> (1)模態(tài)對(duì)話(huà)框(Modal Dialog):這
46、種對(duì)話(huà)框阻塞它的父對(duì)象的輸入,并且必須在它的父對(duì)象再次獲得輸入之前被關(guān)閉或自動(dòng)消失。</p><p> ?。?)非模態(tài)對(duì)話(huà)框(Non-modal Dialog):這種對(duì)話(huà)框并不阻塞它的父對(duì)象的輸入,它可以與父對(duì)象并存,除非特別聲明,否則一般的對(duì)話(huà)框是非模態(tài)的。</p><p> JDialog類(lèi)也分為模態(tài)和非模態(tài)的,并且只能在Dialog和Frame的基礎(chǔ)上創(chuàng)建。若用JDialog作為對(duì)
47、話(huà)框,則必須實(shí)現(xiàn)對(duì)話(huà)框中的每一個(gè)構(gòu)件??衫肑OptionPane類(lèi)顯示一段文字或作一些選擇,它包括一些靜態(tài)方法showxxxDialog,并可產(chǎn)生4種簡(jiǎn)單的對(duì)話(huà)框。</p><p> JDialog類(lèi)的構(gòu)造方法有如下幾個(gè)版本:</p><p> ?。?)JDialog():創(chuàng)建一個(gè)沒(méi)有標(biāo)題并且沒(méi)有指定Frame擁有者的無(wú)模式對(duì)話(huà)框。</p><p> (2)J
48、Dialog(Dialog owner):創(chuàng)建一個(gè)沒(méi)有標(biāo)題但將指定的Dialog作為其擁有者的無(wú)模式對(duì)話(huà)框。</p><p> ?。?)JDialog(Dialog owner,boolean modal):創(chuàng)建一個(gè)具有指定擁有者和模式的對(duì)話(huà)框。</p><p> ?。?)JDialog(Dialog owner,String title):創(chuàng)建一個(gè)具有指定標(biāo)題和指定擁有者的無(wú)模式對(duì)話(huà)框。
49、</p><p> ?。?)JDialog(Dialog owner,String title,boolean modal):創(chuàng)建一個(gè)具有指定標(biāo)題、模式和指定擁有者的對(duì)話(huà)框。</p><p> JDialog的構(gòu)造方法還具有將上述方法中的owner的對(duì)象的類(lèi)型改為JFrame和JWindow的相應(yīng)各個(gè)版本:</p><p> ?。?)JDialog(Frame o
50、wner):創(chuàng)建一個(gè)沒(méi)有標(biāo)題但將指定的Frame作為其擁有者的無(wú)模式對(duì)話(huà)框。</p><p> ?。?)JDialog(Window owner):創(chuàng)建一個(gè)具體指定的Window類(lèi)型的擁有者和空標(biāo)題的無(wú)模式對(duì)話(huà)框[5]。</p><p><b> 3.1.2原子構(gòu)件</b></p><p> 俄羅斯方塊游戲中用到的原子構(gòu)件很多,這些構(gòu)件的用
51、法比較簡(jiǎn)單,下面對(duì)俄羅斯方塊游戲中用到的原子構(gòu)件進(jìn)行簡(jiǎn)單介紹:</p><p> 1、標(biāo)簽類(lèi)JLabel</p><p> JLabel類(lèi)的構(gòu)造方法有如下幾個(gè)版本:</p><p> (1)JLabel():創(chuàng)建無(wú)圖像并且其標(biāo)題為空字符的JLabel。</p><p> ?。?)JLabel(Icon image):創(chuàng)建具有指定圖像的J
52、Label實(shí)例。</p><p> ?。?)JLabel(Icon image,int horizontalAlignment):創(chuàng)建具有指定圖像和水平對(duì)齊方式的JLabel實(shí)例。</p><p> ?。?)JLabel(String text):創(chuàng)建具有指定文本的JLabel實(shí)例。</p><p> ?。?)JlabelI(String text,Icon ico
53、n,int horizontalAlignment):創(chuàng)建具有指定文本、圖像和水平對(duì)齊方式的JLabel實(shí)例。</p><p> ?。?)JLabel(String text,int horizontalAlignment)創(chuàng)建具有指定文本和水平對(duì)齊方式的JLabel實(shí)例[6]。</p><p> 2、按鈕類(lèi)JButton</p><p> JButton類(lèi)的構(gòu)
54、造方法具有如下5個(gè)版本:</p><p> (1) JButton();創(chuàng)建不帶有設(shè)置文本或圖標(biāo)的按鈕。</p><p> (2) JButton(Action a):創(chuàng)建一個(gè)按鈕,其屬性從所提供的Action對(duì)象中獲取。</p><p> ?。?) JButton(Icon icon):創(chuàng)建一個(gè)帶圖標(biāo)的按鈕。</p><p> ?。?)
55、 JButton(String text):創(chuàng)建一個(gè)帶文本的按鈕。</p><p> ?。?) JButton(String text,Icon icon):創(chuàng)建一個(gè)帶初始文本和圖標(biāo)的按鈕。</p><p> 3、JColorChooser類(lèi)</p><p><b> 三個(gè)級(jí)別的API:</b></p><p>
56、(1)顯示具有模式顏色選擇器的對(duì)話(huà)框并返回用戶(hù)所選的靜態(tài)方法。</p><p> ?。?)創(chuàng)建顏色選擇器對(duì)話(huà)框的靜態(tài)方法,可以指定當(dāng)用戶(hù)按下其中一個(gè)對(duì)話(huà)框按鈕時(shí)要調(diào)用的ActionListener。</p><p> ?。?)能直接在任何容器中創(chuàng)建JColorChooser窗格實(shí)例??梢蕴砑覲ropertyChange監(jiān)聽(tīng)器以檢測(cè)當(dāng)前“顏色”屬性何時(shí)更改。</p><p
57、> JcolorChooser類(lèi)的構(gòu)造方法有如下三個(gè)版本:</p><p> JcolorChooser():創(chuàng)建初始顏色為白色的顏色選擇器窗格; JcolorChooser(Color initialColor):創(chuàng)建具有指定初始顏色的顏色選擇器窗格;JcolorChooser(ColorSelectionModel model):創(chuàng)建具有指定ColorSelection -Model的顏色選擇器窗
58、格。</p><p> 4、文本域JTextField</p><p> JTextField是JTextComponent類(lèi)的一個(gè)子類(lèi),JTextComponent類(lèi)又是JComponent的一個(gè)子類(lèi)。JTextField與java.awt.TextField應(yīng)具有源代碼兼容性,當(dāng)光標(biāo)移動(dòng)到文本域并且按回車(chē)鍵時(shí),它觸發(fā)一個(gè)ActionEvent事件。JTextField類(lèi)構(gòu)造方法有如
59、下4個(gè)版本:</p><p> (1)JTextField():構(gòu)造一個(gè)TextField對(duì)象。</p><p> ?。?)JTextField(Document doc,String text,int columns):構(gòu)造一個(gè)JTextField,它使用給定的文本存儲(chǔ)模型和給定的列數(shù)。</p><p> ?。?)JTextField(String text)構(gòu)
60、造一個(gè)指定文本初始化的TextField。</p><p> (4)JTextField(String text,int columns):構(gòu)造一個(gè)用指定文本和列初始化的TextField。</p><p> 3.1.3菜單類(lèi) </p><p><b> 菜單類(lèi)包括:</b></p><p><b>
61、 1、JMenu</b></p><p> 一個(gè)菜單(JMenu)由多個(gè)菜單項(xiàng)組成并具有一個(gè)標(biāo)題,這個(gè)標(biāo)題出現(xiàn)在菜單條上,當(dāng)單擊這個(gè)標(biāo)題時(shí)這些菜單項(xiàng)立即彈出。選擇一個(gè)菜單項(xiàng)就可以引起一個(gè)動(dòng)作事件。多個(gè)菜單又可以組合成一個(gè)新的菜單或菜單條,增加在最頂層的窗口(Frame或JFrame)上。</p><p> 菜單的實(shí)現(xiàn)是一個(gè)包含JMenuItem的彈出窗口,用戶(hù)選擇JMenu
62、Bar上的項(xiàng)時(shí)會(huì)顯示該JMenuItem。除JMenuItem之外,JMenu還可以包含JSeparator。</p><p> 菜單在本質(zhì)上是帶有關(guān)聯(lián)JPopupMenu的按鈕。當(dāng)單擊按鈕時(shí)就會(huì)顯示JPopupMenu。如果按鈕位于JMenuBar上則該菜單為頂層窗口。如果按鈕時(shí)另一個(gè)菜單項(xiàng),則JPopupMenu就是右拉菜單。</p><p> 菜單中的菜單項(xiàng)也可以是菜單,可使用它
63、自身的add方法來(lái)增加菜單項(xiàng)或菜單對(duì)象。</p><p> 2、JMenuItem</p><p> 菜單項(xiàng)在本質(zhì)上是位于列表中的按鈕。當(dāng)用戶(hù)單擊按鈕時(shí)則執(zhí)行與菜單項(xiàng)關(guān)聯(lián)的操作。</p><p> 3、JMenuBar</p><p> 一個(gè)菜單條可包含多個(gè)菜單,通過(guò)add方法可增加這些菜單對(duì)象。菜單條可通過(guò)JFrame的setJMe
64、nuBar方法加入到一個(gè)JFrame中。</p><p> 將JMenu對(duì)象添加到菜單條以構(gòu)造菜單。當(dāng)用戶(hù)選擇JMenu對(duì)象時(shí)就會(huì)顯示其關(guān)聯(lián)的JPopupMenu,并允許用戶(hù)選擇其上的某一個(gè)JMenuItem對(duì)象。</p><p> 3.1.4事件處理 </p><p> 大多數(shù)的Java程序通過(guò)GUI構(gòu)件(例按鈕、窗口、菜單等)與用戶(hù)進(jìn)行交互,俄羅斯方塊游
65、戲也是如此。俄羅斯方塊游戲與用戶(hù)最重要的交互活動(dòng)是用戶(hù)通過(guò)鍵盤(pán)來(lái)控制游戲、通過(guò)按鈕和菜單來(lái)設(shè)置游戲。前者在Java中表現(xiàn)為鍵盤(pán)事件,后者變現(xiàn)為動(dòng)作時(shí)間。在Java中事件由分層的事件類(lèi)表示,而接口則描述了對(duì)特定事件響應(yīng)的方法。想要處理這些事件的類(lèi)就必須實(shí)現(xiàn)一個(gè)或多個(gè)接口以及這些接口中的方法。下面就討論表示這兩種事件的Java類(lèi)和相應(yīng)的監(jiān)聽(tīng)和處理接口:</p><p> 1、ActionEvent類(lèi)</p&g
66、t;<p> 產(chǎn)生事件的構(gòu)件稱(chēng)為事件源,每個(gè)事件源可以產(chǎn)生多個(gè)特定類(lèi)型的事件,這些事件可進(jìn)入到系統(tǒng)級(jí)事件隊(duì)列中。構(gòu)件可以注冊(cè)監(jiān)聽(tīng)這些事件的監(jiān)聽(tīng)接口,并且必須實(shí)現(xiàn)該接口特定的方法以響應(yīng)來(lái)自事件源的事件。只有那些已注冊(cè)事件監(jiān)聽(tīng)的構(gòu)件所產(chǎn)生的事件才能傳給Java虛擬機(jī)。如果一個(gè)事件源注冊(cè)了多個(gè)監(jiān)聽(tīng)接口,那么每個(gè)監(jiān)聽(tīng)接口都會(huì)接收到原始事件發(fā)送的信息。</p><p> 2、ActionListener類(lèi)
67、</p><p> 接口用來(lái)說(shuō)明一些抽象方法,然后由類(lèi)來(lái)實(shí)現(xiàn)這些方法。ActionListener是java.Awt.event包中的一個(gè)接口,它定義了事件的處理方法actionPerformed。</p><p> 一個(gè)實(shí)現(xiàn)ActionListener的類(lèi)必須包含一個(gè)actionPerformed方法。為了保持這個(gè)方法的簡(jiǎn)單性,在if—else—if語(yǔ)句的相應(yīng)分支內(nèi)部將事件交給一些
68、相應(yīng)處理模塊來(lái)完成。如果某個(gè)處理方法對(duì)其他類(lèi)是有用的并且不會(huì)產(chǎn)生副作用,則應(yīng)使其成為public方法:</p><p> 一個(gè)動(dòng)作事件的監(jiān)聽(tīng)與處理可以使用如下規(guī)則:</p><p> ?。?)聲明一個(gè)ActionListener類(lèi)型的Listener變量并存儲(chǔ)監(jiān)聽(tīng)接口的引用。</p><p> ?。?)使用某個(gè)構(gòu)件的addActionListener方法將list
69、ener設(shè)置為監(jiān)聽(tīng)者。 </p><p> ?。?)創(chuàng)建(或用戶(hù)的交互行為產(chǎn)生)一個(gè)action事件,然后調(diào)用listener的ationPerformed方法。</p><p> 在俄羅斯方塊游戲中產(chǎn)生動(dòng)作事件的構(gòu)件有菜單項(xiàng)和按鈕。這兩個(gè)事件源上的監(jiān)聽(tīng)者都是通過(guò)匿名類(lèi)產(chǎn)生的,并且在增加監(jiān)聽(tīng)者(addActionListener)的同時(shí)生成(new)監(jiān)聽(tīng)者對(duì)象,而這個(gè)匿名類(lèi)主要是定義了
70、相應(yīng)actionPerformed方法。該監(jiān)聽(tīng)者對(duì)象直接綁定到事件源上之后就可以監(jiān)聽(tīng)該構(gòu)件上的事件。有三個(gè)典型的菜單項(xiàng)和按鈕的處理方式(見(jiàn)附錄)。</p><p> 3、KeyEvent類(lèi)</p><p> 對(duì)于按下鍵和釋放鍵事件,getKeyCode方法將返回事件的KeyCode。對(duì)于鍵入事件,getKeyCode方法將返回VK_UNDEFINED。</p><p
71、> 按下鍵和釋放鍵事件是低級(jí)別事件,依賴(lài)于平臺(tái)和鍵盤(pán)布局。只要按下或釋放鍵就會(huì)生成該事件,它們是發(fā)現(xiàn)不生成字符輸入鍵(如動(dòng)作鍵、修改鍵等)的唯一方式。通過(guò)getKeyCode方法可指出按下或釋放的鍵,該方法返回一個(gè)虛擬鍵碼。</p><p> 按下和釋放鍵盤(pán)上的鍵會(huì)導(dǎo)致(依次)生成以下鍵事件:</p><p> (1)KEY_PRESSED</p><p&g
72、t; ?。?)KEY_TYPED(只在可生成有效Unicode字符時(shí)產(chǎn)生)。</p><p> ?。?)KEY_RELEASED。</p><p> 但在某些情況下(例如在激活自動(dòng)重復(fù)或輸入方法時(shí)),該順序可能會(huì)有所不同(并且與平臺(tái)有關(guān))。</p><p> 4、KeyListener接口</p><p> KeyListener包含的
73、主要抽象方法如下:</p><p> ?。?)void keyPressed(KeyEvent e):按下某個(gè)鍵時(shí)調(diào)用此方法。</p><p> ?。?)void keyPeleased(KeyEvent e):釋放某個(gè)鍵時(shí)調(diào)用此方法。</p><p> ?。?)void keyTyped(KeyEvent e):鍵入某個(gè)鍵時(shí)調(diào)用此方法。</p>&l
74、t;p> 5、KeyAdapter類(lèi)</p><p> 使用擴(kuò)展KeyAdapter的類(lèi)創(chuàng)建監(jiān)聽(tīng)器對(duì)象,然后使用組建的addKeyListener方法向該組件注冊(cè)此監(jiān)聽(tīng)器對(duì)象。當(dāng)按下、釋放或鍵入某個(gè)鍵時(shí)將調(diào)用監(jiān)聽(tīng)器對(duì)象中的相應(yīng)方法,并將KeyEvent傳遞給它。俄羅斯方塊游戲就是以這種方式實(shí)現(xiàn)游戲的按鈕控制鍵的監(jiān)聽(tīng)器,如下代碼定義了ControlKeylListener類(lèi):</p><
75、;p> private class ControlKeyListener extends KeyAdapter {}。</p><p> 然后可在該類(lèi)中實(shí)現(xiàn)KeyAdapter的方法[7]。</p><p> 3.1.5布局管理 </p><p> Java使用布局管理起來(lái)管理版面布局。布局管理器按照布局說(shuō)明選擇構(gòu)件的最佳位置,保證布局的總體外觀在不
76、同的操作系統(tǒng)下與Java程序的描述保持一致。在游戲中用到的三個(gè)布局管理器,如表3-1所示。</p><p> 表 3-1 AWT的三個(gè)常用布局管理器</p><p> 3.1.6圖形類(lèi)與圖形的繪制 </p><p> 由于Frame類(lèi)繼承于Component類(lèi),所以可以通過(guò)覆蓋所繼承的paint方法來(lái)進(jìn)行繪圖。還有一種很流行的繪圖方法,即創(chuàng)建一個(gè)單獨(dú)的類(lèi),這個(gè)
77、類(lèi)繼承于Canvas類(lèi)并且覆蓋paint方法。俄羅斯方塊游戲采用的是繼承于Canvas類(lèi)的方式。</p><p> Canvas繼承于Component類(lèi),并繼承了它的paint(Graphics g)、update(Graphics g)以及repaint()方法。Cavas作為圖形對(duì)象時(shí),自動(dòng)調(diào)用repaint方法進(jìn)行更新。在repaint中需要調(diào)用update方法,update方法在清除屏幕后再調(diào)用pai
78、nt方法。使用Cavas作為繪圖工具時(shí)首先創(chuàng)建一個(gè)繼承于Cavas類(lèi)并且覆蓋paint方法,再將這個(gè)類(lèi)作為一個(gè)成員加入到類(lèi)似于Frame或Applet的類(lèi)中,用某種布局管理器對(duì)其進(jìn)行定位[8]。</p><p> 3.2 Java多線(xiàn)程機(jī)制</p><p> 在游戲過(guò)程中需要對(duì)玩家的控制進(jìn)行實(shí)時(shí)處理,這就涉及到了Java的一個(gè)重要的特性:多線(xiàn)程。在此就不做介紹了。</p>
79、<p> 第4章 設(shè)計(jì)的方案及實(shí)現(xiàn)</p><p><b> 4.1設(shè)計(jì)方案</b></p><p> 4.1.1游戲界面設(shè)計(jì)</p><p> 俄羅斯方塊的游戲界面分為兩個(gè)窗口,即Canvas和Panel。這兩個(gè)窗口并列,但所占的寬度比例不一樣。兩個(gè)窗口之上是菜單條。</p><p><b&g
80、t; 1、菜單的設(shè)計(jì)</b></p><p> 為了方便運(yùn)行,本設(shè)計(jì)將俄羅斯方塊游戲的菜單系統(tǒng)去掉每個(gè)菜單項(xiàng)的具體功能,僅保留菜單的框架和退出功能。</p><p> 它的菜單項(xiàng)沒(méi)有實(shí)際功能。</p><p><b> 2、游戲塊的設(shè)計(jì)</b></p><p> 游戲塊是俄羅斯方塊游戲的最基本元素。
81、設(shè)計(jì)思路為:利用Java中提供的圖形類(lèi)對(duì)象并對(duì)著色來(lái)實(shí)現(xiàn)游戲塊。</p><p> 首先定義一個(gè)類(lèi)ErsBox來(lái)表示一個(gè)游戲單元方格,然后定義一個(gè)游戲方塊,該游戲方塊由4*4個(gè)ErsBox單元格組成,定義4*4的游戲方塊是為了便于實(shí)現(xiàn)前面提到的7種不同的俄羅斯方塊,因?yàn)?種俄羅斯方塊的旋轉(zhuǎn)變化恰好都在長(zhǎng)、寬各4個(gè)單元格之內(nèi)。通過(guò)著色方式可輕松實(shí)現(xiàn)方塊的28種不同的形態(tài),并對(duì)后續(xù)的游戲運(yùn)行控制提供便利。</
82、p><p><b> 3、游戲畫(huà)布的設(shè)計(jì)</b></p><p> 游戲畫(huà)布是游戲的背景窗口,方塊的運(yùn)動(dòng)、變形都在畫(huà)布中進(jìn)行,畫(huà)布的大小為20*12個(gè)ErsBox單元格。另外,游戲畫(huà)布還要響應(yīng)鍵盤(pán)消息。</p><p><b> 4、控制面板的設(shè)計(jì)</b></p><p> 游戲的控制面板是整個(gè)
83、游戲的框架,其中包括游戲畫(huà)布、菜單、游戲提示面板(提示下一個(gè)方塊信息)、控制按鈕(控制游戲的開(kāi)始,使菜單生效)等[9]。</p><p> 4.1.2游戲控制設(shè)計(jì)</p><p> 游戲中的方塊采用線(xiàn)程實(shí)現(xiàn),一個(gè)方塊由4*4個(gè)ErsBox單元格構(gòu)成,它可以由鍵盤(pán)控制移動(dòng)、下落、變形等。游戲控制由兩個(gè)主要的Thread完成。</p><p> 4.1.3基本類(lèi)設(shè)
84、計(jì)</p><p> 1、方格類(lèi)ErsBox</p><p> 實(shí)現(xiàn)Cloneable接口后,使用Object.clone()在一個(gè)類(lèi)的實(shí)例之間進(jìn)行域?qū)τ虻膹?fù)制。如果沒(méi)有實(shí)現(xiàn)這個(gè)接口又調(diào)用了Object的clone()方法將會(huì)拋出CloneNotSupportedException異常。通常的作法是:一個(gè)類(lèi)在實(shí)現(xiàn)Cloneable的接口的同時(shí)用一個(gè)public類(lèi)型的方法覆蓋Object
85、.clone()方法(Object.clone()在Object中定義為protected類(lèi)型)[10]。</p><p> 在ErsBox類(lèi)設(shè)計(jì)中,其主要成員變量和成員方法的說(shuō)明如表4-1和表4-2所示:</p><p> 表4-1 Ersbox類(lèi)主要成員變量</p><p> 表4-2 ErsBox類(lèi)主要成員方法</p><p>
86、 方格類(lèi)中用一個(gè)Dismension對(duì)象表示一個(gè)方格的大小,另外方格類(lèi)還使用了兩個(gè)與Dismension類(lèi)有關(guān)的方法,分別用來(lái)獲得和設(shè)置方格的大小。Dismension類(lèi)封裝了一個(gè)構(gòu)件的高度和寬度。</p><p> 2、方塊類(lèi)ErsBlock</p><p> 游戲的主要實(shí)體俄羅斯方塊由4*4個(gè)方格(ErsBox)構(gòu)成。這個(gè)塊不斷產(chǎn)生和消失,并且還要不斷變化(翻轉(zhuǎn)),因此可用線(xiàn)程來(lái)實(shí)
87、現(xiàn),該類(lèi)繼承于線(xiàn)程類(lèi)Thread。</p><p> 該類(lèi)用4位16進(jìn)制數(shù)表示一個(gè)4*4個(gè)方格組成的方塊,即一個(gè)方塊的狀態(tài)。在這里1為被補(bǔ)充,0為不被補(bǔ)充。這28種狀態(tài)可用一個(gè)STYLES數(shù)組表示出來(lái)。</p><p> 一個(gè)STYLES中的元素使用一個(gè)整數(shù)表示的,如橫長(zhǎng)條是用0x0f00表示,再用key=0z08000與STYLES的某個(gè)元素style進(jìn)行“與”運(yùn)算,即取出了styl
88、e中的第一位,這一位如果是1,則表示對(duì)應(yīng)的方格在該方塊中是要用色彩來(lái)顯示大的,因此產(chǎn)生一個(gè)方格,即一個(gè)ErsBox對(duì)象。檢查之后再作位移運(yùn)算key>>=1,如0x8000移位后變成0x4000,再利用它進(jìn)行檢查與style第二位對(duì)應(yīng)方塊的位置是否應(yīng)該產(chǎn)生一個(gè)有色彩的方格,如此下去,這個(gè)二重for循環(huán)一共要檢查方塊的16個(gè)方塊的位置。</p><p> 鑒于上面的表示方法,ErsBlock類(lèi)的構(gòu)造方法
89、以一個(gè)STYLES、該方塊所在的畫(huà)布及其在畫(huà)布中的坐標(biāo)、游戲等級(jí)作為參數(shù)。</p><p> 構(gòu)造方法中的二循環(huán)就是在創(chuàng)建16個(gè)方格。利用display()方法可將當(dāng)前方塊在畫(huà)布的對(duì)應(yīng)位置上顯示出來(lái)。ErsBlock類(lèi)的主要成員變量和主要成員方法分別由表4-3和表4-4所示。</p><p> 表4-3 ErsBlock的主要成員變量</p><p> 表4-
90、4 ErsBlock主要成員方法</p><p> 由于游戲中方塊的動(dòng)態(tài)性,每個(gè)方塊有一定的生命期,用線(xiàn)程實(shí)現(xiàn)方塊是最好不過(guò)了。方塊用一個(gè)類(lèi)實(shí)現(xiàn),該類(lèi)直接繼承線(xiàn)程類(lèi)Thread,所以一個(gè)方塊的出現(xiàn)就是一個(gè)線(xiàn)程對(duì)象的產(chǎn)生并運(yùn)行。它可以由鍵盤(pán)控制移動(dòng)、下落、變形等。</p><p> 該線(xiàn)程類(lèi)的主體是run()方法,該方法主要控制方塊的下落,其中下落的速度由sleep方法的參數(shù)來(lái)控制,該參
91、數(shù)的值又是由一個(gè)基本值和游戲的級(jí)別來(lái)控制,級(jí)別越高則休眠的時(shí)間越短且下落越快。</p><p> 在這個(gè)類(lèi)里利用moving變量控制方塊的下落過(guò)程,moveTo()方法移動(dòng)到某個(gè)位置時(shí)不成功或stopMove()要停止方塊移動(dòng)時(shí)都是設(shè)置moving變量為假,這樣該線(xiàn)程即可正常終止。</p><p> 3、游戲主類(lèi)ErsBlocksGame負(fù)責(zé)游戲的全局控制。它是一個(gè)JFrame類(lèi),即以
92、窗口的形式出現(xiàn)的。JFrame是Swing包中與Frame對(duì)應(yīng)的類(lèi),功能與Frame類(lèi)似。從界面上來(lái)講主類(lèi)中包含一個(gè)GrameCanvas畫(huà)布類(lèi)的實(shí)例和一個(gè)控制面板的實(shí)例。</p><p> 4、控制面板類(lèi)ControlPanel</p><p> 控制面板是俄羅斯方塊的主要控制部分,從前面的總體結(jié)構(gòu)可以看出該窗口是一個(gè)面板,繼承于JPanel類(lèi),該面板分為三個(gè)部分,即提示下一個(gè)游戲方
93、塊的面板、顯示游戲當(dāng)前信息的面板、存放控制按鈕的面板。</p><p> 5、畫(huà)布類(lèi)GameCanvas</p><p> 畫(huà)布類(lèi)GameCanva是該游戲中的一個(gè)窗口。它是用一個(gè)面板來(lái)實(shí)現(xiàn)的,是一個(gè)繼承于JPanel的類(lèi)。它的大小完全是根據(jù)方格來(lái)拼接起來(lái)的。</p><p><b> 4.2 程序?qū)崿F(xiàn)</b></p>&l
94、t;p> 4.2.1菜單類(lèi)的實(shí)現(xiàn)</p><p><b> 1、菜單系統(tǒng)</b></p><p> 菜單系統(tǒng)分為兩部分,一部分是菜單聲明,另一部分是菜單的創(chuàng)建:</p><p> (1)菜單的聲明部分</p><p> 菜單的聲明部分的代碼見(jiàn)附錄。</p><p><b>
95、; ?。?)菜單的創(chuàng)建</b></p><p> 菜單具體的創(chuàng)建過(guò)程以及菜單觸發(fā)的動(dòng)作定義由下面的createMenu方法進(jìn)行設(shè)置,其細(xì)節(jié)在程序的注釋中說(shuō)明。(代碼見(jiàn)附錄)</p><p> 2、菜單項(xiàng)對(duì)應(yīng)的操作設(shè)置:</p><p> ?。?)快捷鍵的設(shè)置菜單</p><p> 首先為“暫?!焙汀崩^續(xù)”菜單項(xiàng)設(shè)置快捷鍵,該
96、功能要用KeyStroke類(lèi),該類(lèi)表示一個(gè)鍵盤(pán)或等價(jià)的設(shè)備上的一個(gè)動(dòng)作,它可以對(duì)應(yīng)一個(gè)特定的鍵的按下和松開(kāi)操作,就像KeyEvent類(lèi)中的KEY_PRESSED和KEY_Event動(dòng)作一樣;也可以對(duì)應(yīng)鍵入一個(gè)特定的Java字符,就像KeyEvent類(lèi)中的KEY_TYPED動(dòng)作一樣;KeyStroke還可說(shuō)明在特定動(dòng)作中匹配出現(xiàn)的組合鍵,如Alt、Shift、Control等鍵的修飾符。</p><p> ?。?)
97、方塊顏色和背景顏色的選擇菜單</p><p> 該程序中用到了JColorChooser類(lèi),該類(lèi)可以讓用戶(hù)自己手工選擇色彩,這個(gè)類(lèi)提供了三個(gè)級(jí)別API:</p><p> 一個(gè)靜態(tài)方法顯示一個(gè)模態(tài)的色彩選擇對(duì)話(huà)框,然后返回用戶(hù)選擇的色彩。一個(gè)靜態(tài)方法創(chuàng)建一個(gè)色彩選擇對(duì)話(huà)框,對(duì)這個(gè)對(duì)話(huà)框ActionListener監(jiān)聽(tīng)用戶(hù)按下的色彩選擇按鈕。在任何容器內(nèi)直接創(chuàng)建JColorChooser
98、邊條的實(shí)例,可加入PropertyChange監(jiān)聽(tīng)接口來(lái)檢測(cè)當(dāng)前色彩的變化。</p><p> 這些功能在俄羅斯方塊游戲的方塊顏色和背景顏色的選擇菜單中得到了很好地應(yīng)用。其具體代碼見(jiàn)附錄。</p><p> 無(wú)論是選擇方塊的顏色還是選擇背景顏色,選中相應(yīng)的菜單項(xiàng)后都會(huì)彈出一個(gè)對(duì)話(huà)框,該對(duì)話(huà)框上有三個(gè)標(biāo)簽,分別是HSB、樣品和RGB。</p><p> ?。?)菜
99、單響應(yīng)的設(shè)置</p><p> 設(shè)置菜單的響應(yīng),即指定的當(dāng)用戶(hù)某種行為后應(yīng)采取相應(yīng)的動(dòng)作。完成該功能的語(yǔ)句如下:</p><p> 菜單項(xiàng).addActionListerner(動(dòng)作監(jiān)聽(tīng)機(jī)器);</p><p> 而動(dòng)作監(jiān)聽(tīng)器又是以匿名類(lèi)的形式實(shí)現(xiàn)的。其語(yǔ)句形式為:</p><p> New ActionListerner(){ /
100、監(jiān)聽(tīng)方法的描述/ }</p><p> 各菜單項(xiàng)增加監(jiān)聽(tīng)器和監(jiān)聽(tīng)接口具體的描述語(yǔ)句見(jiàn)附錄。</p><p> 4.2.2方格類(lèi)的實(shí)現(xiàn)</p><p> 俄羅斯方塊游戲的<行數(shù)><列數(shù)>個(gè)方格是用復(fù)制的方法產(chǎn)生的,因此要使方格類(lèi)實(shí)現(xiàn)Cloneable接口。</p><p> 這里可以看出方格類(lèi)并沒(méi)有畫(huà)出方格,只是
101、用顏色代表這是一個(gè)什么樣的方格。方格的畫(huà)出實(shí)在方塊類(lèi)中進(jìn)行的。</p><p> 4.2.3方塊類(lèi)的實(shí)現(xiàn) </p><p> 方塊類(lèi)的實(shí)現(xiàn)主要使用位運(yùn)算和位移運(yùn)算取出表示一個(gè)方塊的信息,然后根據(jù)這些信息用前景顏色或背景顏色畫(huà)出方塊。</p><p> ErsBlock類(lèi)的構(gòu)造的方法可用位運(yùn)算或位移運(yùn)算產(chǎn)生一個(gè)與STYLES中的元素對(duì)應(yīng)的方塊。</p>
102、;<p> 除了給出的程序注釋外,下面再對(duì)幾個(gè)重要的方法進(jìn)行討論。</p><p> ErsBlock類(lèi)作為一個(gè)線(xiàn)程類(lèi),它最重要的方法就是run方法。不難看出整個(gè)run方法是由一個(gè)whlie循環(huán)控制的,而whlie循環(huán)式根據(jù)moving布爾變量控制的。這是一個(gè)線(xiàn)程的技巧,其一般形式如下:</p><p> Public void run()</p>&l
103、t;p> { while (moving)</p><p> { / your code here /}</p><p><b> }</b></p><p> 由于線(xiàn)程中不再使用stop()方法,因此要使用一個(gè)moving布爾變量作為循環(huán)的控制變量,如有必要可在任何時(shí)候設(shè)置moving為假,這樣即可終止線(xiàn)程的執(zhí)行。<
104、/p><p> 在這個(gè)類(lèi)里也正是利用moving變量控制方塊的下落過(guò)程,moveTo()方法移動(dòng)到某個(gè)位置時(shí)不成功或stopMove()要停止方塊移動(dòng)時(shí),都是設(shè)置moving變量為假,這樣即可使線(xiàn)程正常終止。</p><p> 該類(lèi)的moveTo(int newRow,int newCol)方法也值得注意,這是一個(gè)同步方法,該方法通過(guò)對(duì)成員變量x、y進(jìn)行操作來(lái)控制方塊。由于不能同時(shí)都來(lái)控制
105、方塊,要有序地進(jìn)行,所以設(shè)置為同步方法。該方法在通過(guò)isMoveAble檢驗(yàn)可以移動(dòng)并且moving為真時(shí)才把方塊定位在新的位置。</p><p> 4.2.4主類(lèi)的實(shí)現(xiàn) </p><p> 俄羅斯方塊游戲的主類(lèi)ErsBlocksGrame的輪廓是一個(gè)JFrame類(lèi),初始化的許多工作都是圍繞窗口展開(kāi)的。在它的主要方法和內(nèi)部類(lèi)中構(gòu)造方法完成了窗口標(biāo)題的顯示、窗口的調(diào)整、菜單的創(chuàng)建、游戲面
106、板和控制面板的創(chuàng)建、窗口的布局、窗口及其窗口中構(gòu)建監(jiān)聽(tīng)器的加載:私有類(lèi)Game描述了一輪游戲的過(guò)程:main方法調(diào)用構(gòu)造方法初始化當(dāng)前類(lèi)的實(shí)例,從而啟動(dòng)了整個(gè)程序的執(zhí)行[11]。</p><p> 4.2.5控制面板類(lèi)的實(shí)現(xiàn) </p><p> 控制面板類(lèi)ControlPanel主要按照前面的設(shè)計(jì)框架填入響應(yīng)的內(nèi)容。</p><p> 提示面板TipPanel
107、類(lèi)的要點(diǎn)是兩個(gè)類(lèi)的構(gòu)造方法,構(gòu)造方法1創(chuàng)建沒(méi)有顏色的方塊,構(gòu)造方法2調(diào)用構(gòu)造方法1創(chuàng)建一個(gè)方塊后,再設(shè)置前景色和背景色。setStyle方法設(shè)置預(yù)顯窗口的方塊樣式,即ErsBlock類(lèi)的STYLES中的28個(gè)值之一,然后由paintComponent方法繪制出這個(gè)即將出現(xiàn)的方塊。</p><p> 4.2.6游戲畫(huà)布類(lèi)的實(shí)現(xiàn) </p><p> 游戲畫(huà)布類(lèi)GrameCanvas是該游戲
108、的窗口,該窗口完全是根據(jù)方格拼接起來(lái)的,畫(huà)布類(lèi)GrameCanvas的主要功能是逐行繪制方格,如果某個(gè)方格不顯示設(shè)置這個(gè)方格顏色為背景顏色,否則置為前景色。</p><p><b> 第5章 測(cè)試</b></p><p> 5.1 菜單界面測(cè)試</p><p> 1、下圖為16進(jìn)制數(shù)0*0f00表示的方塊,此方塊在游戲界面中能顯示出下一個(gè)
109、方塊的形狀:</p><p> 2、此游戲的菜單欄中共有四個(gè)菜單,其中“游戲”這個(gè)菜單下有六個(gè)菜單項(xiàng),每個(gè)菜單項(xiàng)都有它自己的功能。點(diǎn)擊新游戲可以結(jié)束上次的游戲進(jìn)入下一次的新的游戲;設(shè)置方塊顏色和背景顏色是根據(jù)自己的喜好給方塊和背景改顏色的;增加難度和降低難度也是根據(jù)自己的情況來(lái)選擇難度級(jí)別的;點(diǎn)擊退出鍵時(shí),游戲結(jié)束并且退出,此界面將關(guān)閉。如下圖:</p><p> 3、無(wú)論是方塊的顏色
110、還是背景的顏色都可以進(jìn)行設(shè)置,“游戲”菜單下的第二個(gè)和第三個(gè)菜單項(xiàng)就是實(shí)現(xiàn)該功能的。選中相應(yīng)的菜單項(xiàng)都會(huì)彈出一個(gè)對(duì)話(huà)框,該對(duì)話(huà)框上有五個(gè)標(biāo)簽,分別是示例、HSV、HSL、RGB和CMYK。在這里就不一一給出。如下圖所示:</p><p> 4、“控制”菜單下有四個(gè)菜單項(xiàng),分別有開(kāi)始、暫停、繼續(xù)、停止。按開(kāi)始時(shí),可以使暫停的游戲接著上回的地方繼續(xù)游戲。如下圖:</p><p> 5、“窗
111、口風(fēng)格”菜單下有三個(gè)菜單項(xiàng),每個(gè)菜單項(xiàng)可以設(shè)置窗口的風(fēng)格。此時(shí)的界面顯示的是Metal風(fēng)格。</p><p> 6、“幫助”菜單下可以看到有兩個(gè)菜單項(xiàng),作者和版本。如下圖所示:</p><p><b> 5.2 功能測(cè)試</b></p><p> 1、俄羅斯方塊游戲未開(kāi)始時(shí)的界面:</p><p> 2、點(diǎn)擊開(kāi)始
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 俄羅斯方塊游戲畢業(yè)論文
- 俄羅斯方塊游戲java畢業(yè)論文
- 俄羅斯方塊游戲開(kāi)發(fā)畢業(yè)論文
- 畢業(yè)論文(java游戲俄羅斯方塊)
- 俄羅斯方塊分組對(duì)抗游戲的實(shí)現(xiàn)畢業(yè)論文
- 俄羅斯方塊分組對(duì)抗游戲的實(shí)現(xiàn)畢業(yè)論文
- 俄羅斯方塊畢業(yè)論文
- 畢業(yè)論文俄羅斯方塊的實(shí)現(xiàn)系統(tǒng)
- java俄羅斯方塊畢業(yè)論文
- 畢業(yè)論文----java俄羅斯方塊
- 基于單片機(jī)實(shí)現(xiàn)的俄羅斯方塊游戲畢業(yè)論文
- 畢業(yè)論文-java俄羅斯方塊
- 基于fpga的俄羅斯方塊游戲設(shè)計(jì)畢業(yè)論文
- 基于單片機(jī)實(shí)現(xiàn)的俄羅斯方塊游戲-畢業(yè)論文
- 基于單片機(jī)實(shí)現(xiàn)的俄羅斯方塊游戲-畢業(yè)論文
- 畢業(yè)論文——基于單片機(jī)實(shí)現(xiàn)的俄羅斯方塊游戲
- 基于fpga的俄羅斯方塊游戲設(shè)計(jì)畢業(yè)論文
- 俄羅斯方塊游戲畢業(yè)設(shè)計(jì)
- 畢業(yè)論文范文——俄羅斯方塊游戲課程設(shè)計(jì)
- 俄羅斯方塊論文
評(píng)論
0/150
提交評(píng)論