




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
廣東工貿(mào)職業(yè)技術(shù)學(xué)院java桌面應(yīng)用系統(tǒng)開發(fā)學(xué)期項目實訓(xùn)報告課程實訓(xùn)題目java版坦克大戰(zhàn)專業(yè)計算機軟件班級13軟件3班學(xué)號1313344姓名洪朝亮指導(dǎo)教師魯慶 完成時間2014/一、課程實訓(xùn)任務(wù)書及成績評定1、實訓(xùn)時間及目的本次實訓(xùn)時間為第17-19周,共三周時間,完成一個綜合游戲項目的開發(fā)。在本次項目開發(fā)過程中,會應(yīng)用前面所學(xué)習(xí)過的知識:java編程基礎(chǔ)知識、面向?qū)ο缶幊?、常用類如集合類Vector的使用、繪圖技術(shù)、GUI設(shè)計、事件編程、多線程編程技術(shù)等知識。2、實訓(xùn)要求:本次實訓(xùn)內(nèi)容為完成一個坦克游戲項目,項目要求如下:1)在界面上繪制出敵我坦克,自己坦克1輛,敵人坦克不少于5輛。我的坦克(myTank),敵人坦克(enemyTank)2)myTank可以通過方向鍵控制它的運動(上、下、左、右)。3)myTank可以連續(xù)發(fā)射多顆炮彈(不多于6發(fā))。4)當myTank發(fā)射的炮彈擊中enemyTank時,enemyTank從畫面上消失,要求有爆炸效果。5)enemyTank可以隨機自由運動,可以隨機發(fā)射炮彈。6)enemyTank發(fā)射的炮彈擊中myTank時,myTank從畫面上消失,要求有爆炸效果,最好有爆炸聲音效果。7)防止enemyTank與enemyTank之間,enemyTank和myTank之間重疊運動。8)游戲開始前有提示,有聲音等效果。9)可以實現(xiàn)游戲的分關(guān)。例如第一關(guān),第二關(guān)等。10)游戲界面可以記錄玩家的成績,記錄擊中數(shù)等信息。*11)可以實現(xiàn)游戲的存盤退出,繼續(xù)上局游戲等功能。*12)游戲畫面可以設(shè)置有磚墻、鋼墻、障礙物等道具。*13)myTank可以通過吃魔法塊等方式增強功力,打穿鋼墻等障礙物,從而直接擊毀enemyTank?!鲜鲆笾?,帶星號(*)的為選做,請認真撰寫實訓(xùn)報告,完成實訓(xùn)所提出的功能要求。指導(dǎo)教師評語成績:指導(dǎo)教師簽字:日期:二、課程實訓(xùn)進度計劃起至日期工作內(nèi)容備注2014.6.16—2014.6.202014.6.23—2012.6.272012.6.30—2012.7.4完成上述所提出的功能1-5。完成上述所提出的功能6-8。完成上述所提出的功能9-10上交電子版實訓(xùn)報告、所設(shè)計的項目。三、課程實訓(xùn)所需要軟件、硬件等資源說明Windows7及以上操作系統(tǒng);JDK1.6及以上版本、eclipse或者myEclipse等軟件。四、可參考的資料、文獻1)教材《Java語言實用教程》,楊曉燕主編,清華大學(xué)出版社,2009.042)上課講解演示的代碼、所給的一些資料、ppt3)圖書館、網(wǎng)上相關(guān)內(nèi)容五、實訓(xùn)內(nèi)容及代碼詳細說明(請從此處開始寫)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); //啟動mp線程 Threadt=newThread(mp); t.start(); //將mp添加到窗體上 this.add(mp); //注冊事件監(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-》敵人的坦克藍色 //direct--方向0-》上1-》右2--》下3--》左 //判斷是什么類型的坦克 switch(type){ case0: g.setColor(Color.cyan); break; case1: g.setColor(Color.yellow); break; } switch(direct){ //向上 case0: //畫出我的坦克(到時再封裝成一個函數(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ù)) //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可以通過方向鍵控制它的運動(上、下、左、右)。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、當myTank發(fā)射的炮彈擊中enemyTank時,enemyTank從畫面上消失,要求有爆炸效果。//寫一個函數(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可以隨機自由運動,可以隨機發(fā)射炮彈。classenemyTankextendsTankimplementsRunnable{ //炮彈集合類 Vector<Shot>ss=newVector<Shot>(); //Shots=null; //隨機變量完全是做隨機處理坦克發(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 //啟動炮彈線程 Threadt=newThread(s); t.start(); }//if(ss.size()<=5){ }//if(this.isLive=true){ }// this.direct=(int)(Math.random()*4);//隨機產(chǎn)生一個新的方向 //判斷敵人坦克是否死亡 if(this.isLive==false){ break;//讓坦克退出線程 } } }6、enemyTank發(fā)射的炮彈擊中myTank時,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之間重疊運動。//檢測坦克重疊函數(shù) publicbooleanisChongdie(){ //取出面板上活著的坦克 booleanb=false;//默認不重疊 switch(this.direct){ case0: //我的坦克向上 //取出所有敵人的坦克 for(inti=0;i<aa.size();i++) { //取出第一個坦克 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++) { //取出第一個坦克 enemyTanket=aa.get(i); //如果不是自己 if(et!=this) { if(et.direct==0||et.direct==2) { //上一點if(this.x+30>=et.x&&this.x+30<=et.x+20&&this.y>=et.y&&this.y<=et.y+30) { b=true; } //下一點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;} //下一點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++) { //取出第一個坦克 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+30>=et.y&&this.y+30<=et.y+30) { b=true; } //右一點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++) { //取出第一個坦克 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>=et.x&&this.x<=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>=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)可以實現(xiàn)游戲的分關(guān)。例如第一關(guān),第二關(guān)等。10)游戲界面可以記錄玩家的成績,記錄擊中數(shù)等信息。*11)可以實現(xiàn)游戲的存盤退出,繼續(xù)上局游戲等功能。//記錄類,同時也可以保存玩家設(shè)置classRecorder{ //記錄每關(guān)有多少敵人 privatestaticintenNum=20; //設(shè)置我有多少可以用的人 privatestaticintmyLife=3; //記錄總共消滅了多少敵人 privatestaticintallEnNum=0; //從文件中恢復(fù)記錄點 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等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 保安人員技術(shù)素養(yǎng)提升的路徑計劃
- 公共服務(wù)行業(yè)的品牌工作計劃
- 苗圃未來希望助力孩子成長計劃
- 加強跨國經(jīng)營管理提升全球競爭力計劃
- 弘揚學(xué)生尊重勞動的精神計劃
- 2025年地理信息大數(shù)據(jù)合作協(xié)議書
- 2025年中國橡膠行業(yè)市場運行態(tài)勢、產(chǎn)業(yè)鏈全景及發(fā)展趨勢報告
- 七年級下冊《立方根》課件與練習(xí)
- 利用大數(shù)據(jù)分析預(yù)測用戶需求變化
- 2025年路面清潔裝備項目建議書
- 汽車運行材料ppt課件(完整版)
- GB∕T 1732-2020 漆膜耐沖擊測定法
- 我國油菜生產(chǎn)機械化技術(shù)(-119)
- 2022《化工裝置安全試車工作規(guī)范》精選ppt課件
- 吞咽障礙篩查表
- Q∕GDW 12067-2020 高壓電纜及通道防火技術(shù)規(guī)范
- 汽車系統(tǒng)動力學(xué)-輪胎動力學(xué)
- 艾琳歆日內(nèi)交易2011-2月至4月份圖表
- 中國民航國內(nèi)航空匯編航路314系列航線
- 山西特色文化簡介(課堂PPT)
- 工業(yè)廠房工程技術(shù)標(共93頁)
評論
0/150
提交評論