俄羅斯方塊游戲的設(shè)計(jì) java課設(shè) 含可運(yùn)行程序
《俄羅斯方塊游戲的設(shè)計(jì) java課設(shè) 含可運(yùn)行程序》由會(huì)員分享,可在線(xiàn)閱讀,更多相關(guān)《俄羅斯方塊游戲的設(shè)計(jì) java課設(shè) 含可運(yùn)行程序(41頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、課程設(shè)計(jì)說(shuō)明書(shū) NO.41 俄羅斯方塊游戲的設(shè)計(jì) 1. 課程設(shè)計(jì)的目的 在工作壓力及其巨大的今天,游戲成了眾多上班一族和學(xué)生朋友學(xué)習(xí)放松的工具,所以設(shè)計(jì)了一個(gè)俄羅斯方塊的游戲程序,游戲功能齊全,隨進(jìn)隨出,根據(jù)自己的能力設(shè)置游戲的難度系數(shù)。通過(guò)此次課程設(shè)計(jì),鞏固了所學(xué)Java語(yǔ)言基本知識(shí),增進(jìn)Java語(yǔ)言編輯基本功,掌握J(rèn)DK、Eclipse等開(kāi)發(fā)工具的運(yùn)用,拓寬常用類(lèi)庫(kù)的應(yīng)用。通過(guò)該教學(xué)環(huán)節(jié)與手段,把所學(xué)課程及相關(guān)知識(shí)加以融會(huì)貫通,理論與實(shí)際的結(jié)合,全面掌握J(rèn)ava語(yǔ)言的編程思想及面向?qū)ο蟪绦蛟O(shè)計(jì)的方法,為今后從事實(shí)際工作打下堅(jiān)實(shí)的基礎(chǔ)。 2.設(shè)計(jì)方案
2、論證 2.1設(shè)計(jì)思路 本課程設(shè)計(jì)的目標(biāo)是做一個(gè)俄羅斯方塊的游戲軟件,實(shí)現(xiàn)界面初始化,游戲背景顏色和不同方塊類(lèi)型的初始化,程序正常運(yùn)行,對(duì)游戲難度不同程度的設(shè)置,游戲的從新開(kāi)始,正常退出和相應(yīng)的數(shù)據(jù)計(jì)算功能。類(lèi)似下落、轉(zhuǎn)向、平移、得分累加和計(jì)數(shù)等。在設(shè)計(jì)過(guò)程中,充分的利用平時(shí)課堂所學(xué)知識(shí)。在游戲里,設(shè)置了7種不同形狀的方塊分別為條形、T型、田型、正反Z型、正反L型。各種類(lèi)的實(shí)現(xiàn),分?jǐn)?shù)面板類(lèi),用來(lái)顯示分?jǐn)?shù)和關(guān)數(shù)。添加三個(gè)標(biāo)簽,并設(shè)置字體格式,定義控制面板類(lèi),新建并添加控制按鈕。定義預(yù)覽面板類(lèi),顯示下一個(gè)。在預(yù)覽框內(nèi)實(shí)現(xiàn)隨機(jī)產(chǎn)生不同顏色和種類(lèi)的小方塊。聯(lián)合類(lèi),新建三個(gè)面板對(duì)象,將以上產(chǎn)生的三個(gè)面
3、板添加到總的控制面板上。俄羅斯游戲方塊面板類(lèi),它起的就是顯示屏的作用,各種方塊的運(yùn)行狀況,都由其控制。主框架類(lèi),將顯示類(lèi)面板和控制類(lèi)面板按邊界布局添加到主類(lèi)當(dāng)中。從而實(shí)現(xiàn)游戲界面整體的融合和功能的實(shí)現(xiàn)。 2.2設(shè)計(jì)方法 俄羅斯方塊的游戲設(shè)計(jì),本質(zhì)上就是用一個(gè)線(xiàn)程或者定時(shí)器產(chǎn)生重繪事件,用線(xiàn)程和用戶(hù)輸入改變游戲狀態(tài)。這個(gè)游戲也不例外,啟動(dòng)MIDLET后,就立即生成一個(gè)重繪線(xiàn)程,該線(xiàn)程每隔100MS繪制一次屏幕。當(dāng)然,重繪時(shí)有一些優(yōu)化措施,并不是屏幕上所有的像素都需要重繪,而是有所選擇,比如游戲畫(huà)布上那些已經(jīng)固定下來(lái)的下墜物(下墜物一共有7種,由4種小磚塊組成,每種下墜物顏色固定為灰白色,可以
4、上下左右旋轉(zhuǎn))就不需要重繪。游戲畫(huà)布是一個(gè)COMMANDLISTENER,可以接受用戶(hù)鍵盤(pán)命令,控制下墜物的左移,右移,下移,旋轉(zhuǎn)動(dòng)作。整個(gè)游戲的流程控制體現(xiàn)在游戲畫(huà)布對(duì)象的PAINT()方法里。PAINT()根據(jù)當(dāng)前的游戲狀態(tài),繪制出當(dāng)時(shí)的游戲畫(huà)面。對(duì)于游戲處于運(yùn)行狀態(tài)的畫(huà)面的繪制,則需要在下墜物的當(dāng)前位置,繪制下墜物。在繪制下墜物之前,判斷下墜物是否還能下墜,如果能下墜的話(huà),就讓它下落一格,再進(jìn)行繪制,如果下墜物已無(wú)法下墜,則判斷游戲是否處于游戲結(jié)束狀態(tài),如果是處于游戲結(jié)束狀態(tài)的話(huà),則設(shè)置游戲狀態(tài)為游戲結(jié)束狀態(tài)。如果游戲不是處于游戲結(jié)束狀態(tài),則把下墜物固定下來(lái),同時(shí)檢查游戲畫(huà)布上下墜物當(dāng)前
5、行下面的所有行,看是否需要進(jìn)行行刪除動(dòng)作,如果需要行刪除,則清除游戲地圖上被刪行的數(shù)據(jù),再把被刪行繪制成背景色。然后初始化一個(gè)新的下墜物,繪制這個(gè)新的下墜物。 根據(jù)需求分析要實(shí)現(xiàn)的系統(tǒng)功能,可以得出系統(tǒng)的模塊圖: 俄羅斯方塊游戲 畫(huà)布游戲界面 游戲操作處理 面板類(lèi)處理初始化問(wèn) 題 主框架類(lèi)構(gòu)建畫(huà)布 7種游戲方塊類(lèi) 鍵盤(pán)事件command 控制按鈕監(jiān)聽(tīng)事件 多線(xiàn)程處理方法模塊 圖1 系統(tǒng)模塊圖 主程序的流程圖為 開(kāi)始 判定是否滿(mǎn)格 繪制方塊下落 游戲結(jié)束 是否能旋轉(zhuǎn) 調(diào)節(jié)難度 No Yes 正
6、常下落 旋轉(zhuǎn)方塊 消除滿(mǎn)格的行 時(shí)鐘等待時(shí)間超100 游戲隨機(jī)繪制方塊 Yes No 固定方塊 繪制游戲結(jié)束界面 No Yes 圖2 主程序流程圖 得分模塊的流程圖為 開(kāi)始 設(shè)計(jì)游戲難度 自動(dòng)生成任意方塊 方塊落底,變成藍(lán)色 判斷是否格滿(mǎn) Showscore加分 顯示面板上顯示分?jǐn)?shù) 結(jié)束 調(diào)用退出程序 Yes No 圖3 得分模塊流程圖 2.3 設(shè)計(jì)中的成員變量和方法 表1 主框架中的成員變量 成員變量描述 變量類(lèi)型 名稱(chēng) 是否可以控制標(biāo)志變量 boolean control 游戲是否結(jié)束變量 bool
7、ean GameOver 是否允許改變變量 boolean turn 時(shí)間計(jì)時(shí)變量 Timer timer 得分變量 int ShowScore 表2 主框架中的主要方法 方法名 功能 paintComponent(Graphics) 繪制整體游戲所需界面 down(block) 判斷并執(zhí)行下落方塊 full() 判斷一行是否為滿(mǎn)方法 Creat() 創(chuàng)造下一個(gè)隨機(jī)方塊的方法 trychange() 判斷當(dāng)前方塊是否并執(zhí)行改變 2.4 設(shè)計(jì)中的主要類(lèi) RussiaGame02 主框架類(lèi) 主框架類(lèi),將顯示類(lèi)面板和控制類(lèi)面板按邊界布
8、局添加到RussiaGame02,該類(lèi)含有main方法,是程序的入口,該方法是吧所有模塊聯(lián)系在一起的關(guān)鍵,設(shè)置了此容器為邊界布局,將顯示面板放在中央,控制面板放在右側(cè),并為顯示面板控制面板添加監(jiān)聽(tīng)器。 Control控制面板類(lèi) 是Jpanel類(lèi)的子類(lèi),可以按網(wǎng)格布局添加控制按鈕,添加邊框。設(shè)置六個(gè)控制按鈕。"開(kāi)始游戲"、"退出游戲"、"提高速度"、"降低速度"、"提高關(guān)數(shù)"、"降低關(guān)數(shù)"。setLayout(new GridLayout(6,1,0,5))定義布局GridLayout,使按鈕豎向排列。 show定義分?jǐn)?shù)面板類(lèi) 用來(lái)顯示分?jǐn)?shù)速、度和關(guān)數(shù)。添加四個(gè)標(biāo)簽,并設(shè)置字體格式按網(wǎng)格
9、布局添加四個(gè)標(biāo)簽,設(shè)置標(biāo)簽格式Show(),加邊框。四個(gè)標(biāo)簽分別"當(dāng)前得分"、"當(dāng)前速度"、"當(dāng)前闖關(guān)"、"勇往直前"。 setLayout(new GridLayout(4,1)); this.setBorder(c); s1.setFont(b); s3.setFont(b); s2.setFont(b); s4.setFont(b); Unit聯(lián)合類(lèi) 新建三個(gè)面板對(duì)象,將以上產(chǎn)生的三個(gè)面板添加到總的控制面板上??蓸?gòu)造函數(shù),格式為setLayout(new GridLayout(3,1)),按網(wǎng)格布局添加三個(gè)面板
10、對(duì)象到總的控制面板上,add (control);add (show);add (shownext); Main函數(shù)的代碼如下 public class RussiaGame02 extends JFrame implements ActionListener,ItemListener{ RussiaPanel p; Unit u = new Unit(); public RussiaGame02() { p=new RussiaPanel(u); Container con = this.getContentPane();
11、 con.setLayout(new BorderLayout());//設(shè)置此容器為邊界布局 con.add(p,BorderLayout.CENTER);//將顯示面板放在中間 con.add(u,BorderLayout.EAST);//控制面板放在右側(cè) this.addKeyListener(p);//為顯示面板添加監(jiān)聽(tīng)器 JOptionPane.showMessageDialog(this, "寒濤工作室歡迎進(jìn)入俄羅斯方塊游戲 !");//顯示歡迎對(duì)話(huà)框
12、 MenuBar myB=new MenuBar();//新建控制菜單 setMenuBar(myB); Menu m1=new Menu("游戲");//新建標(biāo)題菜單 MenuItem m11=new MenuItem("新游戲",new MenuShortcut(KeyEvent.VK_N));//新建菜單選項(xiàng) m1.add(m11); MenuItem m14=new MenuItem("退出",new MenuShortcut(KeyEvent.VK_X))
13、; m1.add(m14); m1.addActionListener(this);//為菜單添加監(jiān)聽(tīng)器 myB.add(m1); Menu m3=new Menu("幫助"); m3.add("關(guān)于"); myB.setHelpMenu(m3); } public static void main(String[] args) {//繪制程序界面 RussiaGame02 f = new RussiaGame02()
14、; f.setSize(450, 600); f.show() } public void itemStateChanged(ItemEvent e)// { } public void actionPerformed(ActionEvent e)//菜單監(jiān)聽(tīng)器的實(shí)現(xiàn)細(xì)節(jié) { if(e.getActionCommand()=="退出")//如果按退出鍵則退出 System.exit(0); if(e.getActionCommand()=="新游戲"
15、)//按新游戲鍵,清空顯示屏幕并重置 { p.uu.control.b4.setEnabled(true); p.uu.control.b5.setEnabled(true); p.reset(); p.uu.control.b1.setLabel("點(diǎn)擊繼續(xù)玩");//將按開(kāi)始按扭標(biāo)簽置換為重玩一次 if(!p.GameOver()) { p.clean(); p.t.suspend();
16、 } else{ p.clean(); p.t.resume(); } } } } 3.設(shè)計(jì)結(jié)果與分析 調(diào)試程序,沒(méi)有錯(cuò)誤后開(kāi)始運(yùn)行,進(jìn)入游戲界面模塊 圖4 進(jìn)入游戲界面圖 選擇確定后進(jìn)入游戲界面,設(shè)置了此容器為邊界布局,控制面板上設(shè)置六個(gè)控制按鈕。將顯示面板放在中央,控制面板放在右側(cè)。"開(kāi)始游戲"、"退出游戲"、"提高速度"、"降低速度"、"提高關(guān)數(shù)"、"降低關(guān)數(shù)"。,分?jǐn)?shù)模塊設(shè)置字體格
17、式按網(wǎng)格布局添加四個(gè)標(biāo)簽,設(shè)置標(biāo)簽格式Show(),加邊框。四個(gè)標(biāo)簽分別"當(dāng)前得分"、"當(dāng)前速度"、"當(dāng)前闖關(guān)"、"勇往直前"。 圖5 游戲界面圖 游戲開(kāi)始前可以選擇游戲的速度和關(guān)數(shù)從而設(shè)置游戲的難度,游戲開(kāi)始的默認(rèn)難度速度為1級(jí),關(guān)數(shù)也為1級(jí)所得學(xué)分為0,設(shè)置的關(guān)數(shù)越高,難度就越大。游戲開(kāi)始后,就不可以改變難度,只能選擇暫停和退出程序。 圖6 提高級(jí)別后運(yùn)行界面圖 玩家開(kāi)始玩游戲后,如果在方塊沒(méi)有到達(dá)頂端的前提下可以消除一行,當(dāng)前得分自動(dòng)增加100分,當(dāng)方塊到達(dá)頂端時(shí)而無(wú)法消除,生成的方塊不能再下了,則游戲結(jié)束,出現(xiàn)游戲結(jié)束的界面模塊,出現(xiàn)你也太
18、差勁了幾個(gè)字樣。 圖7 游戲結(jié)束界面圖 游戲結(jié)束后顯示本次游戲的得分?jǐn)?shù),點(diǎn)擊確定后就可以繼續(xù)選擇進(jìn)行游戲。 圖8 本次游戲得分界面圖 當(dāng)游戲結(jié)束或者中途想重新玩游戲的時(shí)候,就可一選擇新游戲選項(xiàng)或者點(diǎn)擊ctrl+n進(jìn)行新游戲。點(diǎn)擊退出或者快捷鍵ctrl+x就退出游戲界面。 圖9 進(jìn)入新游戲界面圖 一輪游戲是一個(gè)大循環(huán),在這個(gè)循環(huán)中,每隔100毫秒,檢查游戲中的當(dāng)前塊是否已經(jīng)到底了,如果沒(méi)有, 就繼續(xù)等待。如果到底了,就看有沒(méi)有全填滿(mǎn)的行,如果有就刪除它,并為游戲者加分,同
19、時(shí)隨機(jī)產(chǎn)生一新的當(dāng)前塊,讓它自動(dòng)下落。當(dāng)新產(chǎn)生一個(gè)塊時(shí),先檢查畫(huà)布最頂上的一行是否已經(jīng)被占了,如果是,可以判斷Game Over了。 雖然成功的完成游戲設(shè)計(jì),但也發(fā)現(xiàn)了自己很多的不足,很多預(yù)想功能還不能在游戲運(yùn)行中實(shí)現(xiàn),無(wú)聲音效果,略顯調(diào),界單面不夠漂亮,還有很多小瑕疵有待完善。 4.設(shè)計(jì)總結(jié) 通過(guò)此次課程設(shè)計(jì),將我所學(xué)的JAVA知識(shí)得到鞏固和應(yīng)用,在設(shè)計(jì)的過(guò)程中我遇到了很多問(wèn)題,不過(guò)在老師和同學(xué)們的幫助和自己的思考下還是很好的完成了。從實(shí)踐上認(rèn)識(shí)了Java是如何編寫(xiě)命令的,如何協(xié)調(diào)計(jì)算機(jī)內(nèi)部各個(gè)部件運(yùn)行,對(duì)計(jì)算機(jī)編譯原理的認(rèn)識(shí)更加深刻。課程設(shè)計(jì)中程序比較復(fù)雜
20、,在調(diào)試時(shí)應(yīng)該仔細(xì),在程序調(diào)試時(shí),注意構(gòu)造,將不必要的命令去除。深入的了解了JAVA語(yǔ)言的嚴(yán)謹(jǐn)性,了解了JAVA語(yǔ)言中眾多方法,類(lèi)的使用,為以后學(xué)習(xí)打下良好的基礎(chǔ)。JAVA是一種面向?qū)ο蟮某绦蛘Z(yǔ)言。熟悉數(shù)據(jù)庫(kù)的基本知識(shí)及一種以上數(shù)據(jù)庫(kù)系統(tǒng)開(kāi)發(fā)軟件。最后衷心感謝在課程設(shè)計(jì)過(guò)程中給予過(guò)我?guī)椭睦蠋熀屯瑢W(xué)們,沒(méi)有他們的幫助課程設(shè)計(jì)就不能圓滿(mǎn)完成。 5.參考文獻(xiàn) [1]陳國(guó)君,陳磊,劉洋.Java2程序設(shè)計(jì)基礎(chǔ)[M].北京:清華大學(xué)出版社;2008.6 [2]耿祥義,張躍平.Java課程設(shè)計(jì)[M].北京:清華大學(xué)出版社;2008.11 [3]張思民,梁維娜.Java程序設(shè)計(jì)實(shí)踐教程[M].北京
21、:清華大學(xué)出版社;2006.8 [4]葉核亞.JAVA2程序設(shè)計(jì)實(shí)用教程[M](第2版).北京:電子工業(yè)出版社;2008.4 6. 附錄: import javax.swing.*;//導(dǎo)入高級(jí)抽象窗口,完成更高級(jí)的功能 import java.awt.*;//導(dǎo)入java.awt包 提供生成各種標(biāo)準(zhǔn)圖形界面元素和處理圖形界面的類(lèi)庫(kù) import java.awt.event.*;//導(dǎo)入抽象窗口類(lèi)事件包 import java.util.*; import javax.swing.border.
22、*; import java.applet.*; class XFK {//小方塊類(lèi) int m;//橫坐標(biāo) int n;//縱坐標(biāo) } abstract class FK {//所有俄羅斯方塊的父類(lèi) XFK [] xfk = new XFK[4];//每個(gè)俄羅斯方塊由4個(gè)小方塊構(gòu)成 int state;//定義長(zhǎng)條的狀態(tài) int [][] map; public void setMap(int [][] map){//定義背景的二維數(shù)組, this.map = map; } FK
23、 (){//默認(rèn)的構(gòu)造函數(shù) for (int i = 0; i<4; i++){//一個(gè)for循環(huán),循環(huán)4次 xfk[i] = new XFK();//對(duì)XFK對(duì)象數(shù)組xfk[]初始化 } } abstract public void reset();//每個(gè)方塊都有的重設(shè)方法 abstract public void turn();//虛的旋轉(zhuǎn)方法 abstract public boolean canTurn();//判斷是否能旋轉(zhuǎn)的方法 public void move(int
24、 fx){//用于將各個(gè)小方塊的坐標(biāo)左移 switch(fx){ case KeyEvent.VK_LEFT://向左移動(dòng) for (int i = 0;i<4; i++){//循環(huán)語(yǔ)句 xfk[i].m--;//每一個(gè)小方塊的橫坐標(biāo)減一,向左移一步 } break; case KeyEvent.VK_RIGHT://向右移動(dòng) for (int i
25、= 0; i < 4; i++) {//循環(huán)語(yǔ)句 xfk[i].m++;//每一個(gè)小方塊的橫坐標(biāo)加一,向右移一步 } break; case KeyEvent.VK_DOWN://向下移動(dòng) for (int i = 0;i<4; i++){//循環(huán)語(yǔ)句 xfk[i].n++;//每一個(gè)小方塊的縱坐標(biāo)加一,向下移一步 }
26、 break; default: break; } } public boolean canMove(int fx){//定義canMove方法,用于判斷能否移動(dòng) switch(fx){ case KeyEvent.VK_LEFT: for (int i = 0;i<4; i++){//循環(huán)語(yǔ)句 int m = xfk[i].m - 1;//將xfk[i]的橫坐標(biāo)值減一,向左移動(dòng)
27、一步所得到的坐標(biāo)賦值給m int n = xfk[i].n ;//保持縱坐標(biāo)值不變 if (m<0 || m>=12 || n<0 || n>=18 ||map[m][n] ==1){//移動(dòng)時(shí)是否任何一個(gè)小方塊到了邊界 return false; } } return true; case KeyEvent.VK_RIGH
28、T: for (int i = 0;i<4; i++){ int m = xfk[i].m + 1; int n = xfk[i].n ; if (m<0 || m>=12 || n<0 || n>=18 ||map[m][n] ==1){ return false; } } r
29、eturn true; case KeyEvent.VK_DOWN: for (int i = 0;i<4; i++){ int m = xfk[i].m; int n = xfk[i].n + 1 ; if (m<0 || m>=12 || n<0 || n>=18 ||map[m][n] ==1 ){ return false;
30、 } } return true; default: return false; } } } class FK1 extends FK{ //長(zhǎng)條形類(lèi) public void reset(){ //定義Fk1類(lèi)的reset方法 //出現(xiàn)狀態(tài)(state) state = (int)(Math.random
31、()*2);//隨機(jī)產(chǎn)生數(shù)0,1初始化大方快狀態(tài) //狀態(tài)的種類(lèi) if (state == 0){ //條形方塊橫向狀態(tài) for (int i = 0; i<4; i++){ xfk[i].m = 4+i; //初始化組成條形圖形各小方塊橫向坐標(biāo) xfk[i].n = 0; //初始化組成條形圖形各小方塊縱向坐標(biāo) } } else
32、{ //條形方塊豎向狀態(tài) for (int i = 0; i<4; i++){ xfk[i].m = 5; //初始化組成條形圖形各小方塊橫向坐標(biāo) xfk[i].n = i; //初始化組成條形圖形各小方塊縱向坐標(biāo) } } } public void turn(){ //定義Fk1類(lèi)的turn方法 if (sta
33、te == 1) { //state為豎直型的情況 if(xfk[0].m>0&&xfk[0].m<10){//各小方塊橫向坐標(biāo)必須在可變范圍 int m = xfk[0].m - 1; int n = xfk[0].n + 1; for (int i = 0; i<4; i++){ xfk[i].m = m + i; xfk[i].n = n; }
34、state=0; //重置條形狀態(tài) } }else { if(xfk[0].n<16){ //橫向個(gè)小方塊從向坐標(biāo)不能超過(guò)16 int m = xfk[0].m + 1; int n = xfk[0].n - 1; for (int i = 0; i<4; i++){ xfk[i].m = m;
35、 xfk[i].n = n+i; } state = 1; //重置條形狀態(tài) } } } public boolean canTurn() {//判斷方塊是否可以轉(zhuǎn) turn(); //調(diào)用方塊旋轉(zhuǎn)方法使方塊轉(zhuǎn)動(dòng) for(int i=0;i<4;i++)//循環(huán)方塊的每一小塊 {int m=xfk[i].m; //將旋轉(zhuǎn)后的每一小塊的橫坐標(biāo)賦給
36、m int n=xfk[i].n; //將旋轉(zhuǎn)后的每一小塊的縱坐標(biāo)賦給n if ( m<0 || m>11 || n<0 || n>17 || map [m][n] == 1 )//if條件旋轉(zhuǎn)后方塊坐標(biāo)超過(guò)map或是與有方塊的地方?jīng)_突 { return true; //如果滿(mǎn)足if條件則返回true再旋轉(zhuǎn)一次,相當(dāng)于沒(méi)有轉(zhuǎn),不能旋轉(zhuǎn) } } return false; //如果旋轉(zhuǎn)后坐標(biāo)在map內(nèi)且沒(méi)有和有方塊的地方?jīng)_突,則返
37、回false不再旋轉(zhuǎn),相當(dāng)于能旋轉(zhuǎn) } } class FK2 extends FK {//正Z形類(lèi) public void reset(){//定義Fk2類(lèi)的reset方法 state = (int)(Math.random()*2);//隨機(jī)產(chǎn)生數(shù)0,1初始化大方快狀態(tài) switch(state){ case 0://隨機(jī)產(chǎn)生數(shù)0時(shí),產(chǎn)生的為豎著的Z方塊 for(int i=0;i<2;i++){ xf
38、k[i].m=5;//初始化組成條形圖形各小方塊橫向坐標(biāo) xfk[i].n=i;//初始化組成條形圖形各小方塊縱向坐標(biāo) } for(int i=2;i<4;i++){//一個(gè)for循環(huán),循環(huán)4次 xfk[i].m=4;//初始化組成條形圖形各小方塊橫向坐標(biāo) xfk[i].n=i-1;//初始化組成條形圖形各小方塊縱向坐標(biāo) } break; case 1://隨機(jī)產(chǎn)生數(shù)
39、1時(shí),產(chǎn)生的為橫著的的Z方塊 for(int i=0;i<2;i++){//一個(gè)for循環(huán),循環(huán)2次 xfk[i].m=6-i;//初始化組成條形圖形各小方塊橫向坐標(biāo) xfk[i].n=1;//初始化組成條形圖形各小方塊縱向坐標(biāo) } for(int i=2;i<4;i++){//一個(gè)for循環(huán),循環(huán)2次 xfk[i].m=7-i;//初始化組成條形圖形各小方塊橫向坐標(biāo) xfk[i].n=0;
40、//初始化組成條形圖形各小方塊縱向坐標(biāo) } break; default: break; } } public void turn(){//定義turn方法,用于改變狀態(tài) int m,n; switch(state){ case 0: m=xfk[0].m+1;//第一個(gè)小方塊的橫坐標(biāo)的值加1,并賦值給m n=xfk[0].n+1;//第一個(gè)小方塊
41、的豎坐標(biāo)的值加1,并賦值給n for(int i=0;i<2;i++){//循環(huán)語(yǔ)句 xfk[i].m=m-i;//將每一個(gè)小方塊從m-1到m列排列 xfk[i].n=n;//將每一個(gè)小方塊都在第n行排列 } for(int i=2;i<4;i++){//循環(huán)語(yǔ)句 xfk[i].m=m+1-i; xfk[i].n=n-1; } break; case 1:
42、 m=xfk[0].m-1; n=xfk[0].n-1; for(int i=0;i<2;i++){ xfk[i].m=m;//將每一個(gè)小方塊都在第m列排列 xfk[i].n=n+i;//將每一個(gè)小方塊從n到n+1行排列 } for(int i=2;i<4;i++){ xfk[i].m=m-1; xfk[i].n=n+i-1; } break; de
43、fault: break; } state=(state+1)%2;//改變狀態(tài) } public boolean canTurn() {//判斷方塊是否可以轉(zhuǎn) turn(); //調(diào)用方塊旋轉(zhuǎn)方法使方塊轉(zhuǎn)動(dòng) for(int i=0;i<4;i++)//循環(huán)方塊的每一小塊 {int m=xfk[i].m; //將旋轉(zhuǎn)后的每一小塊的橫坐標(biāo)賦給m int n=xfk[i].n; //將旋轉(zhuǎn)后的每一小塊的縱坐標(biāo)賦給n
44、 if ( m<0 || m>11 || n<0 || n>17 || map [m][n] == 1 )//if條件旋轉(zhuǎn)后方塊坐標(biāo)超過(guò)map或是與有方塊的地方?jīng)_突 { return true; //如果滿(mǎn)足if條件則返回true再旋轉(zhuǎn)一次,相當(dāng)于沒(méi)有轉(zhuǎn),不能旋轉(zhuǎn) } } return false; //如果旋轉(zhuǎn)后坐標(biāo)在map內(nèi)且沒(méi)有和有方塊的地方?jīng)_突,則返回false不再旋轉(zhuǎn),相當(dāng)于能旋轉(zhuǎn) } } class FK3
45、extends FK { //T型類(lèi) public void reset(){//重置方法 state = (int)(Math.random()*4);//隨機(jī)產(chǎn)生數(shù)0,1,2,3初始化大方快狀態(tài) switch(state){ case 0://隨機(jī)產(chǎn)生數(shù)0時(shí),產(chǎn)生的為橫著的的反T型方塊 for (int i = 0; i < 3; i++) {//一個(gè)for循環(huán) xfk[i].m = 4+i;//初始化組成條形圖形各小方塊橫向坐標(biāo)
46、 xfk[i].n = 1; } xfk[3].m = 5; xfk[3].n = 0; break; case 1://隨機(jī)產(chǎn)生數(shù)1時(shí),產(chǎn)生的為"!-"型方塊 for (int i = 0; i < 3; i++) { xfk[i].m = 5;//初始化組成條形圖形各小方塊橫向坐標(biāo)
47、 xfk[i].n = i; } xfk[3].m = 6;//初始化組成條形圖形各小方塊橫向坐標(biāo) xfk[3].n = 1; break; case 2://隨機(jī)產(chǎn)生數(shù)2時(shí),產(chǎn)生的為T(mén)型方塊 for (int i = 0; i < 3; i++) { xfk[i].m = 4+i;//初始化組成條形圖形各小方塊橫向坐標(biāo)
48、 xfk[i].n = 0; } xfk[3].m = 5; xfk[3].n = 1; break; case 3://隨機(jī)產(chǎn)生數(shù)1時(shí),產(chǎn)生的為"-!"型方塊 for (int i = 0; i < 3; i++) { xfk[i].m = 5;//初始化組成條形圖形各小方塊橫向坐標(biāo)
49、xfk[i].n = i; } xfk[3].m = 4; xfk[3].n = 1; break; default: break; } } public void turn(){//定義turn方法,用于改變狀態(tài) int m,n; switch(state){ case 0:
50、 m = xfk[0].m + 1;//第一個(gè)小方塊的橫坐標(biāo)的值加1,并賦值給m n = xfk[0].n -1;//第一個(gè)小方塊的豎坐標(biāo)的值減1,并賦值給n for (int i = 0; i<3; i++){//循環(huán)語(yǔ)句 xfk[i].m = m;//將每一個(gè)小方塊都在第m列排列 xfk[i].n = n+i;//將每一個(gè)小方塊從n到n+2行排列 } xfk[3].m
51、 = m+1;//第三個(gè)小方塊的橫坐標(biāo)的值加1,并賦值給m xfk[3].n = n+1;//第三個(gè)小方塊的豎坐標(biāo)的值減1,并賦值給n break; case 1: if(xfk[0].m>0){ m = xfk[0].m - 1;//第一個(gè)小方塊的橫坐標(biāo)的值減1,并賦值給m n = xfk[0].n + 1;//第一個(gè)小方塊的豎坐標(biāo)的值加1,并賦值給n for (int i =
52、 0; i<3; i++){//循環(huán)語(yǔ)句 xfk[i].m = m+i;////將每一個(gè)小方塊從第m列道m(xù)+2排列 xfk[i].n = n;//將每一個(gè)小方塊都在第m行排列 } xfk[3].m = m+1;//第三個(gè)小方塊的橫坐標(biāo)的值加1,并賦值給m xfk[3].n = n+1;//第三個(gè)小方塊的豎坐標(biāo)的值減1,并賦值給n } else{
53、 state=1; turn(); } break; case 2: m = xfk[0].m + 1;//第一個(gè)小方塊的橫坐標(biāo)的值加1,并賦值給m n = xfk[0].n - 1;//第一個(gè)小方塊的豎坐標(biāo)的值減1,并賦值給n for (int i = 0; i < 3; i++) {//循環(huán)語(yǔ)句
54、 xfk[i].m = m;//將每一個(gè)小方塊都在第m列排列 xfk[i].n = n + i;//將每一個(gè)小方塊從n到n+2行排列 } xfk[3].m = m - 1;//第三個(gè)小方塊的橫坐標(biāo)的值減1,并賦值給m xfk[3].n = n + 1;//第三個(gè)小方塊的豎坐標(biāo)的值減1,并賦值給n break; case 3: if(xfk[0].m<11){
55、 m = xfk[0].m - 1;//第一個(gè)小方塊的橫坐標(biāo)的值減1,并賦值給m n = xfk[0].n + 1;//第一個(gè)小方塊的豎坐標(biāo)的值加1,并賦值給n for (int i = 0; i < 3; i++) {//循環(huán)語(yǔ)句 xfk[i].m = m + i;//第三個(gè)小方塊的橫坐標(biāo)的值加1,并賦值給m xfk[i].n = n ;//第三個(gè)小方塊的豎坐標(biāo)的值賦值給n
56、} xfk[3].m = m + 1;//第三個(gè)小方塊的橫坐標(biāo)的值加1,并賦值給m xfk[3].n = n - 1;//第三個(gè)小方塊的豎坐標(biāo)的值減1,并賦值給n } else{ state=3; turn(); } break; default: break;
57、 } state = (state+1)%4; } public boolean canTurn() {//判斷方塊是否可以轉(zhuǎn) turn(); //調(diào)用方塊旋轉(zhuǎn)方法使方塊轉(zhuǎn)動(dòng) for(int i=0;i<4;i++)//循環(huán)方塊的每一小塊 {int m=xfk[i].m; //將旋轉(zhuǎn)后的每一小塊的橫坐標(biāo)賦給m int n=xfk[i].n; //將旋轉(zhuǎn)后的每一小塊的縱坐標(biāo)賦給n if (n<0 || map [m][n] == 1
58、)//if條件旋轉(zhuǎn)后方塊坐標(biāo)超過(guò)map或是與有方塊的地方?jīng)_突 { return true; //如果滿(mǎn)足if條件則返回true再旋轉(zhuǎn)一次,相當(dāng)于沒(méi)有轉(zhuǎn),不能旋轉(zhuǎn) } } return false; } } class FK4 extends FK {//L型類(lèi)(因?yàn)樗膫€(gè)方塊樣子很難描述,下略) public void reset(){//重置方法 state = (int)(Mat
59、h.random()*4);//隨機(jī)產(chǎn)生數(shù)0,1,2,3初始化大方快狀態(tài) switch(state){ case 0://隨機(jī)產(chǎn)生數(shù)0時(shí),產(chǎn)生的為正L型方塊 for(int i=0;i<3;i++){//循環(huán)語(yǔ)句 xfk[i].m=4; xfk[i].n=i; } xfk[3].m=5; xfk[3].n=2;
60、 break; case 1://隨機(jī)產(chǎn)生數(shù)1時(shí), for(int i=0;i<3;i++){//循環(huán)語(yǔ)句 xfk[i].m=6-i; xfk[i].n=0; } xfk[3].m=4; xfk[3].n=1; break;
61、 case 2://隨機(jī)產(chǎn)生數(shù)0時(shí),產(chǎn)生的為正L型方塊 for(int i=0;i<3;i++){//循環(huán)語(yǔ)句 xfk[i].m=5; xfk[i].n=2-i; } xfk[3].m=4; xfk[3].n=0; break; case 3:
62、 for(int i=0;i<3;i++){//循環(huán)語(yǔ)句 xfk[i].m=4+i; xfk[i].n=1; } xfk[3].m=6; xfk[3].n=0; break; default: break; } } p
63、ublic void turn(){//旋轉(zhuǎn)方法 int m,n; switch(state){ case 0: if(xfk[1].m>0){ m=xfk[0].m+1;//第一個(gè)小方塊的橫坐標(biāo)的值加1,并賦值給m n=xfk[0].n+1;//第一個(gè)小方塊的縱坐標(biāo)的值加1,并賦值給n for(int i=0;i<3;i++){//循環(huán)語(yǔ)句 xfk[i].m=m-i;
64、 xfk[i].n=n; } xfk[3].m=m-2; xfk[3].n=n+1; } else{ turn(); state=0; } break; case 1:
65、 m=xfk[0].m-1; n=xfk[0].n+1; for(int i=0;i<3;i++){ xfk[i].m=m; xfk[i].n=n-i; } xfk[3].m=m-1; xfk[3].n=n-2; break; case 2:
66、 if(xfk[0].m<11){ m=xfk[0].m-1; n=xfk[0].n-1; for(int i=0;i<3;i++){ xfk[i].m=m+i; xfk[i].n=n; } xfk[3].m=m+2; xfk[3].n=n-1; } else{ turn(); state=2; } break; case 3: m=xfk[0].m+1; n=xfk[0].n-1
- 溫馨提示:
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. 裝配圖網(wǎng)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 6.煤礦安全生產(chǎn)科普知識(shí)競(jìng)賽題含答案
- 2.煤礦爆破工技能鑒定試題含答案
- 3.爆破工培訓(xùn)考試試題含答案
- 2.煤礦安全監(jiān)察人員模擬考試題庫(kù)試卷含答案
- 3.金屬非金屬礦山安全管理人員(地下礦山)安全生產(chǎn)模擬考試題庫(kù)試卷含答案
- 4.煤礦特種作業(yè)人員井下電鉗工模擬考試題庫(kù)試卷含答案
- 1 煤礦安全生產(chǎn)及管理知識(shí)測(cè)試題庫(kù)及答案
- 2 各種煤礦安全考試試題含答案
- 1 煤礦安全檢查考試題
- 1 井下放炮員練習(xí)題含答案
- 2煤礦安全監(jiān)測(cè)工種技術(shù)比武題庫(kù)含解析
- 1 礦山應(yīng)急救援安全知識(shí)競(jìng)賽試題
- 1 礦井泵工考試練習(xí)題含答案
- 2煤礦爆破工考試復(fù)習(xí)題含答案
- 1 各種煤礦安全考試試題含答案