版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p> Java 課 程 設(shè) 計(jì)</p><p><b> 題目:俄羅斯方塊</b></p><p><b> 目錄</b></p><p> 一. 需求分析.......................................................2</p><p
2、> 1.1開發(fā)背景...................................................... 2</p><p> 1.2設(shè)計(jì)目的...................................................... 2</p><p> 1.3功能需求...................................
3、................... 2</p><p> 1.4開發(fā)環(huán)境............................................... ...... 2</p><p> 二.軟件概要設(shè)計(jì).................................................... 3</p><p> 2.1
4、設(shè)計(jì)思想..................................................... 3</p><p> 2.2 系統(tǒng)架構(gòu)......................................................3</p><p> 2.3 模塊劃分..........................................
5、............3</p><p> 三.詳細(xì)設(shè)計(jì).........................................................4</p><p> 3.1 事件處理.......................................................4</p><p> 3.2 界面設(shè)計(jì).
6、...................................... ..............4</p><p> 3.3 系統(tǒng)流程.................................... .................4</p><p> 3.4 游戲畫布類..............................................
7、......5</p><p> 3.5 方塊類........................................................9</p><p> 3.6 方塊的消除....................................................8</p><p> 四.軟件運(yùn)行測(cè)試........
8、.............................................10</p><p> 五.課程設(shè)計(jì)總結(jié)及心得體會(huì).......................................... 12</p><p> 六.參考文獻(xiàn)... .....................................................12<
9、/p><p> 附錄:重要代碼.............................. ........................13</p><p><b> 一.需求分析</b></p><p><b> 1.1開發(fā)背景</b></p><p> Java是現(xiàn)在全球最時(shí)髦的開發(fā)工具
10、之一,它擁有一套龐大且完善的類庫(kù),內(nèi)置了其他語(yǔ)言需要靠庫(kù)甚至是操作系統(tǒng)才能支持的功能。Java的產(chǎn)生與流行是InterNet發(fā)展的客觀要求。如今越來越多的應(yīng)用程序是于Java開發(fā)的,用Java開發(fā)的應(yīng)用程序可在任何計(jì)算平臺(tái)上安全地運(yùn)行。Java作為一個(gè)分布式的,面向?qū)ο蟮某绦蛟O(shè)計(jì)方法,可以讓位于任何地方的任何計(jì)算機(jī)使用網(wǎng)絡(luò)上的的應(yīng)用程序??梢哉fJava是一個(gè)萬(wàn)能的開發(fā)平臺(tái),用Java編程已經(jīng)成為一種趨勢(shì)。</p><
11、p><b> 1.2設(shè)計(jì)目的</b></p><p> 通過本次課程設(shè)計(jì)了解和掌握J(rèn)DK開發(fā)環(huán)境以及Eclipse等集成開發(fā)環(huán)境,鞏固所學(xué)的Java知識(shí)及其編程機(jī)制。了解JAVA程序開發(fā)流程,學(xué)會(huì)構(gòu)思比較復(fù)雜的課題的設(shè)計(jì)思想;,能合理的利用本學(xué)期所掌握的多線程、類、GUI等知識(shí)編寫一個(gè)較為復(fù)雜的Java應(yīng)用軟件。掌握面向?qū)ο蟪绦蛟O(shè)計(jì)的有關(guān)概念和開發(fā)方法,鍛煉大家團(tuán)隊(duì)合作開發(fā)精神。&
12、lt;/p><p><b> 1.3功能需求</b></p><p> 本課程設(shè)計(jì)的目標(biāo)是設(shè)計(jì)一個(gè)名為《俄羅斯方塊》的游戲軟件,實(shí)現(xiàn)其界面初始化,程序運(yùn)行,退出,和相應(yīng)數(shù)據(jù)處理。能實(shí)現(xiàn)游戲的基本功能,類似下落、轉(zhuǎn)向、平移、得分累加和計(jì)數(shù)等,并在規(guī)定的時(shí)間內(nèi)達(dá)到課題所需要實(shí)現(xiàn)的功能及要求。</p><p><b> 1.4開發(fā)環(huán)境&l
13、t;/b></p><p> 操作系統(tǒng):Microsoft Windows XP</p><p> 程序語(yǔ)言:Java </p><p> 開 發(fā) 包:Java(TM) 2 Standard Edition (5.0)</p><p> Sun Micro. J2ME Wireless Tool Kit 2.2</p&
14、gt;<p> IDE: Eclipse 3.41</p><p><b> 二 .軟件概要設(shè)計(jì)</b></p><p><b> 2.1設(shè)計(jì)思想</b></p><p> 1).使用Jpanel框架,并添加按鈕、文本框等對(duì)象,用布局管理器定義各個(gè)對(duì)象的分布。</p><p&
15、gt; 2).設(shè)計(jì)一個(gè)二維數(shù)組來表示方塊,默認(rèn)為不顯示,游戲過程中通過SetVisible來顯示方塊。</p><p> 3).設(shè)計(jì)一個(gè)設(shè)計(jì)定時(shí)線程來控制方塊下落速度。</p><p> 4).設(shè)計(jì)七種形狀的防快,每種形狀定義四種形態(tài)來實(shí)現(xiàn)方塊變換。</p><p> 5).每個(gè)方塊落到底后判斷能否消層和游戲是否結(jié)束。</p><p>
16、;<b> 2.2系統(tǒng)架構(gòu)</b></p><p> 主要包含方塊類,游戲畫布類,處理控制類,定時(shí)線程,模塊構(gòu)造,頁(yè)面布局</p><p><b> 2.3 模塊化分</b></p><p> 根據(jù)需求分析要實(shí)現(xiàn)的系統(tǒng)功能,可以得出系統(tǒng)的模塊圖:</p><p><b> 三.詳
17、細(xì)設(shè)計(jì)</b></p><p><b> 3.1事件處理</b></p><p> 在frame框架中設(shè)置各種對(duì)象,使用addActionListener添加監(jiān)聽。例如:gameScr.addKeyListener(gameScr);然后使用public void actionPerformed(ActionEvent e)和public void m
18、ouseClicked(MouseEvent e)實(shí)現(xiàn)按鈕和鼠標(biāo)點(diǎn)擊事件。</p><p><b> 3.2界面設(shè)計(jì)</b></p><p><b> 游戲基本界面圖</b></p><p><b> 3.3系統(tǒng)流程</b></p><p><b> 游戲畫面
19、流程圖</b></p><p><b> 游戲算法流程圖</b></p><p><b> 3.4 游戲畫布類</b></p><p> 游戲畫布類,繼承自Canvas類,游戲的主要代碼,用于實(shí)現(xiàn)方塊在畫布上顯示</p><p> class GameCanvas extends
20、 Canvas implements KeyListener { </p><p> final int unitSize = 25; // 小方塊邊長(zhǎng) </p><p> int rowNum; // 正方格的行數(shù) </p><p> int columnNum; // 正方格的列數(shù) </p><p> int ma
21、xAllowRowNum; // 允許有多少行未消 </p><p> int blockInitRow; // 新出現(xiàn)塊的起始行坐標(biāo) </p><p> int blockInitCol; // 新出現(xiàn)塊的起始列坐標(biāo) </p><p> int[][] scrArr; // 屏幕數(shù)組 </p><p> Block b
22、; // 對(duì)方快的引用 </p><p> GameCanvas() { </p><p> rowNum = 18; </p><p> columnNum = 12; </p><p> maxAllowRowNum = rowNum - 2; </p><p> b = new Blo
23、ck(this); </p><p> blockInitRow = rowNum - 1; </p><p> blockInitCol = columnNum / 2 - 2; </p><p> scrArr = new int[32][32]; </p><p><b> } </b>
24、</p><p> // 初始化屏幕,并將屏幕數(shù)組清零的方法 </p><p> void initScr() { </p><p> for (int i = 0; i < rowNum; i++) </p><p> for (int j = 0; j < columnNum; j++) </p&
25、gt;<p> scrArr[i][j] = 0; </p><p> b.reset(); </p><p> repaint(); </p><p><b> } </b></p><p> // 重新刷新畫布方法 </p><p> public
26、 void paint(Graphics g) { </p><p> for (int i = 0; i < rowNum; i++) </p><p> for (int j = 0; j < columnNum; j++) </p><p> drawUnit(i, j, scrArr[i][j]); </p>
27、<p><b> } </b></p><p> // 畫方塊的方法 </p><p> public void drawUnit(int row, int col, int type) { </p><p> scrArr[row][col] = type; </p><p> Gr
28、aphics g = getGraphics(); </p><p> switch (type) { // 表示畫方快的方法 </p><p> case 0: </p><p> g.setColor(Color.black); </p><p> break; // 以背景為顏色畫 </p>&
29、lt;p> case 1: </p><p> g.setColor(Color.green); </p><p> break; // 畫正在下落的方塊 </p><p> case 2: </p><p> g.setColor(Color.gray); </p><p> b
30、reak; // 畫已經(jīng)落下的方法 </p><p><b> } </b></p><p> g.fill3DRect(col * unitSize, getSize().height - (row + 1) * unitSize, </p><p> unitSize, unitSize, true); </p&
31、gt;<p> g.dispose(); </p><p><b> } </b></p><p><b> } </b></p><p><b> }</b></p><p><b> 3.5方塊類</b></
32、p><p> 方塊類,定義了七種形狀的方塊,每種形狀有四種狀態(tài),實(shí)現(xiàn)用鍵盤控制方塊的下落,移動(dòng),轉(zhuǎn)換形狀等</p><p> class Block { </p><p> static int[][] pattern = { </p><p> { 0x0f00, 0x4444, 0x0f00, 0x4444 },//本行表示長(zhǎng)
33、條四種狀態(tài) </p><p> { 0x04e0, 0x0464, 0x00e4, 0x04c4 }, </p><p> { 0x4620, 0x6c00, 0x4620, 0x6c00 }, </p><p> { 0x2640, 0xc600, 0x2640, 0xc600 }, </p><p> { 0x62
34、20, 0x1700, 0x2230, 0x0740 }, </p><p> { 0x6440, 0x0e20, 0x44c0, 0x8e00 }, </p><p> { 0x0660, 0x0660, 0x0660, 0x0660 } }; </p><p> int blockType; </p><p> i
35、nt turnState; </p><p> int blockState; </p><p> int row, col; </p><p> GameCanvas scr; </p><p> Block(GameCanvas scr) { </p><p> this.scr = scr
36、; </p><p> blockType = (int) (Math.random() * 1000) % 7; </p><p> turnState = (int) (Math.random() * 1000) % 4; </p><p> blockState = 1; </p><p> row = scr.
37、getInitRow(); </p><p> col = scr.getInitCol(); </p><p><b> } </b></p><p> public void reset() { </p><p> blockType = (int) (Math.random() * 1000)
38、 % 7; </p><p> turnState = (int) (Math.random() * 1000) % 4; </p><p> blockState = 1; </p><p> row = scr.getInitRow(); </p><p> col = scr.getInitCol(); &l
39、t;/p><p> dispBlock(1); </p><p><b> }</b></p><p> public void leftTurn() { </p><p> if (assertValid(blockType, (turnState + 1) % 4, row, col)) { <
40、/p><p> dispBlock(0); </p><p> turnState = (turnState + 1) % 4; </p><p> dispBlock(1); </p><p><b> } </b></p><p><b> } </b&g
41、t;</p><p> public void leftMove() { </p><p> if (assertValid(blockType, turnState, row, col - 1)) { </p><p> dispBlock(0); </p><p><b> col--; </b&g
42、t;</p><p> dispBlock(1); </p><p><b> } </b></p><p><b> } </b></p><p> public void rightMove() { </p><p> if (assertV
43、alid(blockType, turnState, row, col + 1)) { </p><p> dispBlock(0); </p><p><b> col++; </b></p><p> dispBlock(1); </p><p><b> } </b>
44、;</p><p><b> } </b></p><p> public boolean fallDown() { </p><p> if (blockState == 2) </p><p> return (false); </p><p> if (assertV
45、alid(blockType, turnState, row - 1, col)) { </p><p> dispBlock(0); </p><p><b> row--; </b></p><p> dispBlock(1); </p><p> return (true); </
46、p><p> } else { </p><p> blockState = 2; </p><p> dispBlock(2); </p><p> return (false); </p><p><b> } </b></p><p><
47、;b> } </b></p><p> // 判斷是否正確的方法 </p><p> boolean assertValid(int t, int s, int row, int col) { </p><p> int k = 0x8000; </p><p> for (int i = 0; i
48、 < 4; i++) { </p><p> for (int j = 0; j < 4; j++) { </p><p> if ((int) (pattern[t][s] & k) != 0) { </p><p> int temp = scr.getScrArrXY(row - i, col + j); </p
49、><p> if (temp < 0 || temp == 2) </p><p> return false; </p><p><b> } </b></p><p> k = k >> 1; </p><p><b> } </b&
50、gt;</p><p><b> } </b></p><p> return true; </p><p><b> } </b></p><p><b> } </b></p><p><b> 3.6方塊的消除&
51、lt;/b></p><p> 實(shí)現(xiàn)方塊滿行是刪除該行,并改變分?jǐn)?shù)輸出窗口的值</p><p> void deleteFullLine() { </p><p> int full_line_num = 0; </p><p> int k = 0; </p><p> for (int
52、i = 0; i < rowNum; i++) { </p><p> boolean isfull = true; </p><p> L1: for (int j = 0; j < columnNum; j++) </p><p> if (scrArr[i][j] == 0) { </p><p>&l
53、t;b> k++; </b></p><p> isfull = false; </p><p> break L1; </p><p><b> } </b></p><p> if (isfull) </p><p> full_line_nu
54、m++; </p><p> if (k != 0 && k - 1 != i && !isfull) </p><p> for (int j = 0; j < columnNum; j++) { </p><p> if (scrArr[i][j] == 0) </p><p>
55、 drawUnit(k - 1, j, 0); </p><p><b> else </b></p><p> drawUnit(k - 1, j, 2); </p><p> scrArr[k - 1][j] = scrArr[i][j]; </p><p><b> } <
56、;/b></p><p><b> } </b></p><p> for (int i = k - 1; i < rowNum; i++) { </p><p> for (int j = 0; j < columnNum; j++) { </p><p> drawUnit(i,
57、 j, 0); </p><p> scrArr[i][j] = 0; </p><p><b> } </b></p><p><b> } </b></p><p> ELS.score += full_line_num; </p><p>
58、 ELS.scoreField.setText("" + ELS.score); </p><p><b> } </b></p><p><b> 四.軟件測(cè)試運(yùn)行</b></p><p><b> 1.游戲開始運(yùn)行</b></p><p&
59、gt; 2.增加難度并填滿一行后,消去該行,分?jǐn)?shù)增加</p><p> 3.列被填滿,彈出游戲結(jié)束窗口</p><p> 五.課程設(shè)計(jì)總結(jié)及體會(huì)</p><p> 本次課程設(shè)計(jì)花費(fèi)了小組成員一周的時(shí)間來完成。從設(shè)計(jì)開始選擇課題到最終完成課程設(shè)計(jì),小組成員分工明確,相互合作,按時(shí)完成了相關(guān)任務(wù)。通過這次的實(shí)驗(yàn),我們學(xué)習(xí)到了很多Java編程的知識(shí),同時(shí)對(duì)這學(xué)期的
60、課本所學(xué)知識(shí)有了進(jìn)一步鞏固.特別是多線程,AWT組件和事件等能更熟練的運(yùn)用.</p><p> 這次實(shí)驗(yàn)過后,我們發(fā)現(xiàn),動(dòng)手比看書更能獲取實(shí)際有用的知識(shí).很多知識(shí),在書本上看似很有道理,可是這些知識(shí)在與實(shí)際情況結(jié)合起來往往就會(huì)出現(xiàn)書本上沒見過的情況,或者說之前的理解與實(shí)際的使用是截然不同的.所以,真理是從實(shí)踐中得知的,而且也只有實(shí)踐才能檢驗(yàn)真理.而這次試驗(yàn)也加強(qiáng)了我們這些方面的理解能力,對(duì)書面上的東西實(shí)際操作在
61、具體項(xiàng)目上有了一個(gè)更加清晰的認(rèn)識(shí)。我們還意識(shí)到一個(gè)大的程序,在寫代碼前,一定要有良好的需求分析和結(jié)構(gòu)設(shè)計(jì),應(yīng)該占整個(gè)程序設(shè)計(jì)的大部分時(shí)間,一個(gè)好的程序,分析設(shè)計(jì)應(yīng)該要非常充分,這樣才不至于代碼寫了一半才發(fā)現(xiàn)很多錯(cuò)誤。在具體代碼操作之前的設(shè)計(jì)規(guī)劃與構(gòu)建才是一個(gè)優(yōu)秀的程序設(shè)計(jì)的靈魂。</p><p> 設(shè)計(jì)過程中,我們另一個(gè)大的一個(gè)體會(huì)就是合作的好處,通過互相幫助,大大的提高了工作的效率。同時(shí)我們也發(fā)現(xiàn)了自己的不足
62、之處。對(duì)于很多自己以為很熟悉的東西,在細(xì)節(jié)上的把握有許多不足;有些想當(dāng)然,認(rèn)為它應(yīng)該是這樣,而忽略的事實(shí)。這也讓我們明白,做事細(xì)心是必須的,所謂細(xì)節(jié)決定成敗!</p><p> 程序還有很多不足,在今后的日子里,我們會(huì)虛心向老師同學(xué)請(qǐng)教,盡自己最大的努力做到最好。</p><p><b> 六.參考文獻(xiàn)</b></p><p> [1].
63、《Java程序設(shè)計(jì)之網(wǎng)絡(luò)編程》,李芝興,楊瑞龍著,清華大學(xué)出版社</p><p> [2].《Java語(yǔ)言與面向?qū)ο蟪绦蛟O(shè)計(jì)》,印旻編著,清華大學(xué)出版社 </p><p> [3].《Java程序設(shè)計(jì)實(shí)用教程》,朱站立、沈偉編著,電子工業(yè)出版社</p><p><b> 附錄:重要代碼</b></p><p&
64、gt; class GameCanvas extends Canvas implements KeyListener { </p><p> final int unitSize = 25; // 小方塊邊長(zhǎng) </p><p> int rowNum; // 正方格的行數(shù) </p><p> int columnNum; // 正方格的列數(shù)
65、</p><p> int maxAllowRowNum; // 允許有多少行未消 </p><p> int blockInitRow; // 新出現(xiàn)塊的起始行坐標(biāo) </p><p> int blockInitCol; // 新出現(xiàn)塊的起始列坐標(biāo) </p><p> int[][] scrArr; // 屏幕數(shù)組 &
66、lt;/p><p> Block b; // 對(duì)方快的引用 </p><p> GameCanvas() { </p><p> rowNum = 18; </p><p> columnNum = 12; </p><p> maxAllowRowNum = rowNum - 2; </
67、p><p> b = new Block(this); </p><p> blockInitRow = rowNum - 1; </p><p> blockInitCol = columnNum / 2 - 2; </p><p> scrArr = new int[32][32]; </p><p
68、><b> } </b></p><p> // 初始化屏幕,并將屏幕數(shù)組清零的方法 </p><p> void initScr() { </p><p> for (int i = 0; i < rowNum; i++) </p><p> for (int j = 0; j &
69、lt; columnNum; j++) </p><p> scrArr[i][j] = 0; </p><p> b.reset(); </p><p> repaint(); </p><p><b> } </b></p><p> // 重新刷新畫布方法
70、</p><p> public void paint(Graphics g) { </p><p> for (int i = 0; i < rowNum; i++) </p><p> for (int j = 0; j < columnNum; j++) </p><p> drawUnit(i, j,
71、scrArr[i][j]); </p><p><b> } </b></p><p> // 畫方塊的方法 </p><p> public void drawUnit(int row, int col, int type) { </p><p> scrArr[row][col] = type
72、; </p><p> Graphics g = getGraphics(); </p><p> switch (type) { // 表示畫方快的方法 </p><p> case 0: </p><p> g.setColor(Color.black); </p><p> brea
73、k; // 以背景為顏色畫 </p><p> case 1: </p><p> g.setColor(Color.green); </p><p> break; // 畫正在下落的方塊 </p><p> case 2: </p><p> g.setColor(Color.gray
74、); </p><p> break; // 畫已經(jīng)落下的方法 </p><p><b> } </b></p><p> g.fill3DRect(col * unitSize, getSize().height - (row + 1) * unitSize, </p><p> unitSiz
75、e, unitSize, true); </p><p> g.dispose(); </p><p><b> } </b></p><p> public Block getBlock() { </p><p> return b; // 返回block實(shí)例的引用 </p>
76、<p><b> } </b></p><p> // 返回屏幕數(shù)組中(row,col)位置的屬性值 </p><p> public int getScrArrXY(int row, int col) { </p><p> if (row < 0 || row >= rowNum || col &l
77、t; 0 || col >= columnNum) </p><p> return (-1); </p><p><b> else </b></p><p> return (scrArr[row][col]); </p><p><b> } </b></
78、p><p> // 返回新塊的初始行坐標(biāo)方法 </p><p> public int getInitRow() { </p><p> return (blockInitRow); // 返回新塊的初始行坐標(biāo) </p><p><b> } </b></p><p> //
79、 返回新塊的初始列坐標(biāo)方法 </p><p> public int getInitCol() { </p><p> return (blockInitCol); // 返回新塊的初始列坐標(biāo) </p><p><b> } </b></p><p> public void reportGame
80、Over() {</p><p> JOptionPane.showMessageDialog(this, "Game Over!請(qǐng)繼續(xù)努力");</p><p><b> }</b></p><p> // 滿行刪除方法 </p><p> void deleteFullLine() {
81、 </p><p> int full_line_num = 0; </p><p> int k = 0; </p><p> for (int i = 0; i < rowNum; i++) { </p><p> boolean isfull = true; </p><p>
82、 L1: for (int j = 0; j < columnNum; j++) </p><p> if (scrArr[i][j] == 0) { </p><p><b> k++; </b></p><p> isfull = false; </p><p> break L1;
83、 </p><p><b> } </b></p><p> if (isfull) </p><p> full_line_num++; </p><p> if (k != 0 && k - 1 != i && !isfull) </p><
84、p> for (int j = 0; j < columnNum; j++) { </p><p> if (scrArr[i][j] == 0) </p><p> drawUnit(k - 1, j, 0); </p><p><b> else </b></p><p> dra
85、wUnit(k - 1, j, 2); </p><p> scrArr[k - 1][j] = scrArr[i][j]; </p><p><b> } </b></p><p><b> } </b></p><p> for (int i = k - 1; i <
86、; rowNum; i++) { </p><p> for (int j = 0; j < columnNum; j++) { </p><p> drawUnit(i, j, 0); </p><p> scrArr[i][j] = 0; </p><p><b> } </b>&l
87、t;/p><p><b> } </b></p><p> ELS.score += full_line_num; </p><p> ELS.scoreField.setText("" + ELS.score); </p><p><b> } </b>
88、;</p><p> boolean isGameEnd() { </p><p> for (int col = 0; col < columnNum; col++) { </p><p> if (scrArr[maxAllowRowNum][col] != 0){</p><p> reportGameOver()
89、;</p><p> return true;</p><p><b> } </b></p><p><b> } </b></p><p> return false;</p><p><b> } </b></p>
90、<p> public void keyTyped(KeyEvent e) { </p><p><b> } </b></p><p> public void keyReleased(KeyEvent e) { </p><p><b> } </b></p><
91、;p> public void keyPressed(KeyEvent e) { </p><p> if (!ELS.isPlay) </p><p> return; </p><p> switch (e.getKeyCode()) { </p><p> case KeyEvent.VK_DOWN:
92、 </p><p> b.fallDown(); </p><p><b> break; </b></p><p> case KeyEvent.VK_LEFT: </p><p> b.leftMove(); </p><p><b> break; &
93、lt;/b></p><p> case KeyEvent.VK_RIGHT: </p><p> b.rightMove(); </p><p><b> break; </b></p><p> case KeyEvent.VK_UP: </p><p> b.
94、leftTurn(); </p><p><b> break; </b></p><p><b> } </b></p><p><b> } </b></p><p><b> } </b></p><p&g
95、t; class Command implements ActionListener { </p><p> static final int button_play = 1; </p><p> static final int button_levelup = 2; </p><p> static final int button_leve
96、ldown = 3; </p><p> static final int button_quit = 4; </p><p> static final int button_pause = 5; </p><p> static boolean pause_resume = true; </p><p> int
97、curButton; </p><p> GameCanvas scr; </p><p> Command(int button, GameCanvas scr) { </p><p> curButton = button; </p><p> this.scr = scr; </p><p&g
98、t;<b> } </b></p><p> // 按鈕執(zhí)行方法 </p><p> public void actionPerformed(ActionEvent e) { </p><p> switch (curButton) { </p><p> case button_play:
99、 </p><p><b> { </b></p><p> ELS.isPlay = true; </p><p> ELS.score = 0; </p><p> ELS.scoreField.setText("0"); </p><p> EL
100、S.timer.resume(); </p><p> scr.initScr(); </p><p><b> } </b></p><p> scr.requestFocus(); </p><p><b> break; </b></p><p&g
101、t; case button_levelup: </p><p> if (ELS.level < 10) { </p><p> ELS.level++; </p><p> ELS.levelField.setText("" + ELS.level); </p><p> ELS.sco
102、re = 0; </p><p> ELS.scoreField.setText("" + ELS.score); </p><p><b> } </b></p><p> scr.requestFocus(); </p><p><b> break; <
103、;/b></p><p> case button_leveldown: </p><p> if (ELS.level > 1) { </p><p> ELS.level--; </p><p> ELS.levelField.setText("" + ELS.level); <
104、;/p><p> ELS.score = 0; </p><p> ELS.scoreField.setText("" + ELS.score); </p><p><b> } </b></p><p> scr.requestFocus(); </p><p
105、><b> break; </b></p><p> case button_pause: </p><p> if (pause_resume) { </p><p> ELS.timer.suspend(); </p><p> pause_resume = false; <
106、/p><p><b> return;</b></p><p> } else { </p><p> ELS.timer.resume(); </p><p> pause_resume = true; </p><p><b> } </b><
107、/p><p> scr.requestFocus(); </p><p><b> break; </b></p><p> case button_quit: </p><p> System.exit(0); </p><p><b> } </b&g
108、t;</p><p><b> } </b></p><p><b> } </b></p><p><b> //方塊類 </b></p><p> class Block { </p><p> static int[][]
109、 pattern = { </p><p> { 0x0f00, 0x4444, 0x0f00, 0x4444 },// 用十六進(jìn)至表示,本行表示長(zhǎng)條四種狀態(tài) </p><p> { 0x04e0, 0x0464, 0x00e4, 0x04c4 }, </p><p> { 0x4620, 0x6c00, 0x4620, 0x6c00 }, &
110、lt;/p><p> { 0x2640, 0xc600, 0x2640, 0xc600 }, </p><p> { 0x6220, 0x1700, 0x2230, 0x0740 }, </p><p> { 0x6440, 0x0e20, 0x44c0, 0x8e00 }, </p><p> { 0x0660, 0x066
111、0, 0x0660, 0x0660 } }; </p><p> int blockType; </p><p> int turnState; </p><p> int blockState; </p><p> int row, col; </p><p> GameCanvas sc
112、r; </p><p> Block(GameCanvas scr) { </p><p> this.scr = scr; </p><p> blockType = (int) (Math.random() * 1000) % 7; </p><p> turnState = (int) (Math.random()
113、* 1000) % 4; </p><p> blockState = 1; </p><p> row = scr.getInitRow(); </p><p> col = scr.getInitCol(); </p><p><b> } </b></p><p>
114、 public void reset() { </p><p> blockType = (int) (Math.random() * 1000) % 7; </p><p> turnState = (int) (Math.random() * 1000) % 4; </p><p> blockState = 1; </p>
115、<p> row = scr.getInitRow(); </p><p> col = scr.getInitCol(); </p><p> dispBlock(1); </p><p><b> }</b></p><p> public void leftTurn() { &
116、lt;/p><p> if (assertValid(blockType, (turnState + 1) % 4, row, col)) { </p><p> dispBlock(0); </p><p> turnState = (turnState + 1) % 4; </p><p> dispBlock(1);
117、 </p><p><b> } </b></p><p><b> } </b></p><p> public void leftMove() { </p><p> if (assertValid(blockType, turnState, row, col - 1)) {
118、 </p><p> dispBlock(0); </p><p><b> col--; </b></p><p> dispBlock(1); </p><p><b> } </b></p><p><b> } </b
119、></p><p> public void rightMove() { </p><p> if (assertValid(blockType, turnState, row, col + 1)) { </p><p> dispBlock(0); </p><p><b> col++; </
120、b></p><p> dispBlock(1); </p><p><b> } </b></p><p><b> } </b></p><p> public boolean fallDown() { </p><p> if (block
121、State == 2) </p><p> return (false); </p><p> if (assertValid(blockType, turnState, row - 1, col)) { </p><p> dispBlock(0); </p><p><b> row--; </
122、b></p><p> dispBlock(1); </p><p> return (true); </p><p> } else { </p><p> blockState = 2; </p><p> dispBlock(2); </p><p>
123、 return (false); </p><p><b> } </b></p><p><b> } </b></p><p> // 判斷是否正確的方法 </p><p> boolean assertValid(int t, int s, int row, int c
124、ol) { </p><p> int k = 0x8000; </p><p> for (int i = 0; i < 4; i++) { </p><p> for (int j = 0; j < 4; j++) { </p><p> if ((int) (pattern[t][s] & k
125、) != 0) { </p><p> int temp = scr.getScrArrXY(row - i, col + j); </p><p> if (temp < 0 || temp == 2) </p><p> return false; </p><p><b> } </b&
126、gt;</p><p> k = k >> 1; </p><p><b> } </b></p><p><b> } </b></p><p> return true; </p><p><b> } </b&g
127、t;</p><p> // 同步顯示的方法 </p><p> public synchronized void dispBlock(int s) { </p><p> int k = 0x8000; </p><p> for (int i = 0; i < 4; i++) { </p>&l
128、t;p> for (int j = 0; j < 4; j++) { </p><p> if (((int) pattern[blockType][turnState] & k) != 0) { </p><p> scr.drawUnit(row - i, col + j, s); </p><p><b> }
129、 </b></p><p> k = k >> 1; </p><p><b> } </b></p><p><b> } </b></p><p><b> } </b></p><p><b
130、> } </b></p><p><b> //定時(shí)線程 </b></p><p> class MyTimer extends Thread { </p><p> GameCanvas scr; </p><p> public MyTimer(GameCanvas scr
溫馨提示
- 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 俄羅斯方塊課程設(shè)計(jì)
- 俄羅斯方塊課程設(shè)計(jì)
- 課程設(shè)計(jì)---俄羅斯方塊
- 俄羅斯方塊課程設(shè)計(jì)
- 俄羅斯方塊課程設(shè)計(jì)
- 俄羅斯方塊課程設(shè)計(jì)
- 俄羅斯方塊課程設(shè)計(jì)
- 俄羅斯方塊課程設(shè)計(jì)
- c課程設(shè)計(jì)--俄羅斯方塊
- 俄羅斯方塊課程設(shè)計(jì)報(bào)告
- 俄羅斯方塊課程設(shè)計(jì)報(bào)告
- 簡(jiǎn)單俄羅斯方塊課程設(shè)計(jì)
- java俄羅斯方塊課程設(shè)計(jì)
- 俄羅斯方塊課程設(shè)計(jì)論文
- arm課程設(shè)計(jì)俄羅斯方塊
- 課程設(shè)計(jì)--俄羅斯方塊設(shè)計(jì)報(bào)告
- c_課程設(shè)計(jì)-俄羅斯方塊
- c++俄羅斯方塊課程設(shè)計(jì)
- 俄羅斯方塊游戲課程設(shè)計(jì)報(bào)告
- java課程設(shè)計(jì)--俄羅斯方塊游戲
評(píng)論
0/150
提交評(píng)論