《java桌面開發(fā)項(xiàng)目實(shí)訓(xùn)》實(shí)訓(xùn)報(bào)告之坦克大戰(zhàn)_第1頁
《java桌面開發(fā)項(xiàng)目實(shí)訓(xùn)》實(shí)訓(xùn)報(bào)告之坦克大戰(zhàn)_第2頁
《java桌面開發(fā)項(xiàng)目實(shí)訓(xùn)》實(shí)訓(xùn)報(bào)告之坦克大戰(zhàn)_第3頁
《java桌面開發(fā)項(xiàng)目實(shí)訓(xùn)》實(shí)訓(xùn)報(bào)告之坦克大戰(zhàn)_第4頁
《java桌面開發(fā)項(xiàng)目實(shí)訓(xùn)》實(shí)訓(xùn)報(bào)告之坦克大戰(zhàn)_第5頁
已閱讀5頁,還剩34頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

廣東工貿(mào)職業(yè)技術(shù)學(xué)院java桌面應(yīng)用系統(tǒng)開發(fā)學(xué)期項(xiàng)目實(shí)訓(xùn)報(bào)告課程實(shí)訓(xùn)題目java版坦克大戰(zhàn)專業(yè)計(jì)算機(jī)軟件班級(jí)13軟件3班學(xué)號(hào)1313344姓名洪朝亮指導(dǎo)教師魯慶 完成時(shí)間2014/一、課程實(shí)訓(xùn)任務(wù)書及成績(jī)?cè)u(píng)定1、實(shí)訓(xùn)時(shí)間及目的本次實(shí)訓(xùn)時(shí)間為第17-19周,共三周時(shí)間,完成一個(gè)綜合游戲項(xiàng)目的開發(fā)。在本次項(xiàng)目開發(fā)過程中,會(huì)應(yīng)用前面所學(xué)習(xí)過的知識(shí):java編程基礎(chǔ)知識(shí)、面向?qū)ο缶幊?、常用類如集合類Vector的使用、繪圖技術(shù)、GUI設(shè)計(jì)、事件編程、多線程編程技術(shù)等知識(shí)。2、實(shí)訓(xùn)要求:本次實(shí)訓(xùn)內(nèi)容為完成一個(gè)坦克游戲項(xiàng)目,項(xiàng)目要求如下:1)在界面上繪制出敵我坦克,自己坦克1輛,敵人坦克不少于5輛。我的坦克(myTank),敵人坦克(enemyTank)2)myTank可以通過方向鍵控制它的運(yùn)動(dòng)(上、下、左、右)。3)myTank可以連續(xù)發(fā)射多顆炮彈(不多于6發(fā))。4)當(dāng)myTank發(fā)射的炮彈擊中enemyTank時(shí),enemyTank從畫面上消失,要求有爆炸效果。5)enemyTank可以隨機(jī)自由運(yùn)動(dòng),可以隨機(jī)發(fā)射炮彈。6)enemyTank發(fā)射的炮彈擊中myTank時(shí),myTank從畫面上消失,要求有爆炸效果,最好有爆炸聲音效果。7)防止enemyTank與enemyTank之間,enemyTank和myTank之間重疊運(yùn)動(dòng)。8)游戲開始前有提示,有聲音等效果。9)可以實(shí)現(xiàn)游戲的分關(guān)。例如第一關(guān),第二關(guān)等。10)游戲界面可以記錄玩家的成績(jī),記錄擊中數(shù)等信息。*11)可以實(shí)現(xiàn)游戲的存盤退出,繼續(xù)上局游戲等功能。*12)游戲畫面可以設(shè)置有磚墻、鋼墻、障礙物等道具。*13)myTank可以通過吃魔法塊等方式增強(qiáng)功力,打穿鋼墻等障礙物,從而直接擊毀enemyTank?!鲜鲆笾?,帶星號(hào)(*)的為選做,請(qǐng)認(rèn)真撰寫實(shí)訓(xùn)報(bào)告,完成實(shí)訓(xùn)所提出的功能要求。指導(dǎo)教師評(píng)語成績(jī):指導(dǎo)教師簽字:日期:二、課程實(shí)訓(xùn)進(jìn)度計(jì)劃起至日期工作內(nèi)容備注2014.6.16—2014.6.202014.6.23—2012.6.272012.6.30—2012.7.4完成上述所提出的功能1-5。完成上述所提出的功能6-8。完成上述所提出的功能9-10上交電子版實(shí)訓(xùn)報(bào)告、所設(shè)計(jì)的項(xiàng)目。三、課程實(shí)訓(xùn)所需要軟件、硬件等資源說明Windows7及以上操作系統(tǒng);JDK1.6及以上版本、eclipse或者myEclipse等軟件。四、可參考的資料、文獻(xiàn)1)教材《Java語言實(shí)用教程》,楊曉燕主編,清華大學(xué)出版社,2009.042)上課講解演示的代碼、所給的一些資料、ppt3)圖書館、網(wǎng)上相關(guān)內(nèi)容五、實(shí)訓(xùn)內(nèi)容及代碼詳細(xì)說明(請(qǐng)從此處開始寫)1.1、初始化界面:importjava.awt.*;importjava.awt.event.KeyEvent;importjava.awt.event.KeyListener;importjava.io.File;importjava.io.IOException;importjava.util.Vector;importjavax.imageio.ImageIO;importjavax.swing.*;publicclassTankGame7extendsJFrame{ MyPanelmp=null; publicstaticvoidmain(String[]args){ TankGame7demo1=newTankGame7(); } publicTankGame7(){ mp=newMyPanel(); mp.setBackground(Color.black); //啟動(dòng)mp線程 Threadt=newThread(mp); t.start(); //將mp添加到窗體上 this.add(mp); //注冊(cè)事件監(jiān)聽 this.addKeyListener(mp); this.setSize(400,300); this.setTitle("13軟件班案例"); //關(guān)閉jvm this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true); }}1.2、在界面上繪制出敵我坦克,自己坦克1輛,敵人坦克不少于5輛。我的坦克(myTank),敵人坦克(enemyTank)//繪制坦克 publicvoiddrawTank(intx,inty,Graphicsg,inttype,intdirect){ //g-畫筆 //type--類型0-》我的坦克紅色,1-》敵人的坦克藍(lán)色 //direct--方向0-》上1-》右2--》下3--》左 //判斷是什么類型的坦克 switch(type){ case0: g.setColor(Color.cyan); break; case1: g.setColor(Color.yellow); break; } switch(direct){ //向上 case0: //畫出我的坦克(到時(shí)再封裝成一個(gè)函數(shù)) //1.畫出左邊的矩形 g.fill3DRect(x,y,5,30,false); //2.畫出右邊矩形 g.fill3DRect(x+15,y,5,30,false); //3.畫出中間矩形 g.fill3DRect(x+5,y+5,10,20,false); //4.畫出圓形 g.fillOval(x+5,y+10,10,10); //5.畫出線 g.drawLine(x+10,y+15,x+10,y); break; case1: //炮筒向右 //畫出上面矩形 g.fill3DRect(x,y,30,5,false); //畫出下面的矩形 g.fill3DRect(x,y+15,30,5,false); //畫出中間的矩形 g.fill3DRect(x+5,y+5,20,10,false); //畫出圓形 g.fillOval(x+10,y+5,10,10); //畫出線 g.drawLine(x+15,y+10,x+30,y+10); break; case2: //向下 //畫出我的坦克(到時(shí)再封裝成一個(gè)函數(shù)) //1.畫出左邊的矩形 g.fill3DRect(x,y,5,30,false); //2.畫出右邊矩形 g.fill3DRect(x+15,y,5,30,false); //3.畫出中間矩形 g.fill3DRect(x+5,y+5,10,20,false); //4.畫出圓形 g.fillOval(x+5,y+10,10,10); //5.畫出線 g.drawLine(x+10,y+15,x+10,y+30); break; case3: //向左 //畫出上面矩形 g.fill3DRect(x,y,30,5,false); //畫出下面的矩形 g.fill3DRect(x,y+15,30,5,false); //畫出中間的矩形 g.fill3DRect(x+5,y+5,20,10,false); //畫出圓形 g.fillOval(x+10,y+5,10,10); //畫出線 g.drawLine(x+15,y+10,x,y+10); break; } }2、myTank可以通過方向鍵控制它的運(yùn)動(dòng)(上、下、左、右)。publicvoidkeyPressed(KeyEventarg0){ //TODOAuto-generatedmethodstub if(arg0.getKeyCode()==KeyEvent.VK_UP){ mytank.setDirect(0); mytank.moveUp(); }elseif(arg0.getKeyCode()==KeyEvent.VK_RIGHT){ mytank.setDirect(1); mytank.moveRight(); }elseif(arg0.getKeyCode()==KeyEvent.VK_DOWN){ mytank.setDirect(2); mytank.moveDown(); }elseif(arg0.getKeyCode()==KeyEvent.VK_LEFT){ mytank.setDirect(3); mytank.moveLeft(); }3、myTank可以連續(xù)發(fā)射多顆炮彈(不多于6發(fā))。if(arg0.getKeyCode()==KeyEvent.VK_J){ //我的坦克開火 //this.mytank.shotEnemy(); //最多發(fā)射5顆子彈 if(this.mytank.ss.size()<=5){ this.mytank.shotEnemy(); } }4、當(dāng)myTank發(fā)射的炮彈擊中enemyTank時(shí),enemyTank從畫面上消失,要求有爆炸效果。//寫一個(gè)函數(shù)專門判斷子彈是否擊中敵人坦克 publicvoidhitTank(Shots,enemyTanket){ //判斷該坦克的方向 switch(et.direct){ //如果敵人坦克的方向是上或者是下 case0: case2: if(s.x>et.x&&s.x<et.x+20&&s.y>et.y&&s.y<et.y+30){ //擊中 //子彈死亡敵人坦克死亡 s.isLive=false; et.isLive=false; //創(chuàng)建一顆炸彈,放入bombs Bombb=newBomb(et.x,et.y); bombs.add(b); } case1: case3: if(s.x>et.x&&s.x<et.x+30&&s.y>et.y&&s.y<et.y+20){ //擊中 //子彈死亡敵人坦克死亡 s.isLive=false; et.isLive=false; //創(chuàng)建一顆炸彈,放入bombs Bombb=newBomb(et.x,et.y); bombs.add(b); } } }5、enemyTank可以隨機(jī)自由運(yùn)動(dòng),可以隨機(jī)發(fā)射炮彈。classenemyTankextendsTankimplementsRunnable{ //炮彈集合類 Vector<Shot>ss=newVector<Shot>(); //Shots=null; //隨機(jī)變量完全是做隨機(jī)處理坦克發(fā)射炮彈 inttimes=0; booleanisLive=true; publicenemyTank(intx,inty){ super(x,y); } @Override publicvoidrun(){ while(true){ try{ Thread.sleep(50); }catch(InterruptedExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } this.times++; if(this.times%2==0){ if(this.isLive=true){ //規(guī)定敵人坦克可以發(fā)射5課炮彈 if(ss.size()<=5){ Shots=null; switch(this.direct){ case0: //說明坦克正在向上走 for(inti=0;i<30;i++){ if(y>0){ y-=speed; } try{ Thread.sleep(50); }catch(Exceptione){ e.printStackTrace(); } } //創(chuàng)建一顆炮彈 s=newShot(x+10,y,0); ss.add(s); break; case1: for(inti=0;i<30;i++){ if(x<400){ x+=speed; } try{ Thread.sleep(50); }catch(Exceptione){ e.printStackTrace(); } } s=newShot(x+30,y+10,1); ss.add(s); break; case2: //說明坦克正在向下走 for(inti=0;i<30;i++){ if(y<300){ y+=speed; } try{ Thread.sleep(50); }catch(Exceptione){ e.printStackTrace(); } } s=newShot(x+10,y+30,2); ss.add(s); break; case3: for(inti=0;i<30;i++){ if(x>0){ x-=speed; } try{ Thread.sleep(50); }catch(Exceptione){ e.printStackTrace(); } } s=newShot(x,y+10,3); ss.add(s); break; }//switch //啟動(dòng)炮彈線程 Threadt=newThread(s); t.start(); }//if(ss.size()<=5){ }//if(this.isLive=true){ }// this.direct=(int)(Math.random()*4);//隨機(jī)產(chǎn)生一個(gè)新的方向 //判斷敵人坦克是否死亡 if(this.isLive==false){ break;//讓坦克退出線程 } } }6、enemyTank發(fā)射的炮彈擊中myTank時(shí),myTank從畫面上消失,要求有爆炸效果,最好有爆炸聲音效果。publicvoidhitMe(){ //取出每一輛敵人坦克 for(inti=0;i<this.vv.size();i++){ enemyTanket=vv.get(i); //取出每一發(fā)炮彈 for(intj=0;j<et.ss.size();j++){ Shots=et.ss.get(j); if(this.mytank.isLive){ this.hitTank(s,this.mytank); } } } } @Override publicvoidrun(){ //TODOAuto-generatedmethodstub //每隔100毫秒去重繪 while(true){ try{ Thread.sleep(100); }catch(InterruptedExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } //判斷我的坦克是否擊中敵人坦克 this.hitEnemyTank(); //判斷敵人的坦克是否擊中我的坦克 this.hitMe(); //重繪 this.repaint(); } }}7、防止enemyTank與enemyTank之間,enemyTank和myTank之間重疊運(yùn)動(dòng)。//檢測(cè)坦克重疊函數(shù) publicbooleanisChongdie(){ //取出面板上活著的坦克 booleanb=false;//默認(rèn)不重疊 switch(this.direct){ case0: //我的坦克向上 //取出所有敵人的坦克 for(inti=0;i<aa.size();i++) { //取出第一個(gè)坦克 enemyTanket=aa.get(i); //如果不是自己 if(et!=this) { //敵人的坦克是向上或向下 if(et.direct==0||et.direct==2) { if(this.x>=et.x&&this.x<=et.x+20&&this.y>=et.y&&this.y<=et.y+30){ b=true;}if(this.x+20>=et.x&&this.x+20<=et.x+20&&this.y>=et.y&&this.y<=et.y+30) { b=true;}} //敵人的坦克是向左或向右 if(et.direct==1||et.direct==3) { if(this.x>=et.x&&this.x<=et.x+30&&this.y>=et.y&&this.y<=et.y+20){ b=true; } if(this.x+20>=et.x&&this.x+20<=et.x+30&&this.y>=et.y&&this.y<=et.y+20) { b=true; } } } } break; case1: //我的坦克向右 for(inti=0;i<aa.size();i++) { //取出第一個(gè)坦克 enemyTanket=aa.get(i); //如果不是自己 if(et!=this) { if(et.direct==0||et.direct==2) { //上一點(diǎn)if(this.x+30>=et.x&&this.x+30<=et.x+20&&this.y>=et.y&&this.y<=et.y+30) { b=true; } //下一點(diǎn)if(this.x+30>=et.x&&this.x+30<=et.x+20&&this.y+20>=et.y&&this.y+20<=et.y+30) { b=true; } } if(et.direct==1||et.direct==3) { if(this.x+30>=et.x&&this.x<=et.x+30&&this.y>=et.y&&this.y<=et.y+20){ b=true;} //下一點(diǎn)if(this.x+30>=et.x&&this.x+30<=et.x+30&&this.y+20>=et.y&&this.y+20<=et.y+20) { b=true; } } } } break; case2: //我的坦克向下 for(inti=0;i<aa.size();i++) { //取出第一個(gè)坦克 enemyTanket=aa.get(i); //如果不是自己 if(et!=this){ if(et.direct==0||et.direct==2) { //左一點(diǎn) if(this.x>=et.x&&this.x<=et.x+20&&this.y+30>=et.y&&this.y+30<=et.y+30) { b=true; } //右一點(diǎn)if(this.x+20>=et.x&&this.x+20<=et.x+20&&this.y+30>=et.y&&this.y+30<=et.y+30) { b=true; } } if(et.direct==1||et.direct==3) {if(this.x>=et.x&&this.x<=et.x+30&&this.y+30>=et.y&&this.y+30<=et.y+20) { b=true; } if(this.x+20>=et.x&&this.x+20<=et.x+30&&this.y+30>=et.y&&this.y+30<=et.y+20) { b=true; } } } } break; case3: //我的坦克向左 //取出所有敵人的坦克 for(inti=0;i<aa.size();i++) { //取出第一個(gè)坦克 enemyTanket=aa.get(i); //如果不是自己 if(et!=this) { //上一點(diǎn) if(et.direct==0||et.direct==2) { if(this.x>=et.x&&this.x<=et.x+20&&this.y>=et.y&&this.y<=et.y+30) { b=true; } if(this.x>=et.x&&this.x<=et.x+20&&this.y+20>=et.y&&this.y+20<=et.y+30) { b=true; } } //下一點(diǎn) if(et.direct==1||et.direct==3) { if(this.x>=et.x&&this.x<=et.x+30&&this.y>=et.y&&this.y<=et.y+20) { b=true; } if(this.x>=et.x&&this.x<=et.x+30&&this.y+20>=et.y&&this.y+20<=et.y+20) { b=true; } } } } break; } returnb;}8、游戲開始前有提示,有聲音等效果。//播放聲音類1classAePlayWaveextendsThread{ privateStringfile; publicAePlayWave(Stringwavfile) { file=wavfile; } publicvoidrun(){ FilesounFile=newFile(file); AudioInputStreamaudioInputStream=null; try{ audioInputStream=AudioSystem.getAudioInputStream(sounFile); }catch(Exceptione1) {//System.out.println("nononon.................."); e1.printStackTrace(); return; } AudioFormatformat=audioInputStream.getFormat(); SourceDataLineauline=null; DataLine.Infoinfo=newDataLine.Info(SourceDataLine.class,format); try{ auline=(SourceDataLine)AudioSystem.getLine(info); auline.open(format); }catch(Exceptione){ e.printStackTrace(); return; } auline.start(); intnBytesRead=0; byte[]abData=newbyte[1024];//這是緩沖 try{ while(nBytesRead!=-1) { nBytesRead=audioInputStream.read(abData,0,abData.length); if(nBytesRead>=0) auline.write(abData,0,nBytesRead); } }catch(IOExceptione){ e.printStackTrace(); return; }finally{ auline.drain(); auline.close(); } }}9)可以實(shí)現(xiàn)游戲的分關(guān)。例如第一關(guān),第二關(guān)等。10)游戲界面可以記錄玩家的成績(jī),記錄擊中數(shù)等信息。*11)可以實(shí)現(xiàn)游戲的存盤退出,繼續(xù)上局游戲等功能。//記錄類,同時(shí)也可以保存玩家設(shè)置classRecorder{ //記錄每關(guān)有多少敵人 privatestaticintenNum=20; //設(shè)置我有多少可以用的人 privatestaticintmyLife=3; //記錄總共消滅了多少敵人 privatestaticintallEnNum=0; //從文件中恢復(fù)記錄點(diǎn) Vector<Node>nodes=newVector<Node>(); privatestaticFileWriterfw=null; privatestaticBufferedWriterbw=null; privatestaticFileReaderfr=null; privatestaticBufferedReaderbr=null; staticVector<EnemyTank>ets=newVector<EnemyTank>(); //完成讀取任務(wù) publicVector<Node>getNodesAndEnNum() { try{

溫馨提示

  • 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)論