俄羅斯方塊Java編寫精髓_第1頁
俄羅斯方塊Java編寫精髓_第2頁
俄羅斯方塊Java編寫精髓_第3頁
俄羅斯方塊Java編寫精髓_第4頁
俄羅斯方塊Java編寫精髓_第5頁
已閱讀5頁,還剩21頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

俄羅斯方塊組員:沈唯唯,李有寧,田園田亮,尹亮2021/5/91界面展示程序運行成功后,進入游戲界面。如左圖所示。2021/5/92游戲暫停按下鍵盤按鍵“P”(pause)游戲進入停止狀態(tài),等待用戶按下“C”(Continue)鍵繼續(xù)游戲。2021/5/93退出游戲按下鍵盤按鍵“Q”(Quit)彈出系統(tǒng)提示框,選擇是否要退出游戲。2021/5/94游戲結束當方框到達頂端時(Wall[0][4]!=null),判定游戲結束。按下“S”可重新初始化界面開始游戲2021/5/95具體實現 Cell(格子類) Tetromino(四格方塊類) 7個子類(T,I,O,S,Z,J,L)

一個內部類(State):

存放四個方塊旋轉時的坐標狀態(tài)。 Tetris(俄羅斯方塊類)extendsJpanel

邏輯處理及方法的具體實現2021/5/96Cell屬性:row,col,Image方法:drop();//向下降落一個單位leftMove();//向左移動一個單位rightMove();//向右移動一個單位2021/5/97TetrominoCell[]cells=newCell[4];State[]states;//旋轉狀態(tài)Index;//旋轉下標ProtectedclassState{};//旋轉狀態(tài)類(內部類)7個子類7種方塊rotateRight();//向右旋轉rotateLeft();//向左旋轉softDrop();//下落moveLeft();//左移moveRight();//右移RandomOne();//隨機生成一個四格方塊2021/5/98Tetrispaint(Graphicsg);//重寫繪圖方法paintWall(Graphicsg);//繪制墻action();//通過調用該方法

啟動軟件Quit();//退出pauseAction();//暫停continueAction();//繼續(xù)paintTetromino(Graphicsg);//繪制四格方塊paintNextOne(Graphicsg);//繪制下一個方塊paintScore(Graphicsg);//繪制成績paintLines(Graphicsg);//繪制已消除行數paintPause(Graphicsg);//繪制暫/繼續(xù)停提示2021/5/99softDropAction();//下落控制方法canDrop();//判斷是否能夠繼續(xù)下落landToWall();//著陸到墻destroyLines();//銷毀的行數fullCells(introw);//判斷一行是否滿了deleteLine(introw);//刪除一行checkGameOver();//檢查游戲結束狀態(tài)moveLeftAction();//判斷左移是否出界moveRightAction();//判斷右移是否出界rotateRightAction();//判斷旋轉是否出界outOfBounds();//檢查是否出界coincide();//判斷是否重合hardDropAction();//瞬間下降startAction();//開始動作流程2021/5/910簡單工廠模式實例化四格方塊T,I,O,S,Z,J,L(田亮)將7個子類封裝到類Tetromino,在構造方法里初始化四格方塊的初始位置(row,col)和相對位置.初始位置:cell[0]=(0,4);cell[1]=(0,3);cell[2]=(0,5);cell[3]=(1,3);以“L”型四格方塊為例:2021/5/911以編號為“0”的格子為旋轉軸,計算其他格子的相對坐標:states[0]=(0,0,0,-1,0,1,1,-1);states[1]=(0,0,-1,0,1,0,-1,-1);states[2]=(0,0,0,1,0,-1,-1,1);states[3]=(0,0,1,0,-1,0,1,1);states[0]states[1]states[2]states[3]2021/5/912旋轉,左移,右移(沈唯唯)privateintIndex=10000;表示旋轉狀態(tài)下標.設置為10000防止旋轉次數過多而使游戲無法正常進行.在Tetromino類中添加內部類State屬性:row0,col0,row1,col1,row2,col2,row3,col3以上8個屬性表示4個方塊的相對坐標.構造方法:publicState(introw0…){…}2021/5/913旋轉 rotateRight();下標Index自增 rotateLeft();下標Index自減 States=states[index%states.length];當前狀態(tài)s為四格方塊旋轉[index%states.length]次的狀態(tài).

以cells[0]為旋轉軸,根據初始化的相對坐標 cells[1].setRow(cells[0].getRow()+s.row1); cells[1].setCol(cells[0].getCol()+s.col1); cells[2].setRow(cells[0].getRow()+s.row2); cells[2].setCol(cells[0].getCol()+s.col2); cells[3].setRow(cells[0].getRow()+s.row3); cells[3].setCol(cells[0].getCol()+s.col3);2021/5/914左移、右移moveLeftAction();//左移

先調用tetromino.moveLeft();

如果出界,或者重合再調用tetromino.moveRight();

在moveLeft方法中遍歷當前對象cells中所有cell對象

循環(huán)調用cell.leftMove();moveRightAction();//右移的原理同上2021/5/915下落(李有寧)softDropAction();//一步一步下落

if(canDrop())為true(檢查當前方塊是否能夠繼續(xù)下落),則調用tetromino.softDrop();在softDrop()中遍歷cells對象調用cell.drop();hardDropAction();//瞬間下降

while(canDrop())為true(檢查當前方塊是否能夠繼續(xù)下落),則調用tetromino.softDrop();在softDrop()中遍歷cells對象調用cell.drop();

否則調用方法: landToWall();//著陸到墻 destroyLines();//銷毀行數 checkGameOver();//檢查游戲是否結束2021/5/916landToWall();//著陸到墻 Cell[]cells=tetromino.cells;

遍歷當前四格方塊對象將每一個格子對象賦值給墻 wall[cell.getRow][cell.getCol]=celldestroyLines();//銷毀行數

遍歷每行的格子,如果fullCells(row)(遍歷當前行的各自是否是滿的)為true,調用deleteLine(row)消除這行;lines++;

最后加成績this.score+=scoreTable[lines]; scoreTable[]為得分表2021/5/917判斷方法,暫停、繼續(xù)、退出(田園)checkGameOver();//檢查游戲是否結束

如果wall[0][4]!=null成立,調用timer.cancle()關閉計時器,游戲結束.outOfBounds();//出界檢查方法 Cell[]cells=tetromino.cells;

遍歷當前四格方塊對象的每個格子

如果(cell.getCol<0||cell.getCol>=COLS||cell.getRow<0||cell.getRow>=ROWS)成立(方塊是否出了長方形界面),返回true;2021/5/918coincide()//判斷重合方法 Cell[]cells=tetromino.cells;

遍歷當前四格方塊對象的每個格子

如果(cell.getCol>=0&&cell.getCol<COLS&&cell.getRow>=0&&cell.getRow<ROWS&&wall[cell.getRow][cell.getCol]!=null)成立(在長方形界面內部檢查是否撞到其他方塊),返回true.pauseAction();//暫停游戲 timer.cancel();//終止該計時器 pause=true;//將暫停標記設置為true2021/5/919continueAction();//繼續(xù)游戲 pause=false;//設置暫停標記為false timer=newTimer();//創(chuàng)建一個新的計時器對象 timer.schedule(newTimerTask(){ publicvoidrun(){ softDropAction(); repaint(); } },inteval,inteval); schedule(TimerTask

task,long

delay,long

period)

安排指定的任務從指定的延遲后開始進行重復的固定延遲執(zhí)行 Inteval為間隔時間800ms;2021/5/920繪圖方法(尹亮)paint(Graphicsg);//重寫繪圖方法 g.drawImage(background,0,0,null);//畫背景 g.translate(15,15);//將圖形上下文的原點平移到當前坐標系中的點(x,

y)

繪制墻,四格方塊,下一個方塊,成績,已消除行數,暫停/繼續(xù)提示

如果游戲結束標記為true,繪制游戲結束的圖片paintWall(Graphicsg);//繪制墻

將長方形區(qū)域劃分成20行,10列.遍歷每個方塊對象,若cell不為空g.drawImage(cell.getImage(),x-1,y-1,null);

圖像大小x-1,y-1是圖形看起來順眼.2021/5/921paintTetromino(Graphicsg);//繪制四格方塊

如果沒有正在下落的方塊就不繪制,否則遍歷四格方塊對象的四個小格子并繪制.paintNextOne(Graphicsg);//繪制下一個方塊

如果沒有正在下落的方塊,就不繪制,否則遍歷隨機生成的下一個四格方塊的四個小格子并繪制.paintScore(Graphicsg);//繪制成績paintLines(Graphicsg);//繪制已消除行數paintPause(Graphicsg);//繪制暫停/繼續(xù)提示

以上3個方法均是先設置字體格式,顏色,位置再繪制.2021/5/922程序啟動方法(雷凱)通過靜態(tài)代碼塊將背景圖片,7種方塊圖片和游戲結束圖片加載進來,這會節(jié)省很多時間. static{ Classcls=Tetris.class; background= ImageIO.read(cls.getResource(image)); //可以讀取圖片文件到內存中的對象 …… }

該靜態(tài)代碼塊需捕捉異常(IOException)2021/5/923action();//啟動軟件

調用startAction()開始動作流程.

創(chuàng)建鍵盤按鍵監(jiān)聽對象newKeyAdapter(){ keyPressed(KeyEvente);

};

如果有按鍵按下完成時候(pressed)就會執(zhí)行 VK_Q:quit();//退出 VK_S:startAction();//重新開始游戲 VK_C:contin

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論