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

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

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

一個(gè)內(nèi)部類(State):

存放四個(gè)方塊旋轉(zhuǎn)時(shí)的坐標(biāo)狀態(tài)。 Tetris(俄羅斯方塊類)extendsJpanel

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

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

以cells[0]為旋轉(zhuǎn)軸,根據(jù)初始化的相對(duì)坐標(biāo) 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();//左移

先調(diào)用tetromino.moveLeft();

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

在moveLeft方法中遍歷當(dāng)前對(duì)象cells中所有cell對(duì)象

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

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

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

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

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

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

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

如果wall[0][4]!=null成立,調(diào)用timer.cancle()關(guān)閉計(jì)時(shí)器,游戲結(jié)束.outOfBounds();//出界檢查方法 Cell[]cells=tetromino.cells;

遍歷當(dāng)前四格方塊對(duì)象的每個(gè)格子

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

遍歷當(dāng)前四格方塊對(duì)象的每個(gè)格子

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

task,long

delay,long

period)

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

y)

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

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

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

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

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

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

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

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

調(diào)用startAction()開始動(dòng)作流程.

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

};

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

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論