版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
Java俄羅斯方塊游戲的設(shè)計1.課程設(shè)計的目的Java,語言是一種跨域平臺、適合于分布式計算環(huán)境的面向?qū)ο缶幊陶Z言。它具有的特點很多,如簡單性、面向?qū)ο?、分布式、解釋型、可靠性、平安性、平臺無關(guān)性、可移植性、多線性、動態(tài)性等。面向?qū)ο蟮拈_發(fā)方法是當(dāng)今世界最流行的開發(fā)方法,它不僅具有更貼近自然的語義,而且有利于軟件的維護(hù)和繼承。為了進(jìn)一步加深對Java語言的認(rèn)識,包括概念、其面向?qū)ο蟮奶匦约捌鋵嶋H應(yīng)用,穩(wěn)固在課堂上所學(xué)到的知識,進(jìn)行一次全面的綜合訓(xùn)練,提高學(xué)生熟練的應(yīng)用面向?qū)ο蟮乃枷牒驮O(shè)計方法解決實際問題的能力。靈活掌握類與對象的運(yùn)用,掌握構(gòu)造方法、類的繼承、圖形界面設(shè)計等設(shè)計方法。2.設(shè)計方案論證2.1設(shè)計思路本系統(tǒng)界面左側(cè)是游戲界面。可以進(jìn)行游戲操作,操控方塊的移動。鍵盤的左右方向鍵的控制方塊的左移和右移,方向上建可以控制方塊的翻轉(zhuǎn),方向下鍵可加快方塊的下落速度。當(dāng)堆積的方塊填滿一行時,可以消除該行,否那么當(dāng)方塊堆積到最上方時,游戲結(jié)束,你可以選擇繼續(xù)游戲或者退出游戲。系統(tǒng)界面的右側(cè)為選項和現(xiàn)實界面。共可分為三個局部。最上側(cè)為游戲的控制選項??刂七x項包括四種功能,開始游戲、提高級數(shù)、降低級數(shù)、退出游戲。其二,為游戲的信息顯示界面,此界面可以顯示當(dāng)前游戲的等級和所得分?jǐn)?shù)。最下側(cè)為圖形現(xiàn)實界面,可以顯示當(dāng)前方塊的類型。方便游戲的操作。剛進(jìn)入游戲,系統(tǒng)會提示“歡送來到游戲〞,確認(rèn)后開始游戲。當(dāng)游戲結(jié)束時,系統(tǒng)提示“gameover〞。2.2設(shè)計方法這個程序共包含了1個.JAVA源文件,有14個類文件,分別來控制游戲的主界面,控制面板,俄羅斯方塊的隨機(jī)產(chǎn)生。利用FK類的實現(xiàn)方塊:這個類繼承線程類,用來控制塊的移動、下落、變形等,方塊的總類共有7種,根據(jù)不同的翻轉(zhuǎn)情況,對應(yīng)28種狀態(tài)。在這個類中用構(gòu)造方法來實現(xiàn)某個具體的方塊,方法中的參數(shù)有style,對應(yīng)那28中狀態(tài)中的一個,x,y控制起始位置level是游戲的等級也就是方塊下落的速度。主框架類Mwl是Jpanel類的子類主,框架類將包含現(xiàn)實類面板和控制類面板,構(gòu)成整個系統(tǒng)的框架,課設(shè)置容器布局,添加菜單??刂泼姘孱怌ontrol是Jpanel類的子類,可以按網(wǎng)格布局添加控制按鈕,添加邊框。設(shè)置四個按鈕?!伴_始游戲〞、“退出游戲〞、“提高級數(shù)〞、“降低級數(shù)〞。預(yù)覽面板類ShowNext顯示下一個方塊。在預(yù)覽框內(nèi)實現(xiàn)隨機(jī)產(chǎn)生不同顏色和種類的小方塊。定義一個參數(shù)用以給不同的方塊取不同顏色。定義分?jǐn)?shù)面板類show用來顯示分?jǐn)?shù)和關(guān)數(shù)。添加三個標(biāo)簽,并設(shè)置字體格式按網(wǎng)格布局添加三個標(biāo)簽,設(shè)置標(biāo)簽格式,加邊框。三個標(biāo)簽分別“得分〞,“難度等級〞,“next〞。聯(lián)合類Unit新建三個面板對象,將以上產(chǎn)生的三個面板添加到總的控制面板上??蓸?gòu)造函數(shù),按網(wǎng)格布局添加三個面板對象到總的控制面板上,control、show、shownext。 俄羅斯游戲方塊面板類RussiaPanel主要控制游戲的運(yùn)行。定義多個參數(shù),設(shè)定為分?jǐn)?shù)、級數(shù)、存取時間參數(shù)、當(dāng)前方塊的參數(shù)等。設(shè)初始的分?jǐn)?shù)為0,等級為1。建立七個方塊模型,分別為其設(shè)置填充顏色。假設(shè)滿一行時,自動消去該行,分?jǐn)?shù)并加100。所有俄羅斯方塊的父類。FK設(shè)置每個俄羅斯方塊由4個小方塊構(gòu)成,定義長條的狀態(tài)。其下共設(shè)置了7個子類,F(xiàn)K1〔長條形類〕、FK2〔正Z形類〕、FK3〔T形類〕、FK4〔L形類〕。FK5〔L2形類〕。游戲系統(tǒng)中類及其之間的關(guān)系圖如下列圖〔1〕MMwlUnitRussiaPanelShowNextControlShowFK圖〔1〕系統(tǒng)中的類及其之間的關(guān)系圖2.3功能模塊此俄羅斯方塊游戲程序是一個簡單的游戲程序,操作簡單,可玩性高??梢愿鶕?jù)自己的實力調(diào)節(jié)難度。方塊的控制設(shè)置了7種方塊的模型,共27種狀態(tài),利用鍵盤的方向鍵可以控制方塊的左右移動、翻轉(zhuǎn)和下落。游戲規(guī)那么當(dāng)已經(jīng)下落的方塊可以填滿一行的時候,該行便可以消除,本游戲也可以支持多行消除,當(dāng)方塊累加到窗口上方時,就視為游戲失敗,那么游戲便結(jié)束,當(dāng)游戲結(jié)束時你可以選擇繼續(xù)游戲或者是退出游戲。顯示界面的設(shè)計游戲顯示界面局中,可以進(jìn)行游戲操作。右側(cè)顯示界面,可以顯示游戲分?jǐn)?shù),初始值為0,每當(dāng)方塊填滿一行時,該行消除,分?jǐn)?shù)那么增加100。顯示界面還可以顯示當(dāng)前游戲難度,根據(jù)個人實力升高或降低等級難度。等級系統(tǒng)在顯示界面上設(shè)置兩個按鈕,分別為“提高等級〞,“降低等級〞。通過點擊可以提控制游戲難度,難度共為5級。菜單設(shè)置為了方便游戲操作,還預(yù)設(shè)了菜單設(shè)置,菜單子欄下可以選擇開始游戲和退出游戲。游戲開始生成任意方塊,在屏幕中顯示方塊,檢查方格塊是否占用頂行游戲開始生成任意方塊,在屏幕中顯示方塊,檢查方格塊是否占用頂行方塊掉落退出游戲執(zhí)行方塊控制信息去除滿行增加得分停止移動檢查滿行判斷方塊是否受阻YNYNYN圖〔2〕游戲運(yùn)行流程圖2.5功能結(jié)構(gòu)圖俄羅斯方塊游戲俄羅斯方塊游戲功能運(yùn)行模塊界面布局模塊面板類初始化主框架及布局方塊的7種模型鍵盤事件及按鈕監(jiān)聽游戲難度設(shè)置自動消行及分?jǐn)?shù)顯示菜單功能設(shè)置圖〔3〕功能結(jié)構(gòu)圖2.6類、方法、屬性說明Mwl類Mwl為主框架類〔游戲主類,繼承Jframe類,負(fù)責(zé)全游戲的控制?!吃擃愑玫降念惾缦拢篿mportjavax.swing.*;//導(dǎo)入高級抽象窗口,完成更高級的功能importjava.awt.*;//導(dǎo)入java.awt包提供生成各種標(biāo)準(zhǔn)圖形界面元素和處理圖形界面的類庫importjava.awt.event.*;//導(dǎo)入抽象窗口類事件包〔1〕.main()為程序入口函數(shù):publicstaticvoidmain(String[]args){//繪制程序界面Mwlf=newMwl();f.setSize(450,530);f.show();}publicvoiditemStateChanged(ItemEvente)//{}publicvoidactionPerformed(ActionEvente)//菜單監(jiān)聽器的實現(xiàn)細(xì)節(jié){ if(e.getActionCommand()=="退出")//如果按退出鍵那么退出 System.exit(0); if(e.getActionCommand()=="新游戲")//按新游戲鍵,清空顯示屏幕并重置 { p.uu.control.b4.setEnabled(true); p.uu.control.b5.setEnabled(true);p.reset();p.uu.control.b1.setLabel("點擊繼續(xù)玩");//將按開始按扭標(biāo)簽置換為重玩一次if(!p.GameOver()){p.clean();p.t.suspend();}else{ p.clean(); p.t.resume();} }}}〔2〕Mwl〔〕為創(chuàng)立的構(gòu)造函數(shù),初始化窗體界面:setSize()設(shè)置窗口大小——窗口的大小setLocation()_利用屏幕和主窗體的大小差值,使窗口居中;createMenu()——建立并設(shè)置和窗口菜單控制面板類Control控制面板類Control是jpanel的子類,定義了四個按鈕,分別為Buttonb1,b2,b3,b4在界面中按網(wǎng)格布局添加控制按鈕,添加邊框。{ setLayout(newGridLayout(4,1,0,5));//定義布局GridLayout,使按鈕豎向排列add(b1);this.setBorder(c);add(b4);add(b5);add(b2);}}〔1〕Border是視圖類的函數(shù)成員setBorder設(shè)置當(dāng)前選中圖形中一組文字單元的邊框,一組文字單元互相靠在一起,可以被看作表格,此函數(shù)用來設(shè)置表格的邊線和內(nèi)線?!?〕GridLayoutGridLayout是一個非常強(qiáng)大的布局管理器,它可以實現(xiàn)很多復(fù)雜的布局。publicGridLayout(introws,intcols,inthgap,intvgap) rows-行數(shù),0表示每列可有任意行。cols-列數(shù),0表示每行可有任意列。hgap-水平間距。vgap-垂直間距。預(yù)覽面板類ShowNext在預(yù)覽框內(nèi)實現(xiàn)隨機(jī)產(chǎn)生不同顏色和種類的小方塊。定義繪圖函數(shù)paintpublicvoidpaint(Graphicsg){//繪制小方塊,隨機(jī)設(shè)置隨機(jī)產(chǎn)生的七種小方塊的顏色。 g.setColor(Color.LIGHT_GRAY);//繪制預(yù)覽框的背景網(wǎng)格,按三維形式填充網(wǎng)格,設(shè)顏色為灰色 for(inti=0;i<=5;i++)for(intj=0;j<=4;j++){g.fill3DRect(i*25,j*25,25,25,true);}定義col,用以給不同方塊取不同色g.setColor(col[s]);//以S傳值獲取顏色col[]={Color.cyan,Color.red,Color.green,Color.blue,Color.magenta,Color.orange,Color.PINK};預(yù)覽面板類ShowNext俄羅斯游戲方塊面板類,調(diào)用了Unit類,設(shè)置了面板的顯示。classRussiaPanelextendsJPanelimplementsRunnable,KeyListener,ActionListener{ Unituu=newUnit(); 參數(shù)設(shè)置定義分?jǐn)?shù),存取得分多少intShowScore;定義級數(shù),初始設(shè)為1級 intlever=1;定義rr,值取隨機(jī),顯示下一個方塊的重要參staticintrr=(int)(Math.random()*7);顯示當(dāng)前方塊的參數(shù)staticintr=(int)(Math.random()*7);用以存取時間參數(shù)staticinttt=500;定義時間inttime=tt;/決定當(dāng)前運(yùn)動方塊形狀staticintco;〔2〕函數(shù)設(shè)置Clean清空當(dāng)前屏幕publicvoidclean(){ for(inti=0;i<12;i++){//去除當(dāng)前所有方塊for(intj=0;j<18;j++){map[i][j]=0;}}repaint();//重新畫游戲面板,實現(xiàn)清屏ShowScore=0;//得分參數(shù)歸零uu.show.s1.setText("得分:0");//得分設(shè)為零lever=1;//級別設(shè)為一級time=tt=500;//時間為500秒t.suspend();uu.show.repaint();//顯示游戲刷新}Reset方塊的產(chǎn)生publicvoidreset(){intr=rr;dqfk=fk[r]; rr=(int)(Math.random()*7);//重取隨機(jī)數(shù),用以確定下一個方塊 co=r;//獲取局部變量uu.shownext.s=rr;//穿參數(shù)值用以顯示下一個uu.shownext.repaint();dqfk.reset();}Uplevel增加難度publicvoiduplevel()if(tt>100) tt-=100; time=tt;}Downlevel降低難度publicvoiddownlevel(){if(tt<500) tt+=100; time=tt;}Paint繪制方塊publicvoidpaint(Graphicsg)super.paint(g);g.setColor(Color.darkGray);//將顯示窗口用灰色小方塊填充for(inti=0;i<12;i++){for(intj=0;j<18;j++){if(map[i][j]==0){g.fill3DRect(i*25,j*25,25,25,true);}}}3設(shè)計結(jié)果與分析本游戲的操作簡單,用戶啟動游戲后,即進(jìn)入游戲,屏幕開始顯示為歡送畫面。用戶選擇[開始游戲],就可以開始玩游戲了,當(dāng)用戶想暫停時,再次按一下[stop]按鈕,游戲就暫停了,在暫停的情況下再按[goon]按鈕,游戲繼續(xù)運(yùn)行。任何時候按[exit]按鈕,游戲都會終止。用戶可以選擇[lvup]或[lvdown]。在dos下運(yùn)行游戲,結(jié)果如下圖圖〔4〕進(jìn)入游戲右邊信息窗體的布局分別包括開始游戲、提高級數(shù)、降低級數(shù)、退出游戲5個按鈕,使用者可以根據(jù)自己的需求選擇不同的按鈕。游戲畫布類:小方塊邊長:finalint0unitSize=30正方格的行數(shù):introwNum方格的列數(shù):intcolumnNum允許有多少行未削:intmaxAllowRowNum新出現(xiàn)塊的起始行坐標(biāo):intblockInitRow出現(xiàn)塊的起始列坐標(biāo):intblockInitCol屏幕數(shù)組:int[][]scrArr游戲界面如下圖,方塊自由下落,用戶可以進(jìn)行操作。圖5開始游戲如果方塊填滿一行時,此行方塊便可以消失,此時分?jǐn)?shù)那么加100,函數(shù)如下所示:voidrefresh(){//判斷如果滿行那么消去此行,for(inti=0;i<18;i++){if(isFullLine(i)){refresh(i);}}}booleanisFullLine(intm){//消行的具體方法,清空此行for(inti=0;i<12;i++){if(map[i][m]==0){returnfalse;}}returntrue;}voidrefresh(intm){ShowScore+=100;//假設(shè)滿一行那么加一百分,并將小方塊下移一行for(inti=m;i>0;i--){for(intj=0;j<12;j++){map[j][i]=map[j][i-1];}}顯示分?jǐn)?shù)如下圖圖6得分后當(dāng)方塊占用首行時,系統(tǒng)認(rèn)定游戲結(jié)束,你已經(jīng)失敗了,并顯示所得分?jǐn)?shù)圖(7)游戲結(jié)束圖〔8〕顯示所得分?jǐn)?shù)當(dāng)游戲結(jié)束時,點擊菜單項選擇項,可以選擇[新游戲]或者[退出游戲]、圖〔9〕菜單設(shè)置4.設(shè)計心得體會通過這次課程設(shè)計穩(wěn)固和加深學(xué)生所學(xué)的專業(yè)理論知識,充分將課堂所學(xué)的知識轉(zhuǎn)化為實際應(yīng)用,提高了個人設(shè)計、計算機(jī)應(yīng)用、報告撰寫、獲取信息等根本技能;培養(yǎng)學(xué)生獨(dú)立分析和解決實際問題的能力。通過該課程設(shè)計,深入的了解在實際情況下,java開發(fā)語言的實際應(yīng)用,對java程序設(shè)計有了初步的,整體的認(rèn)識。對程序的結(jié)構(gòu)有了系統(tǒng)的概念可以讀懂一般小程序。,現(xiàn)在通過自己動手做實驗,從實踐上認(rèn)識了Java是如何編寫命令的,如何協(xié)調(diào)計算機(jī)內(nèi)部各個部件運(yùn)行,對計算機(jī)編譯原理的認(rèn)識更加深刻。課程設(shè)計中程序比擬復(fù)雜,在調(diào)試時應(yīng)該仔細(xì),在程序調(diào)試時,注意構(gòu)造,將不必要的命令去除。做課程設(shè)計的過程是一個學(xué)習(xí)和交流的過程,不僅可以穩(wěn)固和更新知識,還提高個人的溝通交流的能力,提高了個人的團(tuán)隊合作意識。5.參考文獻(xiàn)[1]謝宋和,甘勇.單片機(jī)模糊控制系統(tǒng)設(shè)計與應(yīng)用實例[M].北京:電子工業(yè)出版社,1999.5:20-25[2]范立南,謝子殿.單片機(jī)原理及應(yīng)用教程[M].北京:北京大學(xué)出版社,2006.1:123-130[3]范立南,韓曉微,王忠石等.基于多結(jié)構(gòu)元的噪聲污染灰度圖像邊緣檢測研究[4].武漢大學(xué)學(xué)報(工學(xué)版),2003,49(3):45-49六.附錄代碼importjavax.swing.*;//導(dǎo)入高級抽象窗口,完成更高級的功能importjava.awt.*;//導(dǎo)入java.awt包提供生成各種標(biāo)準(zhǔn)圖形界面元素和處理圖形界面的類庫importjava.awt.event.*;//導(dǎo)入抽象窗口類事件包importjava.util.*;importjavax.swing.border.*;importjava.applet.*;//定義分?jǐn)?shù)面板類,用來顯示分?jǐn)?shù)和關(guān)數(shù)。添加三個標(biāo)簽,并設(shè)置字體格式classShowextendsJPanel{LineBorderc=newLineBorder(Color.red,3,true);Fontb=newFont("Braggadcoio",Font.BOLD,18);Labels1=newLabel("mark:0"); Labels2=newLabel("yourlv:1"); Labels3=newLabel("NEXT"); Show()//按網(wǎng)格布局添加三個標(biāo)簽,設(shè)置標(biāo)簽格式,加邊框 { setLayout(newGridLayout(3,1));this.setBorder(c);s1.setFont(b);s3.setFont(b);s2.setFont(b); add(s2); add(s1); add(s3); }}//定義控制面板類,新建并添加控制按鈕。classControlPanelextendsJPanel{LineBorderc=newLineBorder(Color.black,3,true);Buttonb1=newButton("Start");//定義按鈕,設(shè)置按鈕名稱Buttonb2=newButton("exit");Buttonb4=newButton("lvup");Buttonb5=newButton("lvdown");ControlPanel()//按網(wǎng)格布局添加控制按鈕,添加邊框。{ setLayout(newGridLayout(4,1,0,5));//定義布局GridLayout,使按鈕豎向排列add(b1);this.setBorder(c);add(b4);add(b5);add(b2);}}//定義預(yù)覽面板類,顯示下一個。在預(yù)覽框內(nèi)實現(xiàn)隨機(jī)產(chǎn)生不同顏色和種類的小方塊。classShowNextextendsPanel{ints;publicvoidpaint(Graphicsg){//繪制小方塊,隨機(jī)設(shè)置隨機(jī)產(chǎn)生的七種小方塊的顏色。 g.setColor(Color.LIGHT_GRAY);//繪制預(yù)覽框的背景網(wǎng)格,按三維形式填充網(wǎng)格,設(shè)顏色為灰色 for(inti=0;i<=5;i++)for(intj=0;j<=4;j++){g.fill3DRect(i*25,j*25,25,25,true);} Colorcol[]={Color.cyan,Color.red,Color.green,Color.blue,Color.magenta,Color.orange,Color.PINK}; //定義col,用以給不同方塊取不同色 g.setColor(col[s]);//以S傳值獲取顏色 switch(s)//在顯示下一個面板中畫方塊形狀{case0: for(inti=0;i<4;i++){intm=i;intn=1;g.fillRoundRect(m*25,n*25,25,25,6,6);//填充方法g.draw3DRect(m*25,n*25,25,25,true);//描邊方法 }break; case1: for(inti=0;i<2;i++) {intm=2;intn=i+1;g.fillRoundRect(m*25,n*25,25,25,6,6);g.draw3DRect(m*25,n*25,25,25,true);}for(inti=2;i<4;i++){intm=1;intn=i;g.fillRoundRect(m*25,n*25,25,25,6,6);g.draw3DRect(m*25,n*25,25,25,true);}break;case2:for(inti=0;i<3;i++){intm=1+i;intn=2;g.fillRoundRect(m*25,n*25,25,25,6,6);g.draw3DRect(m*25,n*25,25,25,true);}intm=2;intn=1;g.fillRoundRect(m*25,n*25,25,25,6,6);g.draw3DRect(m*25,n*25,25,25,true);break; case3: for(inti=0;i<3;i++){m=1;n=i+1;g.fillRoundRect(m*25,n*25,25,25,6,6);g.draw3DRect(m*25,n*25,25,25,true);}m=2;n=3;g.fillRoundRect(m*25,n*25,25,25,6,6);g.draw3DRect(m*25,n*25,25,25,true);break; case4: for(inti=0;i<3;i++){m=2;n=i+1;g.fillRoundRect(m*25,n*25,25,25,6,6);g.draw3DRect(m*25,n*25,25,25,true);}m=1;n=3;g.fillRoundRect(m*25,n*25,25,25,6,6);g.draw3DRect(m*25,n*25,25,25,true);break; case5: for(inti=0;i<2;i++){m=1+i;n=1;g.fillRoundRect(m*25,n*25,25,25,6,6);g.draw3DRect(m*25,n*25,25,25,true);}for(inti=2;i<4;i++){m=i-1;n=2;g.fillRoundRect(m*25,n*25,25,25,6,6);g.draw3DRect(m*25,n*25,25,25,true);}break; case6: for(inti=0;i<2;i++){m=1;n=i+1;g.fillRoundRect(m*25,n*25,25,25,6,6);g.draw3DRect(m*25,n*25,25,25,true);}for(inti=2;i<4;i++){m=2;n=i;g.fillRoundRect(m*25,n*25,25,25,6,6);g.draw3DRect(m*25,n*25,25,25,true);}break; }}}//聯(lián)合類,新建三個面板對象,將以上產(chǎn)生的三個面板添加到總的控制面板上classUnitextendsJPanel{ControlPanelcontrol=newControlPanel();Showshow=newShow();ShowNextshownext=newShowNext(); Unit()//構(gòu)造函數(shù),按網(wǎng)格布局添加三個面板對象到總的控制面板上 {setLayout(newGridLayout(3,1)); add(control); add(show); add(shownext); }}//俄羅斯游戲方塊面板類,classRussiaPanelextendsJPanelimplementsRunnable,KeyListener,ActionListener{ Unituu=newUnit(); intShowScore;//定義分?jǐn)?shù),存取得分多少 intlever=1;//定義級數(shù),初始設(shè)為1級FKdqfk;FK[]fk=newFK[7];staticintrr=(int)(Math.random()*7);//定義rr,值取隨機(jī),顯示下一個方塊的重要參數(shù)staticintr=(int)(Math.random()*7);//顯示當(dāng)前方塊的參數(shù)staticinttt=500;//用以存取時間參數(shù)inttime=tt;//定義時間staticintco;//決定當(dāng)前運(yùn)動方塊形狀int[][]map=newint[12][35];publicvoidclean()//對當(dāng)前屏幕清空{(diào) for(inti=0;i<12;i++){//去除當(dāng)前所有方塊for(intj=0;j<18;j++){map[i][j]=0;}}repaint();//重新畫游戲面板,實現(xiàn)清屏ShowScore=0;//得分參數(shù)歸零uu.show.s1.setText("mark:0");//得分設(shè)為零lever=1;//級別設(shè)為一級time=tt=500;//時間為500秒t.suspend();uu.show.repaint();//顯示游戲刷新}publicvoidreset(){//重設(shè)小方塊,隨機(jī)產(chǎn)生小方塊intr=rr;dqfk=fk[r]; rr=(int)(Math.random()*7);//重取隨機(jī)數(shù),用以確定下一個方塊 co=r;//獲取局部變量uu.shownext.s=rr;//穿參數(shù)值用以顯示下一個uu.shownext.repaint();dqfk.reset();}publicvoiduplevel()//減少方塊下落時間來提高難度{if(tt>100) tt-=100; time=tt;}publicvoiddownlevel()//增加方塊下落時間來降低難度{if(tt<500) tt+=100; time=tt;}RussiaPanel(Unitz){//對控制按鈕添加監(jiān)聽器,新建七種方塊并繪制背景圖uu=z;addKeyListener(this);uu.control.b1.addActionListener(this);uu.control.b4.addActionListener(this);uu.control.b5.addActionListener(this);uu.control.b2.addActionListener(this);fk[0]=newFK1();fk[1]=newFK2();fk[2]=newFK3();fk[3]=newFK4();fk[4]=newFK5();fk[5]=newFK6();fk[6]=newFK7();this.reset();for(inti=0;i<7;i++){fk[i].setMap(map);}}publicvoidpaint(Graphicsg){//在顯示窗口繪制小方塊,產(chǎn)生不同顏色的小方塊super.paint(g);g.setColor(Color.yellow);//將顯示窗口用灰色小方塊填充for(inti=0;i<12;i++){for(intj=0;j<18;j++){if(map[i][j]==0){g.fill3DRect(i*25,j*25,25,25,true);}}}Colorcol[]={Color.cyan,Color.red,Color.green,Color.blue,Color.magenta,Color.orange,Color.PINK};g.setColor(Color.cyan);//設(shè)置落下停止的小方塊顏色為cyanfor(inti=0;i<12;i++){//假設(shè)存在小方塊,那么三維填充for(intj=0;j<18;j++){if(map[i][j]==1){g.fillRoundRect(i*25,j*25,25,25,4,4);g.getColor();}}}g.setColor(Color.yellow);//設(shè)置方塊邊框的顏色為黃色for(inti=0;i<12;i++){for(intj=0;j<18;j++){if(map[i][j]==1){g.drawRoundRect(i*25,j*25,25,25,4,4);g.getColor();}}}g.setColor(col[co]);//給小方塊填充不同的顏色for(inti=0;i<4;i++){intm=dqfk.xfk[i].m;intn=dqfk.xfk[i].n;g.fillRoundRect(m*25,n*25,25,25,4,4);g.drawRoundRect(m*25,n*25,25,25,4,4);g.getColor();}g.setColor(Color.blue);//設(shè)置所產(chǎn)生的小方塊的邊框為黃色for(inti=0;i<4;i++){intm=dqfk.xfk[i].m;intn=dqfk.xfk[i].n;g.drawRoundRect(m*25,n*25,25,25,5,5);g.getColor();}g.setColor(Color.blue);g.setColor(col[rr]);}voidrefresh(){//判斷如果滿行那么消去此行for(inti=0;i<18;i++){if(isFullLine(i)){refresh(i);}}}booleanisFullLine(intm){//消行的具體方法,清空此行for(inti=0;i<12;i++){if(map[i][m]==0){returnfalse;}}returntrue;}voidrefresh(intm){ShowScore+=100;//假設(shè)滿一行那么加一百分,并將小方塊下移一行for(inti=m;i>0;i--){for(intj=0;j<12;j++){map[j][i]=map[j][i-1];}}uu.show.s1.setText("mark:"+ShowScore);//顯示得分uu.show.s2.setText("yourlv:"+lever);//顯示難度}booleanGameOver(){//如果頂行被占,那么游戲結(jié)束for(inti=0;i<12;i++){if(map[i][0]==1)returntrue;}returnfalse;}publicvoidrun(){//方塊下移while(true){if(dqfk.canMove(KeyEvent.VK_DOWN))//判斷是否能下移dqfk.move(KeyEvent.VK_DOWN);//滿足條件那么下移else{for(inti=0;i<4;i++){//否那么停止并繪制小方塊intm=dqfk.xfk[i].m;intn=dqfk.xfk[i].n;map[m][n]=1;}refresh();if(!GameOver())//假設(shè)游戲沒結(jié)束reset();//再產(chǎn)生小方塊else//假設(shè)結(jié)束,那么可以增加關(guān)數(shù),顯示對話框,游戲結(jié)束,清空屏幕{this.transferFocusBackward();uu.control.b4.setEnabled(true);uu.control.b5.setEnabled(true);JOptionPane.showMessageDialog(this,"GAMEOVER!");JOptionPane.showMessageDialog(this,"mark"+ShowScore);uu.control.b1.setLabel("again");t.suspend();clean();}}this.repaint();try{//線程休眠,拋出異常Thread.sleep(time);}catch(InterruptedExceptionex){}}}publicvoidkeyPressed(KeyEvente){//實現(xiàn)鍵盤監(jiān)聽器,intkey=e.getKeyCode();//得到當(dāng)前鍵值switch(key){if(dqfk.canTurn())dqfk.turn();this.repaint();break;if(dqfk.canMove(KeyEvent.VK_LEFT)){ dqfk.move(KeyEvent.VK_LEFT);this.repaint();}break;if(dqfk.canMove(KeyEvent.VK_RIGHT)){dqfk.move(KeyEvent.VK_RIGHT);this.repaint();}break;time=60;break;default:break;}repaint();}publicvoidkeyReleased(KeyEvente){//釋放鍵位時方塊下降intkey=e.getKeyCode();if(key==KeyEvent.VK_DOWN)time=tt;}publicvoidkeyTyped(KeyEvente){//鍵的類型,方法為空}Threadt=newThread(this);//新建線程publicvoidactionPerformed(ActionEvente)//實現(xiàn)控制按鈕監(jiān)聽器的具體方法{if(e.getActionCommand().equals("AGAIN"))//菜單按鍵方法實現(xiàn)。點擊此鍵,將不能再點擊控制難度按鍵 { uu.control.b4.setEnabled(false); uu.control.b5.setEnabled(false); uu.control.b1.setLabel("goon");//將按鈕標(biāo)題替換為暫停 t.resume(); reset(); this.requestFocus(true);}if(e.getActionCommand().equals("again")){ uu.control.b1.setLabel("stop");t.resume();this.requestFocus(true);}if(e.getActionCommand().equals("Start")) //控制按鈕,游戲開始,點擊此鍵,將不能再點擊控制難度按鍵 { uu.control.b4.setEnabled(false); uu.control.b5.setEnabled(false);t.start();uu.control.b1.setLabel("stop");//將按鈕標(biāo)題替換為暫停this.requestFocus(true);}if(e.getActionCommand().equals("again")) {//假設(shè)點擊繼續(xù),那么替換標(biāo)簽為暫停uu.control.b1.setLabel("stop");t.resume();this.requestFocus(true);}if(e.getActionCommand().equals("lvup"))//點擊此按鈕,提高級數(shù){ if(lever<5) lever++;//級數(shù)增加1級uplevel();//調(diào)用升級函數(shù)uu.show.s2.setText("yourlv:"+lever);//顯示當(dāng)前關(guān)數(shù)this.requestFocus(true);}if(e.getActionCommand().equals("lvdown"))//點擊此按鈕,降低級數(shù){ if(lever>1) lever--;
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025教師個人工作計劃總結(jié)
- 9月份營銷工作計劃范文
- 關(guān)于每日工作計劃模板錦集
- 2025春季學(xué)期幼兒園食堂工作計劃
- 食堂后勤管理個人工作計劃
- 4科技綜治和平安建設(shè)工作計劃
- 4寧夏:某年教育民生計劃發(fā)布
- 《大孔樹脂分離技術(shù)》課件
- 《多元函數(shù)》課件
- 《型材料的研制》課件
- 機(jī)電產(chǎn)品設(shè)計奧秘探究知到章節(jié)答案智慧樹2023年青島濱海學(xué)院
- 新外研版高中英語必修第一冊Unit 6教學(xué)設(shè)計
- 2023版中國近現(xiàn)代史綱要課件:05第五專題 中國人民在精神上由被動轉(zhuǎn)為主動
- 快樂孕育孕婦學(xué)校高級教程孕產(chǎn)期心理保健
- AI時代大學(xué)生創(chuàng)新創(chuàng)業(yè)導(dǎo)航智慧樹知到答案章節(jié)測試2023年西南大學(xué)
- 臥式罐剩余體積與液位關(guān)系計算方式-excel
- 公共政策案例分析例文范文(通用9篇)
- 三年級上冊道德與法治知識點 解答題50道 部編版(含答案)
- 富士康公司組織架構(gòu)及部門職責(zé)
- 庫區(qū)倒罐作業(yè)操作規(guī)程
- 二年級下冊乘除法口算題
評論
0/150
提交評論