Java俄羅斯方塊實(shí)現(xiàn)步驟.ppt
項(xiàng)目實(shí)戰(zhàn)俄羅斯方塊,主講:賈宗維,程序演示,游戲01_功能演示與說明游戲02_面向?qū)ο笤O(shè)計(jì)游戲03_使用API類組裝游戲游戲04_編寫各個(gè)類主體框架游戲05_編寫Controler類實(shí)現(xiàn)事件監(jiān)聽游戲06_編寫類測(cè)試代碼游戲07_圖形設(shè)計(jì)與創(chuàng)建游戲08_圖形移動(dòng)與顯示游戲09_處理游戲邊界問題游戲10_障礙物生成與顯示游戲11_消除滿行的障礙物游戲12_增加游戲結(jié)束游戲13_定時(shí)下落,編寫各個(gè)類主體框架-Shape類,publicclassShape/privateShapeListenerlistener;publicvoidmoveLeft()System.out.println("shapesmoveLeft");publicvoidmoveRight()System.out.println("shapesmoveright");publicvoidmoveDown()System.out.println("shapesmoveDown");publicvoidrotate()System.out.println("shapesrotate");publicvoiddrawMe()System.out.println("shapesdrawme");,privateclassShapeDriverimplementsRunnablepublicvoidrun()/TODOAuto-generatedmethodstubwhile(true)moveDown();/listener.shapeMoveDown(Shape.this);tryThread.sleep(1000);catch(InterruptedExceptione)/TODOAuto-generatedcatchblocke.printStackTrace();,編寫各個(gè)類主體框架-ShapeFactory類,publicclassShapeFactorypublicShapegetShape(ShapeListenerlistener)System.out.println("ShapeFactorysgetShape");Shapeshape=newShape();returnshape;,編寫各個(gè)類主體框架-Ground類,packagecn.tetris.entities;publicclassGroundpublicvoidaccept()System.out.println("Groundsaccept");publicvoiddrawMe()System.out.println("GroundsdrawMe");,編寫各個(gè)類主體框架-GamePanel類,publicclassGamePanelextendsJPanelprivateGroundground;privateShapeshape;publicvoiddisplay(Groundground,Shapeshape)System.out.println("GamePanelsdisplay");this.ground=ground;this.shape=shape;this.repaint();OverrideprotectedvoidpaintComponent(Graphicsarg0)/TODOAuto-generatedmethodstub/重新顯示if(ground!=null,編寫各個(gè)類主體框架-Controller類,publicclassControllerextendsKeyAdapterprivateGroundground;privateShapeshape;privateShapeFactoryshapeFactory;privateGamePanelgamePanel;publicvoidkeyPressed(KeyEvente)switch(e.getKeyCode()caseKeyEvent.VK_UP:shape.rotate();break;caseKeyEvent.VK_LEFT:shape.moveLeft();break;caseKeyEvent.VK_RIGHT:shape.moveRight();break;caseKeyEvent.VK_DOWN:shape.moveDown();break;gamePanel.display(ground,shape);,編寫各個(gè)類主體框架-ShapeListener接口,publicinterfaceShapeListenervoidshapeMoveDown(Shapeshape);,Shape類增加監(jiān)聽器對(duì)象及下落后調(diào)用,publicclassShapeprivateShapeListenerlistener;publicvoidmoveLeft()System.out.println("shapesmoveLeft");publicvoidmoveRight()System.out.println("shapesmoveright");publicvoidmoveDown()System.out.println("shapesmoveDown");publicvoidrotate()System.out.println("shapesrotate");publicvoiddrawMe()System.out.println("shapesdrawme");,privateclassShapeDriverimplementsRunnablepublicvoidrun()/TODOAuto-generatedmethodstubwhile(true)moveDown();listener.shapeMoveDown(Shape.this);tryThread.sleep(1000);catch(InterruptedExceptione)/TODOAuto-generatedcatchblocke.printStackTrace();,Shape類中增加注冊(cè)監(jiān)聽器的方法,publicvoidaddShapeListener(ShapeListenerl)if(l!=null)this.listener=l;,Shape構(gòu)造方法中啟動(dòng)下落線程,publicShape()newThread(newShapeDriver().start();,Controller類實(shí)現(xiàn)ShapeListener接口,publicclassControllerextendsKeyAdapterimplementsShapeListenerpublicvoidshapeMoveDown(Shapeshape)/TODOAuto-generatedmethodstubgamePanel.display(ground,shape);,生產(chǎn)圖形時(shí)同時(shí)注冊(cè)監(jiān)聽器,publicclassShapeFactorypublicShapegetShape(ShapeListenerlistener)System.out.println("ShapeFactorysgetShape");Shapeshape=newShape();shape.addShapeListener(listener);returnshape;,GamePanel類設(shè)置大小,publicGamePanel()this.setSize(300,300);,Controller類中增加開始新游戲方法,publicvoidnewGame()shape=shapeFactory.getShape(this);,Controller類中如何接收外部控制的對(duì)象,publicController(ShapeFactoryshapeFactory,Groundground,GamePanelgamePanel)this.shapeFactory=shapeFactory;this.ground=ground;this.gamePanel=gamePanel;,測(cè)試類Game,publicclassGamepublicstaticvoidmain(Stringargs)/TODOAuto-generatedmethodstubShapeFactoryshapeFactory=newShapeFactory();Groundground=newGround();GamePanelgamePanel=newGamePanel();Controllercontroller=newController(shapeFactory,ground,gamePanel);JFrameframe=newJFrame();frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setSize(gamePanel.getSize().width+10,gamePanel.getSize().height+35);frame.add(gamePanel);gamePanel.addKeyListener(controller);frame.setVisible(true);controller.newGame();,程序步驟,游戲01_功能演示與說明游戲02_面向?qū)ο笤O(shè)計(jì)游戲03_使用API類組裝游戲游戲04_編寫各個(gè)類主體框架游戲05_編寫Controler類實(shí)現(xiàn)事件監(jiān)聽游戲06_編寫類測(cè)試代碼游戲07_圖形設(shè)計(jì)與創(chuàng)建游戲08_圖形移動(dòng)與顯示游戲09_處理游戲邊界問題游戲10_障礙物生成與顯示游戲11_消除滿行的障礙物游戲12_增加游戲結(jié)束游戲13_定時(shí)下落,Shape類,增加圖形的描述,/二維變量用于保存圖形的所有狀態(tài)privateintbody;/用于保存圖形當(dāng)前的狀態(tài)privateintstatus;/設(shè)置狀態(tài)的方法publicvoidsetBody(intbody)this.body=body;/設(shè)置當(dāng)前是第幾種狀態(tài)publicvoidsetStatus(intstatus)this.status=status;,ShapeFactory類增加生產(chǎn)各種圖形,/三維數(shù)組用于表示一種圖形的多種形狀privateintshapes=newint1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,1,1,0,0,0,0,0,0;,publicShape/生產(chǎn)一個(gè)隨機(jī)數(shù),用于表示圖形的狀態(tài)inttype=newRandom().nextInt(shapes.length);/設(shè)置圖形有幾種狀態(tài)shape.setBody(shapestype);/設(shè)置默認(rèn)狀態(tài)shape.setStatus(0);returnshape;,Shape類中增加圖形的位置信息,/表示圖形距離左側(cè)的距離privateintleft;/表示圖形距離上邊界的距離privateinttop;publicvoidmoveLeft()left-;publicvoidmoveRight()left+;publicvoidmoveDown()top+;publicvoidrotate()/顯示下一個(gè)狀態(tài),但得保證狀態(tài)值不超過4,所以需處理status=(status+1)%body.length;,Shape類中增加圖形的繪制方法,publicvoiddrawMe(Graphicsg)System.out.println("shapesdrawme");g.setColor(Color.RED);/循環(huán)訪問代表方正的數(shù)組for(intx=0;x<4;x+)for(inty=0;y<4;y+)if(getFlagByPoint(x,y)g.fill3DRect(left+x)*Global.CELL_SIZE,(top+y)*Global.CELL_SIZE,Global.CELL_SIZE,Global.CELL_SIZE,true);/獲取方正中標(biāo)志是1還是0,1表示要繪圖0表示不繪圖privatebooleangetFlagByPoint(intx,inty)returnbodystatusy*4+x=1;,游戲常量的存放Glaobal,publicclassGlobal/表示每個(gè)方格的像素值publicstaticfinalintCELL_SIZE=20;/表示圖形面板有多少個(gè)格子寬和高publicstaticfinalintWIDTH=15;publicstaticfinalintHEIGHT=15;,測(cè)試游戲,下落方塊出現(xiàn)拖影,在GamePanel類的paintComponent方法中增加如下代碼:在填充一個(gè)與背景同色的區(qū)域g.setColor(newColor(0 xcfcfcf);g.fillRect(0,0,Global.CELL_SIZE*Global.WIDTH,Global.CELL_SIZE*Global.HEIGHT);/填充一個(gè)灰色顯示區(qū)域,避免圖形拖影修改此處的同時(shí)還需修改Shape的drawme方法中設(shè)置圖形的顏色,以及給frame也注冊(cè)監(jiān)聽器。,圖形如何避免移出邊界,publicbooleanisMoveable(Shapeshape,intaction)/得到圖像當(dāng)前的位置信息intleft=shape.getLeft();inttop=shape.getTop();/根據(jù)圖形的動(dòng)作,得出圖形最新的位置信息switch(action)caseShape.LEFT:left-;break;caseShape.RIGHT:left+;break;caseShape.DOWN:top+;break;,/依次取出圖形中的每一個(gè)點(diǎn),判斷是否超出顯示區(qū)域for(intx=0;x=Global.HEIGHT|left+x=Global.WIDTH)returnfalse;returntrue;,