版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 摘要</b></p><p> Java是一種可以撰寫(xiě)跨平臺(tái)應(yīng)用軟件的面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言,是由Sun Microsystems公司于1995年5月推出的Java程序設(shè)計(jì)語(yǔ)言和Java平臺(tái)(即JavaSE, JavaEE, JavaME)的總稱(chēng)。Java 技術(shù)具有卓越的通用性、高效性、平臺(tái)移植性和安全性,廣泛應(yīng)用于個(gè)人PC、數(shù)據(jù)中心、游戲控制臺(tái)、科學(xué)超級(jí)計(jì)算
2、機(jī)、移動(dòng)電話和互聯(lián)網(wǎng),同時(shí)擁有全球最大的開(kāi)發(fā)者專(zhuān)業(yè)社群。在全球云計(jì)算和移動(dòng)互聯(lián)網(wǎng)的產(chǎn)業(yè)環(huán)境下,Java更具備了顯著優(yōu)勢(shì)和廣闊前景。</p><p><b> 目錄 </b></p><p><b> 引言1</b></p><p><b> 1研究方法1</b></p><
3、;p> 1.1俄羅斯方塊游戲的基本要求1</p><p> 1.1.1游戲基本功能:移動(dòng)、加速、變形、消除、游戲結(jié)束等。1</p><p> 1.1.2顯示下一個(gè)方塊。1</p><p> 1.1.3游戲難度歲分?jǐn)?shù)遞增。1</p><p> 1.1.4玩家自己設(shè)置游戲難度、開(kāi)始、暫停等。1</p>&l
4、t;p> 1.1.5分?jǐn)?shù)的統(tǒng)計(jì)等。1</p><p><b> 2、研究過(guò)程1</b></p><p> 2.1、模塊設(shè)計(jì)1</p><p> 2.1.1、控制面板類(lèi)1</p><p> 2.1.2、塊類(lèi)2</p><p> 2.1.3、游戲主類(lèi)2</p>
5、<p> 2.1.4、方格類(lèi)2</p><p> 2.1.5、畫(huà)布類(lèi)2</p><p> 2.2、詳細(xì)設(shè)計(jì)2</p><p> 2.2.1、游戲控制2</p><p> 2.2.2、方塊設(shè)計(jì)3</p><p> 2.2.3、畫(huà)布設(shè)計(jì)4</p><p><
6、;b> 3、運(yùn)行結(jié)果6</b></p><p> 3.1、初始畫(huà)面:6</p><p> 3.2、游戲設(shè)置界面:7</p><p> 3.3、游戲進(jìn)行中的界面:8</p><p> 3.4、游戲結(jié)束界面:9</p><p><b> 4、心得體會(huì)9</b>
7、</p><p><b> 5、參考文獻(xiàn):9</b></p><p> 6、附錄:游戲主類(lèi)代碼9</p><p><b> 引言</b></p><p> 開(kāi)發(fā)一個(gè)單機(jī)游戲系統(tǒng),能夠?qū)崿F(xiàn)俄羅斯方塊程序。通過(guò)鍵盤(pán)按鍵可以調(diào)整方塊的旋轉(zhuǎn)方向。最終達(dá)到能夠通過(guò)本次課程設(shè)計(jì),進(jìn)一步鞏固所學(xué)jav
8、a知識(shí),學(xué)會(huì)將理論用于實(shí)踐,掌握所學(xué)知識(shí)的實(shí)驗(yàn)意義。操作系統(tǒng):windows xp,開(kāi)發(fā)工具:Myeclipse 開(kāi)發(fā)語(yǔ)言:java</p><p><b> 1研究方法</b></p><p> 1.1俄羅斯方塊游戲的基本要求</p><p> 1.1.1游戲基本功能:移動(dòng)、加速、變形、消除、游戲結(jié)束等。</p><
9、p> 1.1.2顯示下一個(gè)方塊。</p><p> 1.1.3游戲難度歲分?jǐn)?shù)遞增。</p><p> 1.1.4玩家自己設(shè)置游戲難度、開(kāi)始、暫停等。</p><p> 1.1.5分?jǐn)?shù)的統(tǒng)計(jì)等。</p><p><b> 2、研究過(guò)程</b></p><p><b> 2
10、.1、模塊設(shè)計(jì)</b></p><p> 2.1.1、控制面板類(lèi)</p><p> 繼承自JPanel.上邊安放預(yù)顯窗口、等級(jí)、得分、控制按鈕。主要用來(lái)控制游戲進(jìn)程。</p><p><b> 2.1.2、塊類(lèi)</b></p><p> 繼承自線程類(lèi)(Thread)由 4 * 4 個(gè)方格(ErsBox
11、)構(gòu)成一個(gè)塊,控制塊的移動(dòng)、下落、變形等。</p><p> 2.1.3、游戲主類(lèi)</p><p> 繼承自JFrame類(lèi),負(fù)責(zé)游戲的全局控制。</p><p> 內(nèi)含: 一個(gè)GameCanvas畫(huà)布類(lèi)的實(shí)例引用;一個(gè)保存當(dāng)前活動(dòng)塊(ErsBlock)實(shí)例的引用; 一個(gè)保存當(dāng)前控制面板(ControlPanel)實(shí)例的引用。</p><p&
12、gt;<b> 2.1.4、方格類(lèi)</b></p><p> 是組成塊的基本元素,用自己的顏色來(lái)表示塊的外觀。</p><p><b> 2.1.5、畫(huà)布類(lèi)</b></p><p> 內(nèi)有<行數(shù)> *<列數(shù)>個(gè)方格類(lèi)實(shí)例。繼承自JPanel類(lèi)。 ErsBlock線程類(lèi)動(dòng)態(tài)改變畫(huà)布類(lèi)的方格顏色
13、,畫(huà)布類(lèi)通過(guò) 檢查方格顏</p><p> 色來(lái)體現(xiàn)ErsBlock塊的移動(dòng)情況。</p><p><b> 2.2、詳細(xì)設(shè)計(jì)</b></p><p> 2.2.1、游戲控制</p><p> 一輪游戲過(guò)程,實(shí)現(xiàn)了Runnable接口。一輪游戲是一個(gè)大循環(huán),在這個(gè)循環(huán)中,每隔100毫秒,檢查游戲中的當(dāng)前塊是否已經(jīng)
14、到底了,如果沒(méi)有,就繼續(xù)等待。如果到底了,就看有沒(méi)有全填滿的行,如果有就刪除它,并為游戲者加分,同時(shí)隨機(jī)產(chǎn)生一個(gè),新的當(dāng)前塊,讓它自動(dòng)下落。當(dāng)新產(chǎn)生一個(gè)塊時(shí),先檢查畫(huà)布最頂上的一行是否已經(jīng)被占了,如果是,可以判斷Game Over了。</p><p><b> 代碼示例:</b></p><p> private class Game implements Run
15、nable {</p><p> public void run() {</p><p> int col = (int) (Math.random() * (canvas.getCols() - 3)),</p><p> style = ErsBlock.STYLES[(int) (Math.random() * 7)][(int) (Math.rando
16、m() * 4)];</p><p> while (playing) {</p><p> if (block != null) { //第一次循環(huán)時(shí),block為空</p><p> if (block.isAlive()) {</p><p><b> try {</b></p><
17、;p> Thread.currentThread().sleep(100);</p><p> } catch (InterruptedException ie) {</p><p> ie.printStackTrace();</p><p><b> }</b></p><p><b> c
18、ontinue;</b></p><p><b> }</b></p><p><b> }</b></p><p> checkFullLine(); //檢查是否有全填滿的行</p><p> if (isGameOver()) { //檢查游戲是否應(yīng)該
19、結(jié)束了</p><p> miPlay.setEnabled(true);</p><p> miPause.setEnabled(true);</p><p> miResume.setEnabled(false);</p><p> ctrlPanel.setPlayButtonEnable(true);</p>&
20、lt;p> ctrlPanel.setPauseButtonLabel(true);</p><p> reportGameOver();</p><p><b> return;</b></p><p><b> }</b></p><p> block = new ErsBloc
21、k(style, -1, col, getLevel(), canvas);</p><p> block.start();</p><p> col = (int) (Math.random() * (canvas.getCols() - 3));</p><p> style = ErsBlock.STYLES[(int) (Math.random() *
22、 7)][(int) (Math.random() * 4)];</p><p> ctrlPanel.setTipStyle(style);</p><p><b> }</b></p><p><b> }</b></p><p> 2.2.2、方塊設(shè)計(jì)</p><p
23、> 構(gòu)造函數(shù),產(chǎn)生一個(gè)特定的塊style 塊的樣式,對(duì)應(yīng)STYLES的28個(gè)值中的一個(gè)y 起始位置,左上角在canvas中的坐標(biāo)行x 起始位置,左上角在canvas中的坐標(biāo)列l(wèi)evel 游戲等級(jí),控制塊的下落速度。canvas 畫(huà)板</p><p><b> 代碼:</b></p><p> public ErsBlock(int style, int y
24、, int x, int level, GameCanvas canvas) {</p><p> this.style = style;</p><p> this.y = y;</p><p> this.x = x;</p><p> this.level = level;</p><p> this.
25、canvas = canvas;</p><p> int key = 0x8000;</p><p> for (int i = 0; i < boxes.length; i++) {</p><p> for (int j = 0; j < boxes[i].length; j++) {</p><p> boolea
26、n isColor = ((style & key) != 0);</p><p> boxes[i][j] = new ErsBox(isColor);</p><p> key >>= 1;</p><p><b> }</b></p><p><b> }</b>&
27、lt;/p><p> display();</p><p><b> }</b></p><p> 2.2.3、畫(huà)布設(shè)計(jì)</p><p> 包括顯示方塊、積分;取得游戲成績(jī)、控制積分的疊加、清零;游戲升級(jí)積分的變化等。</p><p><b> 代碼:</b></
28、p><p><b> /**</b></p><p> * 取得自上一次升級(jí)后的積分</p><p> * @return int, 上一次升級(jí)后的積分</p><p><b> */</b></p><p> public int getScoreForLevelUp
29、date() {</p><p> return scoreForLevelUpdate;</p><p><b> }</b></p><p><b> /**</b></p><p> * 升級(jí)后,將上一次升級(jí)以來(lái)的積分清0</p><p><b>
30、*/</b></p><p> public void resetScoreForLevelUpdate() {</p><p> scoreForLevelUpdate -= ErsBlocksGame.PER_LEVEL_SCORE;</p><p><b> }</b></p><p><b
31、> /**</b></p><p> * 得到某一行某一列的方格引用。</p><p> * @param row int, 要引用的方格所在的行</p><p> * @param col int, 要引用的方格所在的列</p><p> * @return ErsBox, 在row行col列的方格的引用<
32、/p><p><b> */</b></p><p> public ErsBox getBox(int row, int col) {</p><p> if (row < 0 || row > boxes.length - 1</p><p> || col < 0 || col > bo
33、xes[0].length - 1)</p><p> return null;</p><p> return (boxes[row][col]);</p><p><b> }</b></p><p><b> /**</b></p><p> * 覆蓋JCom
34、ponent類(lèi)的函數(shù),畫(huà)組件。</p><p> * @param g 圖形設(shè)備環(huán)境</p><p><b> */</b></p><p> public void paintComponent(Graphics g) {</p><p> super.paintComponent(g);</p>
35、<p> g.setColor(frontColor);</p><p> for (int i = 0; i < boxes.length; i++) {</p><p> for (int j = 0; j < boxes[i].length; j++) {</p><p> g.setColor(boxes[i][j].isCo
36、lorBox() ? frontColor : backColor);</p><p> g.fill3DRect(j * boxWidth, i * boxHeight,</p><p> boxWidth, boxHeight, true);</p><p><b> }</b></p><p><b&g
37、t; }</b></p><p><b> }</b></p><p><b> /*</b></p><p> * 根據(jù)窗口的大小,自動(dòng)調(diào)整方格的尺寸</p><p><b> */</b></p><p> public vo
38、id fanning() {</p><p> boxWidth = getSize().width / cols;</p><p> boxHeight = getSize().height / rows;</p><p><b> }</b></p><p><b> /**</b>&l
39、t;/p><p> * 當(dāng)一行被游戲者疊滿后,將此行清除,并為游戲者加分</p><p> * @param row int, 要清除的行,是由ErsBoxesGame類(lèi)計(jì)算的</p><p><b> */</b></p><p> public synchronized void removeLine(int r
40、ow) {</p><p> for (int i = row; i > 0; i--) {</p><p> for (int j = 0; j < cols; j++)</p><p> boxes[i][j] = (ErsBox) boxes[i - 1][j].clone();</p><p><b>
41、}</b></p><p> score += ErsBlocksGame.PER_LINE_SCORE;</p><p> scoreForLevelUpdate += ErsBlocksGame.PER_LINE_SCORE;</p><p> repaint();</p><p><b> }</b&
42、gt;</p><p><b> /**</b></p><p> * 重置畫(huà)布,置積分為0</p><p><b> */</b></p><p> public void reset() {</p><p> score = 0;</p><
43、p> scoreForLevelUpdate = 0;</p><p> for (int i = 0; i < boxes.length; i++) {</p><p> for (int j = 0; j < boxes[i].length; j++)</p><p> boxes[i][j].setColor(false);</
44、p><p><b> }</b></p><p> repaint();</p><p><b> }</b></p><p><b> }</b></p><p><b> 3、運(yùn)行結(jié)果</b></p><
45、;p><b> 3.1、初始</b></p><p> 3.2、游戲設(shè)置界面:</p><p> 3.3、游戲進(jìn)行中的界面:</p><p> 3.4、游戲結(jié)束界面:</p><p><b> 4、心得體會(huì)</b></p><p> 通過(guò)對(duì)俄羅斯方塊游戲的編
46、寫(xiě),加深了對(duì)java多線程的理解。體驗(yàn)到了將理論應(yīng)用到實(shí)踐中的快樂(lè)。在編程過(guò)程中遇到了許多困難,通過(guò)老師、同學(xué)的幫助已經(jīng)書(shū)籍的查閱和上網(wǎng)查資料,基本上都得到了解決。通過(guò)這次的課程設(shè)計(jì),使我們對(duì)JAVA面向?qū)ο蟮木幊逃辛松钜徊降牧私?。同時(shí)也發(fā)現(xiàn)了自己的許多不足之處,從此以后要更加認(rèn)真的學(xué)習(xí)各種知識(shí),不斷完善、提高自己的水平,才能得到真正的提高。</p><p><b> 5、參考文獻(xiàn):</b>
47、;</p><p> 《Java語(yǔ)言程序設(shè)計(jì)》-------------徐保民 陳旭東 李春艷</p><p> 《Java大學(xué)實(shí)用教程》-------------耿祥義 張躍平</p><p> 《Java程序設(shè)計(jì)實(shí)用教程》--------錢(qián)慎一</p><p> 6、附錄:游戲主類(lèi)代碼</p><p>
48、package Block;</p><p> import javax.swing.*;</p><p> import java.awt.*;</p><p> import java.awt.event.*;</p><p><b> /**</b></p><p> * 游戲主類(lèi)
49、,繼承自JFrame類(lèi),負(fù)責(zé)游戲的全局控制。</p><p><b> * 內(nèi)含</b></p><p> * 1, 一個(gè)GameCanvas畫(huà)布類(lèi)的實(shí)例引用,</p><p> * 2, 一個(gè)保存當(dāng)前活動(dòng)塊(ErsBlock)實(shí)例的引用,</p><p> * 3, 一個(gè)保存當(dāng)前控制面板(ControlPane
50、l)實(shí)例的引用;</p><p><b> */</b></p><p> public class ErsBlocksGame extends JFrame {</p><p> private static final long serialVersionUID = 1L; </p><p><b>
51、 /**</b></p><p> * 每填滿一行計(jì)多少分</p><p><b> */</b></p><p> public final static int PER_LINE_SCORE = 100;</p><p><b> /**</b></p>&
52、lt;p> * 積多少分以后能升級(jí)</p><p><b> */</b></p><p> public final static int PER_LEVEL_SCORE = PER_LINE_SCORE * 20;</p><p><b> /**</b></p><p> *
53、最大級(jí)數(shù)是10級(jí)</p><p><b> */</b></p><p> public final static int MAX_LEVEL = 10;</p><p><b> /**</b></p><p><b> * 默認(rèn)級(jí)數(shù)是5</b></p>
54、<p><b> */</b></p><p> public final static int DEFAULT_LEVEL = 5;</p><p> private GameCanvas canvas;</p><p> private ErsBlock block;</p><p> priv
55、ate boolean playing = false;</p><p> private ControlPanel ctrlPanel;</p><p> private JMenuBar bar = new JMenuBar();</p><p> private JMenu</p><p> mGame = new JMenu(
56、"游戲"),</p><p> mControl = new JMenu("控制"),</p><p> mWindowStyle = new JMenu("界面風(fēng)格"),</p><p> mInfo = new JMenu("關(guān)于");</p><p>
57、 private JMenuItem</p><p> miNewGame = new JMenuItem("新游戲"),</p><p> miSetBlockColor = new JMenuItem("設(shè)置方塊顏色"),</p><p> miSetBackColor = new JMenuItem("
58、設(shè)置背景顏色"),</p><p> miTurnHarder = new JMenuItem("增加難度級(jí)別"),</p><p> miTurnEasier = new JMenuItem("減小難度級(jí)別"),</p><p> miExit = new JMenuItem("退出"),
59、</p><p> miPlay = new JMenuItem("開(kāi)始"),</p><p> miPause = new JMenuItem("暫停"),</p><p> miResume = new JMenuItem("恢復(fù)"),</p><p> miStop =
60、 new JMenuItem("停止"),</p><p> miAuthor = new JMenuItem("作者: 2009081314 quyan "),</p><p> miSourceInfo = new JMenuItem("2012 課程設(shè)計(jì)。");</p><p> private
61、 JCheckBoxMenuItem</p><p> miAsWindows = new JCheckBoxMenuItem("Windows"),</p><p> miAsMotif = new JCheckBoxMenuItem("Motif"),</p><p> miAsMetal = new JCheckB
62、oxMenuItem("Metal", true);</p><p><b> /**</b></p><p> * 主游戲類(lèi)的構(gòu)造函數(shù)</p><p> * @param title String,窗口標(biāo)題</p><p><b> */</b></p>
63、<p> public ErsBlocksGame(String title) {</p><p> super(title);</p><p> setSize(315, 392);</p><p> Dimension scrSize = Toolkit.getDefaultToolkit().getScreenSize();</p>
64、;<p> setLocation((scrSize.width - getSize().width) / 2,</p><p> (scrSize.height - getSize().height) / 2);</p><p> createMenu();</p><p> Container container = getContentP
65、ane();</p><p> container.setLayout(new BorderLayout(6, 0));</p><p> canvas = new GameCanvas(20, 12);</p><p> ctrlPanel = new ControlPanel(this);</p><p> container.a
66、dd(canvas, BorderLayout.CENTER);</p><p> container.add(ctrlPanel, BorderLayout.EAST);</p><p> addWindowListener(new WindowAdapter() {</p><p> public void windowClosing(WindowEven
67、t we) {</p><p> stopGame();</p><p> System.exit(0);</p><p><b> }</b></p><p><b> });</b></p><p> addComponentListener(new Compo
68、nentAdapter() {</p><p> public void componentResized(ComponentEvent ce) {</p><p> canvas.fanning();</p><p><b> }</b></p><p><b> });</b></
69、p><p><b> show(); </b></p><p> canvas.fanning();</p><p><b> }</b></p><p><b> /**</b></p><p><b> * 讓游戲“復(fù)位”</
70、b></p><p><b> */</b></p><p> public void reset() {</p><p> ctrlPanel.reset();</p><p> canvas.reset();</p><p><b> }</b></
71、p><p><b> /**</b></p><p> * 判斷游戲是否還在進(jìn)行</p><p> * @return boolean, true-還在運(yùn)行,false-已經(jīng)停止</p><p><b> */</b></p><p> public boolean i
72、sPlaying() {</p><p> return playing;</p><p><b> }</b></p><p><b> /**</b></p><p> * 得到當(dāng)前活動(dòng)的塊</p><p> * @return ErsBlock, 當(dāng)前活動(dòng)塊的
73、引用</p><p><b> */</b></p><p> public ErsBlock getCurBlock() {</p><p> return block;</p><p><b> }</b></p><p><b> /**</b
74、></p><p><b> * 得到當(dāng)前畫(huà)布</b></p><p> * @return GameCanvas, 當(dāng)前畫(huà)布的引用</p><p><b> */</b></p><p> public GameCanvas getCanvas() {</p><
75、p> return canvas;</p><p><b> }</b></p><p><b> /**</b></p><p><b> * 開(kāi)始游戲</b></p><p><b> */</b></p><p&g
76、t; public void playGame() {</p><p><b> play();</b></p><p> ctrlPanel.setPlayButtonEnable(false);</p><p> miPlay.setEnabled(false);</p><p> ctrlPanel.re
77、questFocus();</p><p><b> }</b></p><p><b> /**</b></p><p><b> * 游戲暫停</b></p><p><b> */</b></p><p> publ
78、ic void pauseGame() {</p><p> if (block != null) block.pauseMove();</p><p> ctrlPanel.setPauseButtonLabel(false);</p><p> miPause.setEnabled(false);</p><p> miResum
79、e.setEnabled(true);</p><p><b> }</b></p><p><b> /**</b></p><p> * 讓暫停中的游戲繼續(xù)</p><p><b> */</b></p><p> public void
80、resumeGame() {</p><p> if (block != null) block.resumeMove();</p><p> ctrlPanel.setPauseButtonLabel(true);</p><p> miPause.setEnabled(true);</p><p> miResume.setEna
81、bled(false);</p><p> ctrlPanel.requestFocus();</p><p><b> }</b></p><p><b> /**</b></p><p><b> * 用戶停止游戲</b></p><p>&
82、lt;b> */</b></p><p> public void stopGame() {</p><p> playing = false;</p><p> if (block != null) block.stopMove();</p><p> miPlay.setEnabled(true);</p
83、><p> miPause.setEnabled(true);</p><p> miResume.setEnabled(false);</p><p> ctrlPanel.setPlayButtonEnable(true);</p><p> ctrlPanel.setPauseButtonLabel(true);</p>
84、<p><b> }</b></p><p><b> /**</b></p><p> * 得到當(dāng)前游戲者設(shè)置的游戲難度</p><p> * @return int, 游戲難度1-MAX_LEVEL</p><p><b> */</b></p
85、><p> public int getLevel() {</p><p> return ctrlPanel.getLevel();</p><p><b> }</b></p><p><b> /**</b></p><p> * 讓用戶設(shè)置游戲難度</p&
86、gt;<p> * @param level int, 游戲難度1-MAX_LEVEL</p><p><b> */</b></p><p> public void setLevel(int level) {</p><p> if (level < 11 && level > 0) ctr
87、lPanel.setLevel(level);</p><p><b> }</b></p><p><b> /**</b></p><p><b> * 得到游戲積分</b></p><p> * @return int, 積分。</p><p&
88、gt;<b> */</b></p><p> public int getScore() {</p><p> if (canvas != null) return canvas.getScore();</p><p><b> return 0;</b></p><p><b>
89、; }</b></p><p><b> /**</b></p><p> * 得到自上次升級(jí)以來(lái)的游戲積分,升級(jí)以后,此積分清零</p><p> * @return int, 積分。</p><p><b> */</b></p><p> pub
90、lic int getScoreForLevelUpdate() {</p><p> if (canvas != null) return canvas.getScoreForLevelUpdate();</p><p><b> return 0;</b></p><p><b> }</b></p>
91、<p><b> /**</b></p><p> * 當(dāng)分?jǐn)?shù)累計(jì)到一定的數(shù)量時(shí),升一次級(jí)</p><p> * @return boolean, ture-update successufl, false-update fail</p><p><b> */</b></p><
92、p> public boolean levelUpdate() {</p><p> int curLevel = getLevel();</p><p> if (curLevel < MAX_LEVEL) {</p><p> setLevel(curLevel + 1);</p><p> canvas.reset
93、ScoreForLevelUpdate();</p><p> return true;</p><p><b> }</b></p><p> return false;</p><p><b> }</b></p><p><b> /**</b
94、></p><p><b> * 游戲開(kāi)始</b></p><p><b> */</b></p><p> private void play() {</p><p><b> reset();</b></p><p> playing
95、 = true;</p><p> Thread thread = new Thread(new Game());</p><p> thread.start();</p><p><b> }</b></p><p><b> /**</b></p><p><
96、;b> * 報(bào)告游戲結(jié)束了</b></p><p><b> */</b></p><p> private void reportGameOver() {</p><p> JOptionPane.showMessageDialog(this, "Game Over!");</p>
97、<p><b> }</b></p><p><b> /**</b></p><p> * 建立并設(shè)置窗口菜單</p><p><b> */</b></p><p> private void createMenu() {</p><
98、p> bar.add(mGame);</p><p> bar.add(mControl);</p><p> bar.add(mWindowStyle);</p><p> bar.add(mInfo);</p><p> mGame.add(miNewGame);</p><p> mGame.a
99、ddSeparator();</p><p> mGame.add(miSetBlockColor);</p><p> mGame.add(miSetBackColor);</p><p> mGame.addSeparator();</p><p> mGame.add(miTurnHarder);</p><
100、p> mGame.add(miTurnEasier);</p><p> mGame.addSeparator();</p><p> mGame.add(miExit);</p><p> mControl.add(miPlay);</p><p> mControl.add(miPause);</p><
101、;p> mControl.add(miResume);</p><p> mControl.add(miStop);</p><p> mWindowStyle.add(miAsWindows);</p><p> mWindowStyle.add(miAsMotif);</p><p> mWindowStyle.add(m
102、iAsMetal);</p><p> mInfo.add(miAuthor);</p><p> mInfo.add(miSourceInfo);</p><p> setJMenuBar(bar);</p><p> miPause.setAccelerator(</p><p> KeyStroke.g
103、etKeyStroke(KeyEvent.VK_P, KeyEvent.CTRL_MASK));</p><p> miResume.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0));</p><p> miNewGame.addActionListener(new ActionListener() {</p
104、><p> public void actionPerformed(ActionEvent ae) {</p><p> stopGame();</p><p><b> reset();</b></p><p> setLevel(DEFAULT_LEVEL);</p><p><b&
105、gt; }</b></p><p><b> });</b></p><p> miSetBlockColor.addActionListener(new ActionListener() {</p><p> public void actionPerformed(ActionEvent ae) {</p>
106、<p> Color newFrontColor =</p><p> JColorChooser.showDialog(ErsBlocksGame.this,</p><p> "Set color for block", canvas.getBlockColor());</p><p> if (newFrontColor
107、!= null)</p><p> canvas.setBlockColor(newFrontColor);</p><p><b> }</b></p><p><b> });</b></p><p> miSetBackColor.addActionListener(new Actio
108、nListener() {</p><p> public void actionPerformed(ActionEvent ae) {</p><p> Color newBackColor =</p><p> JColorChooser.showDialog(ErsBlocksGame.this,</p><p> "
109、Set color for block", canvas.getBackgroundColor());</p><p> if (newBackColor != null)</p><p> canvas.setBackgroundColor(newBackColor);</p><p><b> }</b></p>
110、<p><b> });</b></p><p> miTurnHarder.addActionListener(new ActionListener() {</p><p> public void actionPerformed(ActionEvent ae) {</p><p> int curLevel = get
111、Level();</p><p> if (curLevel < MAX_LEVEL) setLevel(curLevel + 1);</p><p><b> }</b></p><p><b> });</b></p><p> miTurnEasier.addActionList
112、ener(new ActionListener() {</p><p> public void actionPerformed(ActionEvent ae) {</p><p> int curLevel = getLevel();</p><p> if (curLevel > 1) setLevel(curLevel - 1);</p>
113、;<p><b> }</b></p><p><b> });</b></p><p> miExit.addActionListener(new ActionListener() {</p><p> public void actionPerformed(ActionEvent ae) {<
114、;/p><p> System.exit(0);</p><p><b> }</b></p><p><b> });</b></p><p> miPlay.addActionListener(new ActionListener() {</p><p> publ
115、ic void actionPerformed(ActionEvent ae) {</p><p> playGame();</p><p><b> }</b></p><p><b> });</b></p><p> miPause.addActionListener(new Acti
116、onListener() {</p><p> public void actionPerformed(ActionEvent ae) {</p><p> pauseGame();</p><p><b> }</b></p><p><b> });</b></p><
117、;p> miResume.addActionListener(new ActionListener() {</p><p> public void actionPerformed(ActionEvent ae) {</p><p> resumeGame();</p><p><b> }</b></p><
118、p><b> });</b></p><p> miStop.addActionListener(new ActionListener() {</p><p> public void actionPerformed(ActionEvent ae) {</p><p> stopGame();</p><p&g
119、t;<b> }</b></p><p><b> });</b></p><p> miAsWindows.addActionListener(new ActionListener() {</p><p> public void actionPerformed(ActionEvent ae) {</p&g
120、t;<p> String plaf = "com.sun.java.swing.plaf.windows.WindowsLookAndFeel";</p><p> setWindowStyle(plaf);</p><p> canvas.fanning();</p><p> ctrlPanel.fanning();&
121、lt;/p><p> miAsWindows.setState(true);</p><p> miAsMetal.setState(false);</p><p> miAsMotif.setState(false);</p><p><b> }</b></p><p><b>
122、 });</b></p><p> miAsMotif.addActionListener(new ActionListener() {</p><p> public void actionPerformed(ActionEvent ae) {</p><p> String plaf = "com.sun.java.swing.pl
123、af.motif.MotifLookAndFeel";</p><p> setWindowStyle(plaf);</p><p> canvas.fanning();</p><p> ctrlPanel.fanning();</p><p> miAsWindows.setState(false);</p>
124、<p> miAsMetal.setState(false);</p><p> miAsMotif.setState(true);</p><p><b> }</b></p><p><b> });</b></p><p> miAsMetal.addActionLis
125、tener(new ActionListener() {</p><p> public void actionPerformed(ActionEvent ae) {</p><p> String plaf = "javax.swing.plaf.metal.MetalLookAndFeel";</p><p> setWindowSty
126、le(plaf);</p><p> canvas.fanning();</p><p> ctrlPanel.fanning();</p><p> miAsWindows.setState(false);</p><p> miAsMetal.setState(true);</p><p> miAsMo
127、tif.setState(false);</p><p><b> }</b></p><p><b> });</b></p><p><b> }</b></p><p><b> /**</b></p><p> *
128、 根據(jù)字串設(shè)置窗口外觀</p><p> * @param plaf String, 窗口外觀的描述</p><p><b> */</b></p><p> private void setWindowStyle(String plaf) {</p><p><b> try {</b>&
129、lt;/p><p> UIManager.setLookAndFeel(plaf);</p><p> SwingUtilities.updateComponentTreeUI(this);</p><p> } catch (Exception e) {</p><p><b> }</b></p>
130、<p><b> }</b></p><p> private class Game implements Runnable {</p><p> public void run() {</p><p> int col = (int) (Math.random() * (canvas.getCols() - 3)),<
131、/p><p> style = ErsBlock.STYLES[(int) (Math.random() * 7)][(int) (Math.random() * 4)];</p><p> while (playing) {</p><p> if (block != null) { //第一次循環(huán)時(shí),block為空</p><p>
132、; if (block.isAlive()) {</p><p><b> try {</b></p><p> Thread.currentThread().sleep(100);</p><p> } catch (InterruptedException ie) {</p><p> ie.printSt
133、ackTrace();</p><p><b> }</b></p><p><b> continue;</b></p><p><b> }</b></p><p><b> }</b></p><p> checkF
134、ullLine(); //檢查是否有全填滿的行</p><p> if (isGameOver()) { //檢查游戲是否應(yīng)該結(jié)束了</p><p> miPlay.setEnabled(true);</p><p> miPause.setEnabled(true);</p><p> miResume.set
135、Enabled(false);</p><p> ctrlPanel.setPlayButtonEnable(true);</p><p> ctrlPanel.setPauseButtonLabel(true);</p><p> reportGameOver();</p><p><b> return;</b&g
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- java課程設(shè)計(jì)--俄羅斯方塊游戲
- java課程設(shè)計(jì)---俄羅斯方塊游戲
- java課程設(shè)計(jì)---俄羅斯方塊游戲
- 俄羅斯方塊課程設(shè)計(jì)報(bào)告
- 《c++俄羅斯方塊》課程設(shè)計(jì)--俄羅斯方塊
- 俄羅斯方塊課程設(shè)計(jì)報(bào)告
- 俄羅斯方塊課程設(shè)計(jì)
- 俄羅斯方塊課程設(shè)計(jì)
- 課程設(shè)計(jì)---俄羅斯方塊
- 俄羅斯方塊課程設(shè)計(jì)
- 俄羅斯方塊課程設(shè)計(jì)
- 課程設(shè)計(jì)--俄羅斯方塊設(shè)計(jì)報(bào)告
- 俄羅斯方塊課程設(shè)計(jì)
- 俄羅斯方塊課程設(shè)計(jì)
- 俄羅斯方塊課程設(shè)計(jì)
- 俄羅斯方塊編程課程設(shè)計(jì)報(bào)告
- java課程設(shè)計(jì)報(bào)告-俄羅斯方塊
- c課程設(shè)計(jì)--俄羅斯方塊
- 簡(jiǎn)單俄羅斯方塊課程設(shè)計(jì)
- java俄羅斯方塊課程設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論