



版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、JAVA程序設計課程設計之俄羅斯方塊年級: 13 級班級: T412 網絡工程指導老師:朱林小組成員:20138346021 許浩洋1時間: 2015 年 11 月 11 日目錄摘要 .第一章課程設計要求 .第二章設計概要 .2.1功能設計 .2.2功能分析 .2.2.1系統操作界面 .2.2.2程序主要功能說明 .第三章調試分析與測試結果 .3.1游戲運行界面 .3.2測試項目 .3.2.1功能區按鍵測試 .3.2.2鍵盤功能測試 .3.2.3游戲結束測試 .第四章設計總結 .4.1改進意見 .4.2Java 課程設計心得體會 .2摘要在現代,高科技的飛躍發展,人們工作習慣的改變,特別是電腦
2、的大量普及,人們生活節奏越來越快,一些有趣的桌面游戲已經成為人們在使用計算機進行工作或學習之余休閑娛樂的首選,而俄羅斯方塊游戲是人們最熟悉的小游戲之一。俄羅斯方塊( Tetris, 俄文: )是一款風靡全球的電視游戲機和掌上游戲機游戲,它由俄羅斯人阿列克謝·帕基特諾夫發明,故得此名。俄羅斯方塊的基本規則是移動、旋轉和擺放游戲自動輸出的各種方塊,使之排列成完整的一行或多行并且消除得分。由于上手簡單、老少皆宜,從而家喻戶曉,風靡世界。為此,我們設計了一款簡單的俄羅斯方塊 JAVA游戲程序,以便更好的滿足廣大電腦工作者閑暇之余的消遣,并且也讓我們學到編程技術與團隊意識。關鍵字 :俄羅斯方塊
3、、 JAVA游戲、編程第一章 課程設計要求題目名稱 :俄羅斯方塊題目類型 :設計型課程設計目的 :1) 了解 Java 的基本使用方法。12) 熟悉 eclipse 的運行環境。3) 用 JAVA來設計一個俄羅斯方塊的小游戲。4) 基本實現俄羅斯方塊的應用功能。實驗原理 :JAVA程序分析與設計、類的靈活運用、多態技術、模板技術、異常處理等。實驗內容 :本俄羅斯方塊游戲是對于隨機給出不同的形狀(長條形、Z 字形、反 Z形、田字形、 L 字形、反 L 形、 T 字型)下落填充給定的區域,若填滿一條便消掉,記分。若在游戲中各形狀填滿了給定區域,為輸者。第二章設計概要2.1功能設計本項目是為了實現俄
4、羅斯方塊的基本功能而設計的,基本能夠達到俄羅斯方塊的各種游戲性。項目需求分析如下:1)由方塊組成的不同的隨機圖形會從區域上方開始緩慢落下。2) 玩家可以做的操作有:以 90 度為單位旋轉方每一格塊。以格子為單位左右移動方塊,讓方塊加速落下。3) 方塊移到區域最下方或是著地到其他方塊上無法移動時,就會固定在該處,而新的隨機圖形會出現在區域上方開始落下。4) 當區域中某一列橫向格子全部由方塊填滿,則該列會自動消除并成為玩家的得分。25)一次性銷毀不同行數方塊得分不同,一行1 分,兩行 2 分,三行 5 分,四行10 分。6) 當固定的方塊堆到區域最上方,則游戲結束。2.2功能分析系統操作界面處理玩
5、家操作程序主要功能說明1. 面板畫筆類代碼:packageTetris;importimportimportimportimportimport3importimportimportimportpublicclassTetrisPanelextendsJPanel/ 游戲主面板 20 行 10 列privatestaticfinalintROWS= 20;privatestaticfinalintCOLS = 10;/ 代表方塊著陸的墻privateCellwall=new CellROWSCOLS;/ 定義每一小塊的大小privatestaticfinalintCELL_SIZE= 25;/
6、 游戲得分privateintscore;/ 游戲銷毀行數privateintlines;/ 一次性銷毀行數的計分標準( 0 行 =0 分, 1 行 =1 分, 2 行 =4 分 ,3 行 =10 分,4 行 =20 分)privatestaticfinalintSCORE_LEVEL =0,1,4,10,20;/ 游戲結束標記privatebooleangameOver=false;/ 游戲暫停標記privatebooleanpause=false;/ 正在下落的四格方塊privateTetrominocurrentTetro;/ 下一個下落的四格方塊privateTetrominonext
7、Tetro;/ 定義游戲定時器privateTimertimer;publicstaticvoidmain(String args)JFrame frame =new JFrame(" 俄羅斯方塊 " );intwidth = (COLS+8)*CELL_SIZE+100;intheight =ROWS* CELL_SIZE+100;frame.setSize(width, height);frame.setLocationRelativeTo(null);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);/ 取消系統
8、默認布局frame.setLayout(null);TetrisPanel panel =new TetrisPanel();panel.setLocation(45, 35);panel.setSize(COLS+8)*CELL_SIZE, ROWS* CELL_SIZE+1);frame.add(panel);frame.setVisible(true);panel.action();publicvoidpaint(Graphics g)super.paint(g);4/ 填充背景顏色this.paintBackground(g);/ 繪制游戲墻 paintWall(g);/ 繪制分數墻
9、paintScore(g);/ 繪制面板邊框 paintTetrisBorder(g);/ 繪制當前四格方塊 paintCurrentTetro(g);/ 繪制下個四格方塊paintNextTetro(g);/privatestaticfinalintBG_COLOR = 0xC3D5EA;/privatestaticfinalintBORDER_COLOR = 0x667799;/privatestaticfinalintFONT_COLOR = 0x000000;/ 繪制背景的方法publicvoidpaintBackground(Graphics g)g.setColor(new Col
10、or(BG_COLOR);/this.setBackground(new Color(BG_COLOR);g.fillRect(0, 0,this.getWidth(),this.getHeight();/ 繪制游戲墻的方法publicvoidpaintWall(Graphics g)for( introw=0;row<ROWS;row+)for( intcol=0;col<COLS;col+)Cell cell =wallrowcol;intx =col*CELL_SIZE;inty= row*CELL_SIZE;if(cell=null )g.setColor(new Colo
11、r(BORDER_COLOR);g.drawRect(x, y,CELL_SIZE ,CELL_SIZE); else g.setColor(new Color(cell.getColor();g.fillRect(x, y,CELL_SIZE , CELL_SIZE);g.setColor(new Color(BORDER_COLOR);g.drawRect(x, y,CELL_SIZE ,CELL_SIZE);/ 繪制分數墻的方法publicvoidpaintScore(Graphics g)intx = 12*CELL_SIZE;inty = 6*CELL_SIZE;Font font
12、=new Font(" 楷體 " ,Font. BOLD,23);String msg =" 分數: " + score ;g.setColor(new Color(FONT_COLOR);g.setFont(font);g.drawString(msg, x, y);y+=2* CELL_SIZE ;msg =" 行數: " +lines;5g.drawString(msg, x, y);if( gameOver)msg ="(T_T)【S】再來 " ;y+=2*CELL_SIZE;x-= CELL_SIZE;g
13、.drawString(msg, x, y); elseif( pause)msg =" 【C】繼續 " ;y+=2*CELL_SIZE;g.drawString(msg, x, y); elsemsg =" 【P】暫停 " ;y+=2*CELL_SIZE;g.drawString(msg, x, y);/ 繪制面板邊框的方法publicvoidpaintTetrisBorder(Graphics g)g.setColor(new Color(BORDER_COLOR);g.drawRect(0, 0,CELL_SIZE*( COLS+8)-1,CELL
14、_SIZE* ROWS);/ 繪制當前四格方塊的方法publicvoidpaintCurrentTetro( Graphics g)if( currentTetro= null)/ 如果沒有四格方塊,則返回不繪畫return;for(Cell cell:currentTetro. cells )introw = cell.getRow();intcol = cell.getCol();intx = col*CELL_SIZE;inty = row*CELL_SIZE;g.setColor(new Color(cell.getColor();g.fillRect(x, y,CELL_SIZE,C
15、ELL_SIZE);g.setColor(new Color(BORDER_COLOR);g.drawRect(x, y,CELL_SIZE,CELL_SIZE);/ 繪制下個四格方塊的方法publicvoidpaintNextTetro( Graphics g)if( nextTetro= null)/ 如果沒有四格方塊,則返回不繪畫return;for(Cell cell:nextTetro. cells )introw = cell.getRow();intcol = cell.getCol();intx = (col+9)*CELL_SIZE;inty = (row+1)*CELL_S
16、IZE;g.setColor(new Color(cell.getColor();g.fillRect(x, y,CELL_SIZE,CELL_SIZE);g.setColor(new Color(BORDER_COLOR);g.drawRect(x, y,CELL_SIZE,CELL_SIZE);/ 讓四格方塊動起來的方法public void action() startGameAction();6/ 請求此容器獲取輸入焦點 this .requestFocus();this.addKeyListener(new KeyAdapter()publicvoidkeyPressed(KeyEv
17、ent e)intkey= e.getKeyCode();if( gameOver)if(key=KeyEvent.VK_S )startGameAction();return;if( pause)if(key=KeyEvent.VK_C )continueAction();return;switch(key)caseKeyEvent.VK_DOWN:softDownAction();break;caseKeyEvent.VK_LEFT :moveLeftAction();break;caseKeyEvent.VK_RIGHT :moveRightAction();break;caseKeyE
18、vent.VK_UP :rotateRightAction();break;caseKeyEvent.VK_SPACE :hardDownAction();break;caseKeyEvent.VK_P :pauseAction();break;repaint();/ 暫停游戲的方法privatevoidpauseAction() pause=true;timer.cancel();/ 繼續游戲的方法privatevoidcontinueAction() pause=false;timer=newTimer();timer.schedule(new TimerTask() publicvoid
19、run() softDownAction();repaint();, 500, 500););/在游戲開始時調用或者【S】按下時調用7publicvoidstartGameAction()gameOver=false;pause=false;score= 0;lines= 0;/ 清空游戲主面板 emptyWall();/ 生成下一個四格方塊 nextTetromino();/ 生成定時器對象timer=new Timer();/ 啟動定時器工作timer.schedule(new TimerTask() publicvoidrun() / 調用面板的四格方塊下落方法(自由下落) softDo
20、wnAction();/ 重畫面板repaint();, 500, 500);/ 清空游戲主面板方法publicvoidemptyWall()for( introw =0;row<ROWS;row+)/wallrow這一行全部用null表示Arrays.fill( wall row,null);/生成(隨機)下一個四格方塊,1. 下一個變成當前的。2. 隨機生成下一個。publicvoidnextTetromino()if( nextTetro= null)/第一次 nextTetro是 null時就隨機生成一個nextTetro= Tetromino.randomTetromino()
21、;/ 下一個四格方塊立即變成當前四格方塊currentTetro=nextTetro;nextTetro= Tetromino.randomTetromino();/ 四格方塊下落流程,方塊移動到區域最下方或者移動到其他方塊上則固定在此處。/ 而新的四個方塊則會出現在區域上方并開始下落且隨機生成下一個四格方塊publicvoidsoftDownAction()if(canDown()/ 如果能下落則繼續下落currentTetro.softDown(); else/ 不能下落則著陸到墻上 tetrominoLandToWall();/ 每一個四格方塊著陸清除滿行且計分 destroy();/
22、每一個四格方塊著陸需要檢測游戲是否結束 if (gameOver()/ 如果游戲結束gameOverAction(); else/ 隨機生成下一個四格方塊8nextTetromino();/ 檢查方塊是否能夠繼續下落(落到最底部或者墻上的下方有方塊)privatebooleancanDown() / 檢查是否到底部Cell cells =currentTetro. cells;for(Cell cell:cells)if(cell.getRow()=ROWS-1)returnfalse;/ 檢查次四格方塊下方是否有方塊 for (Cell cell:cells)introw = cell.ge
23、tRow();intcol = cell.getCol();Cell block =wallrow+1col;if(block!=null)returnfalse;returntrue;/方塊 “著陸 ”到墻上,取出每個小方塊找到對應的行號row和列號 col,將 cell小方塊放到對應的 wallrowcol位置上privatevoid tetrominoLandToWall() Cell cells =currentTetro. cells;for(Cell cell:cells)introw = cell.getRow();intcol = cell.getCol();/將 cell小方
24、塊放到對應的wallrowcol位置上wallrowcol=cell;/ 銷毀滿行的方法privatevoiddestroy() / 統計本次銷毀的行數intlines =0;for( introw =0 ;row<ROWS;row+)/ 判斷此行是否是滿行 if (fullCells(row)/ 清除此行 clearLine(row);/ 每清除一行就累計加一 lines+;/ 整個游戲面板每一行判斷之后要記錄銷毀行數與計分 score += SCORE_LEVEL lines;this. lines+= lines;9/判斷某一行是否填滿cell小方塊privatebooleanfu
25、llCells(introw) Cellline =wallrow;for( inti=0; i<line.length;i+)if(linei=null)/只要慈航有一個位置沒有cell,就不是滿行returnfalse;returntrue;/清除此行的方法,方法:(依次將此行的上一行復制到下一行,第一行全部用null填充)privatevoidclearLine(introw) /循環將游戲面板中的每一行復制到下一行for( inti=row; i>=1;i-)/wallrow = Arrays.copyOf(wallrow-1, COLS);System.arraycopy
26、( wallrow-1, 0,wallrow, 0,COLS);/ 第一行全部用 null 填充Arrays.fill( wall0,null);/ 檢查游戲是否結束(思路:游戲主面板中第一行出現四個方塊的區域有小方塊cell 在則游戲結束)privatebooleangameOver() gameOver= wall03!=null | wall 04!=null ;returngameOver;/ 清零游戲結束現場(停止計時器)privatevoidgameOverAction() / 停止計時器timer.cancel();/ 以四格方塊為單位左右移動的方法: 1. 遇到左右邊界不能移動
27、。 2. 遇到左右有方塊不能移動。/ 左移的方法privatevoidmoveLeftAction() currentTetro.moveLeft();if(outOfBounds()|coincide()currentTetro.moveRight();/ 判斷四格方塊是否與墻上的方塊重合的方法privatebooleancoincide() for(Cell cell:currentTetro. cells)intcol = cell.getCol();introw = cell.getRow();/System.out.println(col+":"+row);if(
28、 wallrowcol!=null)returntrue;returnfalse;10/ 判斷四格方塊是否出邊界的方法privatebooleanoutOfBounds() for(Cell cell:currentTetro. cells)intcol = cell.getCol();if(col<0|col>=COLS)returntrue;returnfalse;/ 右移的方法privatevoidmoveRightAction() currentTetro.moveRight();if(outOfBounds()|coincide()currentTetro.moveLef
29、t();/ 四格方塊加速下落的方法privatevoidhardDownAction() / 四格方塊繼續下落 while (canDown()currentTetro.softDown();/ 著陸到墻上 tetrominoLandToWall();/ 清除滿行并計分 destroy();if (gameOver() gameOverAction(); else nextTetromino();/ 旋轉流程控制privatevoidrotateRightAction() currentTetro.rotateRight();if(outOfBounds()|coincide()current
30、Tetro.rotateLeft();方塊類代碼:packageTetris;/ 代表游戲中每一個小格子方塊publicclassCell / 小方塊在游戲面板中的哪一行privateintrow ;/ 小方塊在游戲面板中的哪一列privateintcol;11/ 小方塊的顏色privateintcolor;publicCell(introw,intcol,int color)this. row= row;this. col= col;this. color= color;publicintgetRow() returnrow ;publicvoidsetRow(introw) this. r
31、ow= row;publicintgetCol() returncol ;publicvoidsetCol(intcol) this. col= col;publicintgetColor() returncolor;publicvoidsetColor(intcolor) this. color= color;/ 小方塊向下移動publicvoiddown() row +;/ 小方塊向左移動publicvoidleft() col-;/ 小方塊向右移動publicvoidright() col+;七種方塊旋轉屬性定義類代碼:packageTetris;import/ 四個方塊類,有 7 種子
32、類: ITSZJLOpublicabstractclassTetromino / 每一種四個方塊都有自己的顏色publicstaticfinalintI_COLOR =0xff9988;publicstaticfinalintT_COLOR =0x44ff88;publicstaticfinalintS_COLOR =0x704077;12publicstaticfinalintZ_COLOR =0xccee00;publicstaticfinalintJ_COLOR =0xff1144;publicstaticfinalintL_COLOR =0x1122ff;publicstaticfin
33、alintO_COLOR =0x6642bb;/ 四個方塊有四個小方塊(Cell)組成protectedCellcells=new Cell4;/ 每一種四格方塊都有旋轉狀態(旋轉方式)protectedOffsetstates;/ 定義成員內部類protectedclass Offsetintrow0, col0;introw1, col1;introw2, col2;introw3, col3;publicOffset(introw0,intcol0,introw1,intcol1,introw2,intcol2,introw3,intcol3)this. row0= row0;this.
34、 col0= col0;this. row1= row1;this. col1= col1;this. row2= row2;this. col2= col2;this. row3= row3;this. col3= col3;/ 隨機生成一個具體的四格方塊publicstaticTetromino randomTetromino()Random random =new Random();/int type = random.nextInt(7);switch(type)case0:returnnewI();case1:returnnewT();case2:returnnewJ();case3
35、:returnnew O();case4:returnnewS();case5:returnnewL();case6:returnnewZ();returnnull;13/ 四格方塊的下落,是四個小方塊一起下落publicvoidsoftDown() for( inti=0;i<cells. length;i+)cellsi.down();publicvoidmoveLeft() for( inti=0;i<cells. length;i+)cellsi.left();publicvoidmoveRight() for( inti=0;i<cells. length;i+)c
36、ellsi.right();/ 四格方塊旋轉標記privateintindex= 9999;/ 向右旋轉publicvoidrotateRight() index+;Offset offset =states index %states. length;Cell axis =cells0;cells1.setRow(axis.getRow()+offset.row1);cells1.setCol(axis.getCol()+offset.col1);cells2.setRow(axis.getRow()+offset.row2);cells2.setCol(axis.getCol()+offs
37、et.col2);cells3.setRow(axis.getRow()+offset.row3);cells3.setCol(axis.getCol()+offset.col3);/ 向左旋轉publicvoidrotateLeft() index-;Offset offset =states index %states. length;Cell axis =cells0;cells1.setRow(axis.getRow()+offset.row1);cells1.setCol(axis.getCol()+offset.col1);cells2.setRow(axis.getRow()+o
38、ffset.row2);cells2.setCol(axis.getCol()+offset.col2);cells3.setRow(axis.getRow()+offset.row3);cells3.setCol(axis.getCol()+offset.col3);/I形的四格方塊classIextendsTetrominopublicI()/I形的四格方塊在游戲面板中的初始位置與顏色cells0=new Cell(0,4,I_COLOR );cells1=new Cell(0,3,I_COLOR );cells2=new Cell(0,5,I_COLOR );cells3=new Cell(0,6,I_COLOR );/I形四格方塊的旋轉狀態14states=new Offsetnew Offset(0,0,-1,0,1,0,2,0),new Offset(0,0,0,-1,0,1,0,2);/T形的四格方塊classTextendsTetrominopublicT()/T形的四格方塊在游戲面板中的初始位置與顏色cells0 =new Cell(0,4,T_COLOR );cells
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 期末應用題專項訓練:混合運算(含解析)-2024-2025學年數學二年級下冊人教版
- 部編版一年級下冊第六單元《荷葉圓圓》教案
- 建筑施工特種作業-建筑起重機械司機(塔式起重機)真題庫-3
- 建筑施工特種作業-建筑起重機械安裝拆卸工(施工升降機)真題庫-1
- 建筑施工特種作業-建筑電工真題庫-10
- 2025年湖南省中考地理試卷真題(含答案)
- 賽馬題目及答案大全圖片
- 乳腺外科出科題目及答案
- 日語選擇題目及答案
- 7 1 空間幾何體的結構特征 表面積和體積-2026版53高考數學總復習A版精煉
- 伊春市紀委監委所屬事業單位招聘筆試真題2024
- 2025餐廳管理與服務合同
- (期末復習)??贾R清單(八大單元52個小知識點)-2024-2025學年三年級下冊數學期末備考總復習(人教版)
- 社會工作者的政策與法律試題及答案
- 2025年時事政治試題庫(含答案)
- 2025年農村經濟發展考試試卷及答案
- 充電樁設備生產建設項目投資可行性報告
- T/CECS 10011-2022聚乙烯共混聚氯乙烯高性能雙壁波紋管材
- 高考報考志愿協議書
- 2025浙江中考:生物必背知識點
- 2025年國家開放大學《會計案例分析》形成性考核123答案+終結性考核答案
評論
0/150
提交評論