java两人大战坦克.docx

上传人:b****2 文档编号:1649618 上传时间:2023-05-01 格式:DOCX 页数:18 大小:21.13KB
下载 相关 举报
java两人大战坦克.docx_第1页
第1页 / 共18页
java两人大战坦克.docx_第2页
第2页 / 共18页
java两人大战坦克.docx_第3页
第3页 / 共18页
java两人大战坦克.docx_第4页
第4页 / 共18页
java两人大战坦克.docx_第5页
第5页 / 共18页
java两人大战坦克.docx_第6页
第6页 / 共18页
java两人大战坦克.docx_第7页
第7页 / 共18页
java两人大战坦克.docx_第8页
第8页 / 共18页
java两人大战坦克.docx_第9页
第9页 / 共18页
java两人大战坦克.docx_第10页
第10页 / 共18页
java两人大战坦克.docx_第11页
第11页 / 共18页
java两人大战坦克.docx_第12页
第12页 / 共18页
java两人大战坦克.docx_第13页
第13页 / 共18页
java两人大战坦克.docx_第14页
第14页 / 共18页
java两人大战坦克.docx_第15页
第15页 / 共18页
java两人大战坦克.docx_第16页
第16页 / 共18页
java两人大战坦克.docx_第17页
第17页 / 共18页
java两人大战坦克.docx_第18页
第18页 / 共18页
亲,该文档总共18页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

java两人大战坦克.docx

《java两人大战坦克.docx》由会员分享,可在线阅读,更多相关《java两人大战坦克.docx(18页珍藏版)》请在冰点文库上搜索。

java两人大战坦克.docx

java两人大战坦克

写这个游戏已经有一段时间了,一直在实现各种新功能,从最开始的地图上只有坦克,发子弹还是一个大问题到现在可以两个人一起玩,还是花了不少心思的,现在坦克的速度更快,电脑坦克也不会撞墙.虽然游戏性没有经典坦克大战那么强,但是还是可以用来休闲娱乐一下,这个用了很多最近学到的新知识,模仿俄罗斯方块,还有一些小技巧,比如可以同时按触发多个按键事件,对子弹的处理等.    

   左边的坦克用WDSA控制移动,H发射子弹,每次最多出现5颗子弹,右边的坦克用上下左右箭头控制移动,L键发射子弹,互不干扰.Q键可以直接退出游戏,游戏结束后按Y键可以继续游戏.为了结构清晰游戏分为Mywar  Shoot  Tanks  3个类.

  

/********************MyWar***********************/  

packagetank;

importjava.awt.Color;

importjava.awt.Font;

importjava.awt.Graphics;

importjava.awt.event.KeyAdapter;

importjava.awt.event.KeyEvent;

importjava.util.Arrays;

importjava.util.Random;

importjava.util.Timer;

importjava.util.TimerTask;

importjavax.swing.JFrame;

importjavax.swing.JPanel;

publicclassMyWar{

   publicstaticvoidmain(String[]args){

      JFrameframe=newJFrame("坦克大战");//新建一个窗口

      Warwar=newWar();//创建一个War类的对象

      frame.add(war);//把war添加到窗口中

      frame.setSize(750,530);//窗口宽高

      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭时结束进程

      frame.setLocationRelativeTo(null);//使窗口居中

      frame.setVisible(true);//这句是干啥的?

      war.action();//启动(war)战斗,亲,可以游戏了!

   }

}

classWarextendsJPanel{

   privatebooleansUp,sDown,sRight,sLeft,sH;//定义右边坦克按键的开关

   privatebooleansW,sD,sS,sA,sL;//定义左边坦克按键的开关

   publicstaticfinalintWIDTH=750;//定义地图宽度

   publicstaticfinalintHEIGHT=530;//定义地图高度

   privateintscore;//设置分数

   privatebooleangameOver;//gameover=false表示游戏没有结束

   privateTimertimer;//刚学的东西

   privateintshootNum,shootNum1;//可以射击的子弹数,防止作弊

   MyTank[]myTank=newMyTank[2];//定义一个我方坦克对象数组

   EnemyTanks[]enemyTank=newEnemyTanks[5];//初始化敌人坦克的数量

   EnemyTanksnewEnemyTank;//用来产生一辆敌人的坦克,补充死去的T_T

   Randomr=newRandom();

   /**用于产生一辆新的敌人坦克,返回参数是EnemyTanks类型*/

   publicEnemyTanksnextTank(){

      intx=r.nextInt

(2)*WIDTH;//随机x的值,坦克出生在角落

      inty=r.nextInt

(2)*HEIGHT;//随机y的值,坦克出生在角落

      intstep=r.nextInt(4)+1;//速度

      intdirect=r.nextInt(4)+1;//方向

      intwho=r.nextInt(3)+1;//谁?

      newEnemyTank=newEnemyTanks(x,y,step,direct,who,true);

      returnnewEnemyTank;//返回一个新坦克

   }

   publicvoidaction(){

      startGame();//开始游戏函数

      KeyAdapterl=newKeyAdapter(){//键盘监听

         publicvoidkeyPressed(KeyEvente){

            intkey=e.getKeyCode();

            if(key==KeyEvent.VK_Q){

               System.exit(0);//Q关闭进程结束游戏

            }

            if(gameOver){

               if(key==KeyEvent.VK_Y){

                  startGame();//Y键开始游戏

               }

            return;

            }

            switch(key){

            caseKeyEvent.VK_W:

sW=true;break;

            caseKeyEvent.VK_A:

sA=true;break;

            caseKeyEvent.VK_D:

sD=true;break;

            caseKeyEvent.VK_S:

sS=true;break;

            caseKeyEvent.VK_L:

sL=true;break;

            caseKeyEvent.VK_RIGHT:

sRight=true;break;

            caseKeyEvent.VK_LEFT:

sLeft=true;break;

            caseKeyEvent.VK_DOWN:

sDown=true;break;

            caseKeyEvent.VK_UP:

sUp=true;break;

            caseKeyEvent.VK_H:

sH=true;break;

            }

            repaint();

         }

         publicvoidkeyReleased(KeyEvente){

            intkey=e.getKeyCode();

            switch(key){

            caseKeyEvent.VK_W:

sW=false;break;

            caseKeyEvent.VK_A:

sA=false;break;

            caseKeyEvent.VK_D:

sD=false;break;

            caseKeyEvent.VK_S:

sS=false;break;

            caseKeyEvent.VK_H:

sH=false;break;

            caseKeyEvent.VK_RIGHT:

sRight=false;break;

            caseKeyEvent.VK_LEFT:

sLeft=false;break;

            caseKeyEvent.VK_DOWN:

sDown=false;break;

            caseKeyEvent.VK_UP:

sUp=false;break;

            caseKeyEvent.VK_L:

sL=false;break;

            }

         }

      };

      this.requestFocus();

      this.addKeyListener(l);

      

   }

   publicvoidlevel(){//每5分增加一辆敌人的坦克

      intlength=score/5+5;

      if(length>enemyTank.length){

         enemyTank=Arrays.copyOf(enemyTank,enemyTank.length+1);//坦克数组扩容

         enemyTank[enemyTank.length-1]=nextTank();//初始化数组最后的一辆坦克

         enemyTank[enemyTank.length-1].start();//启动这个坦克的线程

      }

   }

   publicvoidstartGame(){

      cleanShoot();//清空子弹

      shootNum=5;//可以发射的子弹数为5

      shootNum1=5;

      score=0;

      myTank[0]=newMyTank(550,370,4,1,-1,true);//初始化我的坦克

      myTank[1]=newMyTank(100,100,4,1,0,true);

      for(inti=0;i

         if(gameOver){//游戏结束,关闭每个坦克的线程

            enemyTank[i].s=false;

         }

      }

      enemyTank=newEnemyTanks[5];

      for(inti=0;i

         enemyTank[i]=nextTank();

      }

      gameOver=false;//游戏没有结束,表示开始

      myTank[0].start();//启动我的坦克线程

      myTank[1].start();

      for(inti=0;i

         enemyTank[i].start();

      }

      timer=newTimer();//匿名内部类Timer

      timer.schedule(newTimerTask(){

         publicvoidrun(){//重写run()函数

            repaint();

            shootAndRun();

         }

      },0,50);//50毫秒执行一次

   }

   /**检查游戏是否结束*/

   publicvoidcheckGameOver(){//模仿俄罗斯方块里面写的

      if(myTank[0].isLive()||myTank[1].isLive()){

         return;

      }

      gameOver=true;

      timer.cancel();

      repaint();

   }

   publicvoidshootAndRun(){

      if(sW){//如果开关sW=true就执行{}里面的代码

         myTank[1].moveUp();

      }elseif(sD){

         myTank[1].moveRight();

      }elseif(sS){

         myTank[1].moveDown();

      }elseif(sA){

         myTank[1].moveLeft();

      }if(sH&&myTank[1].isLive()){//如果sL=true并且坦克是活的,就执行

         if(shootNum1>=0){//如果允许的子弹数小于于0了,不执行

            myTank[1].shoot();

            shootNum1--;//控制子弹数量,射击一次,子弹减少,消失加1

         }

      }

      if(sUp){

         myTank[0].moveUp();

      }elseif(sRight){

         myTank[0].moveRight();

      }elseif(sLeft){

         myTank[0].moveLeft();

      }elseif(sDown){

         myTank[0].moveDown();

      }if(sL&&myTank[0].isLive()){

         if(shootNum>=0){

            myTank[0].shoot();

            shootNum--;//控制子弹数量,射击一次,子弹减少,消失加1

         }

      }

   }

   publicvoidpaint(Graphicsg){

      g.setColor(Color.white);

      g.fillRect(0,0,this.getWidth(),this.getHeight());//画背景

      paintWall(g);//画墙

      //画我的坦克

      paintTank(myTank[1].getX(),myTank[1].getY(),g,myTank[1].getDirect(),myTank[1].getWho(),myTank[1].isLive());

      paintTank(myTank[0].getX(),myTank[0].getY(),g,myTank[0].getDirect(),myTank[0].getWho(),myTank[0].isLive());

      for(inti=0;i

         paintTank(enemyTank[i].getX(),enemyTank[i].getY(),g,enemyTank[i].getDirect(),enemyTank[i].getWho(),enemyTank[i].isLive());

      }

      paintShoot(g);//画我射击的子弹

      paintEemyShoot(g);//画敌人发出的子弹

      paintScore(g);//画分数,及字符

      //paintMap(g);

   }

/*   publicvoidpaintMap(Graphicsg){//这是个方法可以生成漂亮的东西

      for(intj=0;j<3;j++){

         Randomcolor=newRandom();//通过Random生成随机颜色

          intr=color.nextInt(256);

          intg1=color.nextInt(256);

          intb=color.nextInt(256);

          g.setColor(newColor(r,g1,b));

         g.fillOval(color.nextInt(750),color.nextInt(530),5,5);

      }

      

   }*/

   

   publicvoidpaintScore(Graphicsg){//画字符相关的

      g.setColor(Color.lightGray);

      Fontf=getFont();

      Fontfont=newFont(f.getName(),Font.BOLD,0x1e);

      intx=130;

      inty=275;

      Stringstr="SCORE:

"+this.score;

      g.setFont(font);

      g.drawString(str,x,y);

      str="TANK:

"+enemyTank.length;

      x+=170;

      g.drawString(str,x,y);

      x+=140;

      str="[Q]Quit!

";

      if(gameOver){

         str="[Y]Start!

";

      }

      g.drawString(str,x,y);

   }

   publicvoidpaintWall(Graphicsg){//画中间的柱子

      g.setColor(Color.LIGHT_GRAY);

      g.fill3DRect(WIDTH/2-45,150,40,HEIGHT-300,false);

      g.fill3DRect(130,HEIGHT/2-20,WIDTH-300,40,false);

   }

   /**画自己坦克子弹,同时判断子弹有没有击中敌人*/

   publicvoidpaintShoot(Graphicsg){

      ShootDispeal();

      for(inti=0;i

         if(Shoot.myShoot[i]==0&&Shoot.myShoot[i+1]==0){

            continue;

         }

         g.setColor(Color.RED);

         g.fillOval(Shoot.myShoot[i],Shoot.myShoot[i+1],10,10);

         intx=Shoot.myShoot[i];

         inty=Shoot.myShoot[i+1];

         for(intj=0;j

            intex=enemyTank[j].getX();

            intey=enemyTank[j].getY();

            if(x>ex&&xey&&y

               score+=1;

               level();

               enemyTank[j].s=false;//坦克死亡,线程关闭

               enemyTank[j]=nextTank();

               enemyTank[j].start();

               Shoot.myShoot[i]=0;Shoot.myShoot[i+1]=0;//子弹消失

               Shoot.myShoot[i+2]=0;Shoot.myShoot[i+3]=0;

               shootNum++;

               shootNum1++;

            }

         }

         Shoot.myShoot[i]+=Shoot.myShoot[i+2];

         Shoot.myShoot[i+1]+=Shoot.myShoot[i+3];

      }

   }

   /**画敌人发出的子弹,同时判断是否击中了我的坦克*/

   publicvoidpaintEemyShoot(Graphicsg){

      ShootDispeal();

      for(inti=0;i

         if(Shoot.enemyShoot[i]==0&&Shoot.enemyShoot[i

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2