java两人大战坦克.docx
- 文档编号:12277040
- 上传时间:2023-04-17
- 格式:DOCX
- 页数:18
- 大小:21.13KB
java两人大战坦克.docx
《java两人大战坦克.docx》由会员分享,可在线阅读,更多相关《java两人大战坦克.docx(18页珍藏版)》请在冰豆网上搜索。
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&&x 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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- java 人大 坦克