Java练习坦克大战version 36.docx
《Java练习坦克大战version 36.docx》由会员分享,可在线阅读,更多相关《Java练习坦克大战version 36.docx(27页珍藏版)》请在冰豆网上搜索。
![Java练习坦克大战version 36.docx](https://file1.bdocx.com/fileroot1/2022-11/28/765077e2-73cc-424a-9559-c801e361a39b/765077e2-73cc-424a-9559-c801e361a39b1.gif)
Java练习坦克大战version36
Java坦克大战version3.6
面向对象,每个对象各司其职,各负其责。
界面:
简介:
start
引包
初始化窗口对象
窗口对象
继承Jframe
变量:
面板对象
构造:
初始化面板对象
启动面板对象进程
把面板添加到窗口
为面板对象注册监听
设置窗口大小
显示窗口库
设置关闭窗口时退出程序
main
实例化窗口对象
------------------------------------------------------------------------------------------------
面板对象
继承Jpanel
KeyListener,Runnable
变量:
hero
ets
记录敌人坦克数组
enSize
bombs
image1
image2
image3
构造方法:
声明创建我的坦克
声明创建敌人的坦克
为敌人的坦克启动线程
发射一颗子弹
子弹加入子弹数组
启动子弹线程
坦克加入ets数组
声明初始化爆照效果图片变量
paint
画出各个对象
在数组中删除死去的子弹
减少炸弹生命值
画坦克
判断坦克是否被击中
击中的话创建炸弹对象
run
每个1000毫秒调用hitTank
每辆坦克子弹保持5发
监听
---------------
坦克类
我的坦克
敌人坦克
属性:
坐标
属性:
子弹数组
属性:
子弹数组
方向
子弹
生命
颜色
行为:
开火
构造:
父类
速度
移动
run:
移动
构造:
初始化坐标
改变方向
判断生命
代码:
/**
*坦克大战3.6
*双方坦克均可移动、发射子弹
*敌方坦克可以被击中消失
*有爆照效果
*
*/
packageTankGame4;
//packageMyTankGame4;
importjava.util.Vector;
importjava.awt.*;
importjava.awt.event.KeyEvent;
importjava.awt.event.KeyListener;
importjava.util.*;
importjavax.swing.*;
publicclassMyTankGame4extendsJFrame
{
MyPanelmp=null;
publicstaticvoidmain(String[]args)
{
MyTankGame4mytankgame1=newMyTankGame4();
}
publicMyTankGame4()
{
mp=newMyPanel();
//启动mp线程
Threadt=newThread(mp);
t.start();
this.add(mp);
this.addKeyListener(mp);
this.setSize(400,300);
this.setVisible(true);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
}
}
classMyPanelextendsJPanelimplementsKeyListener,Runnable
{
//定义我的坦克,成员变量
Herohero=null;
//定义敌人的坦克组
Vectorets=newVector();
intenSize=5;
//定义炸弹集合
Vectorbombs=newVector();
publicvoidrun()
{
//每个一百毫秒去重画子弹
while(true)
{
try{
Thread.sleep(100);
}catch(InterruptedExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
for(inti=0;i{
ShotmyShot=hero.ss.get(i);
//判断子弹是否有效
if(myShot.isLive)
{
//取出每个坦克,与它判断
for(intj=0;j{
//取出坦克
EnemyTanket=ets.get(j);
if(et.isLive)
{
this.hitTank(myShot,et);
}
}
}
}
this.repaint();
//判断是否需要给坦克加入新的子弹
for(inti=0;i{
EnemyTanket=ets.get(i);
if(et.isLive)
{
if(et.ss.size()<5&&(int)(100*Math.random())>75)
{
//每辆坦克的子弹少于5发的话
//添加
Shots=null;
switch(et.direct)
{
case0:
s=newShot(et.x+9,et.y-1,0);
et.ss.add(s);
break;
case1:
s=newShot(et.x+30,et.y+10,1);
et.ss.add(s);
break;
case2:
s=newShot(et.x+9,et.y+30,2);
et.ss.add(s);
break;
case3:
s=newShot(et.x-1,et.y+9,3);
et.ss.add(s);
break;
}
//启动子弹线程
Threadt=newThread(s);
t.start();
}
}
}
}
}
publicvoidpaint(Graphicsg)
{
super.paint(g);
g.fillRect(0,0,400,300);
//画出自己的坦克
this.drawTank(hero.getX(),hero.getY(),g,this.hero.direct,1);
//从Vectorss中取出每一颗子弹,并画出
for(inti=0;i{
ShotmyShot=hero.ss.get(i);
//画出子弹,只画一颗子弹
if(myShot!
=null&&myShot.isLive==true)
{
g.draw3DRect(myShot.x,myShot.y,1,1,false);
}
if(myShot.isLive==false)
{
//从ss中删除该子弹
hero.ss.remove(myShot);
}
}
//画出炸弹
for(inti=0;i{
//取出炸弹
Bombb=bombs.get(i);
if(b.life>6)
{
g.drawImage(image1,b.x,b.y,30,30,this);
}
elseif(b.life>3)
{
g.drawImage(image2,b.x,b.y,30,30,this);
}
else
{
g.drawImage(image3,b.x,b.y,30,30,this);
}
//让b的生命值减小
b.lifeDown();
//如果炸弹的生命值为0,我们就剔除
if(b.life==0)bombs.remove(b);
}
//画出敌人的坦克
for(inti=0;i{
EnemyTanket=ets.get(i);
if(et.isLive)
{
this.drawTank(ets.get(i).getX(),ets.get(i).getY(),g,ets.get(i).getDirect(),0);
//画出敌人的子弹
for(intj=0;j{
//取出子弹
ShotenemyShot=et.ss.get(j);
if(enemyShot.isLive)
{
g.draw3DRect(enemyShot.x,enemyShot.y,1,1,false);
}
else
{
//如果敌人的坦克死亡就从Vector去掉
et.ss.remove(enemyShot);
}
}
}
}
}
//写一个函数专门判断子弹是否击中敌人坦克
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;
//创建一个炸弹,放入Vector
Bombb=newBomb(et.x,et.y);
//放入Vector
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;
//创建一个炸弹,放入Vector
Bombb=newBomb(et.x,et.y);
//放入Vector
bombs.add(b);
}
}
}
//画出坦克函数(扩展)
publicvoiddrawTank(intx,inty,Graphicsg,intdirect,inttype)
{
//判断类型
switch(type)
{
case0:
g.setColor(Color.cyan);break;
case1:
g.setColor(Color.yellow);break;
}
//判断方向
switch(direct)
{
//向上
case0:
//画出我的坦克(到时候再封装成一个函数)
//1.画出左面的矩形
//g.drawRect(hero.getX(),hero.getY(),5,30);
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);
//画出中间的圆
g.fillOval(x+4,y+10,10,10);
//画出线
g.drawLine(x+9,y+15,x+9,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:
//向下
g.fill3DRect(x,y,5,30,false);
g.fill3DRect(x+15,y,5,30,false);
g.fill3DRect(x+5,y+5,10,20,false);
g.fillOval(x+4,y+10,10,10);
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;
}
}
//定义三张图片,三张图片切换组成一颗炸弹
Imageimage1=null;
Imageimage2=null;
Imageimage3=null;
//构造函数
publicMyPanel()
{
hero=newHero(100,100);
//初始化敌人的坦克
for(inti=0;i{
//创建敌人的坦克对象
EnemyTanket=newEnemyTank((i+1)*50,0);
et.setColor(0);
et.setDirect
(2);
//启动敌人的坦克
Threadt=newThread(et);
t.start();
//给敌人坦克添加一颗子弹
Shots=newShot(et.x+10,et.y+30,2);
et.ss.add(s);
Threadt2=newThread(s);
t2.start();
//加入
ets.add(et);
}
image1=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/33.jpg"));
image2=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/22.jpg"));
image3=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/11.jpg"));
}
//键按下处理a表示左,s表示向下,w表示向上,d表示向右
publicvoidkeyPressed(KeyEvente)
{
if(e.getKeyCode()==KeyEvent.VK_W)
{
//设置我的坦克的方向
this.hero.setDirect(0);
this.hero.moveUp();
}
elseif(e.getKeyCode()==KeyEvent.VK_S)
{
this.hero.setDirect
(2);
this.hero.moveDown();
}
elseif(e.getKeyCode()==KeyEvent.VK_D)
{
this.hero.setDirect
(1);
this.hero.moveRight();
}
elseif(e.getKeyCode()==KeyEvent.VK_A)
{
this.hero.setDirect(3);
this.hero.moveLeft();
}
if(e.getKeyCode()==KeyEvent.VK_J)
{
this.hero.shotEnemy();
}
//必须重新绘制Panel
this.repaint();
}
publicvoidkeyReleased(KeyEvente)
{
}
publicvoidkeyTyped(KeyEvente)
{
}
}
classTank
{
//设置坦克的速度
intspeed=3;
publicintgetSpeed()
{
returnspeed;
}
publicvoidsetSpeed(intspeed)
{
this.speed=speed;
}
//表示坦克的横坐标
intx=0;
//坦克的纵坐标
inty=0;
intdirect=0;
intcolor;
//坦克方向,0表示上,1表示右,2表示下,3表示左
publicintgetColor(){
returncolor;
}
publicvoidsetColor(intcolor){
this.color=color;
}
publicintgetDirect()
{
returndirect;
}
publicvoidsetDirect(intdirect)
{
this.direct=direct;
}
publicTank(intx,inty)
{
this.x=x;
this.y=y;
}
publicintgetX()
{
returnx;
}
publicvoidsetX(intx)
{
this.x=x;
}
publicintgetY()
{
returny;
}
publicvoidsetY(inty)
{
this.y=y;
}
}
classEnemyTankextendsTankimplementsRunnable
{
booleanisLive=true;
//定义一个向量,可以存放敌人的子弹
Vectorss=newVector();
//敌人添加子弹应该在刚刚创建坦克和坦克子弹死亡之后
publicEnemyTank(intx,inty)
{
super(x,y);
}
publicvoidrun(){
while(true)
{//移动前进
switch(this.direct)
{
case0:
for(inti=0;i<(int)(100*Math.random());i++)
{
try
{
Thread.sleep(50);
}
catch(Exceptione)
{
e.printStackTrace();
}
if(y>=speed)
{
y-=speed;
}
}
break;
case1:
for(inti=0;i<(int)(100*Math.random());i++)
{
try
{
Thread.sleep(50);
}
catch(Exceptione)
{
e.printStackTrace();
}
if(x<=400-(speed+30))
{
x+=speed;
}
}
break;
case2:
for(inti=0;i<(int)(100*Math.random());i++)
{
try
{
Thread.sleep(50);
}
catch(Exceptione)
{
e.printStackTrace();
}
if(y<=300-(speed+30))
{
y+=speed;
}
}
break;
case3:
for(inti=0;i<(int)(100*Math.random());i++)
{
try
{
Thread.sleep(50);
}
catch(Exceptione)
{
e.printStackTrace();
}
if(x>=speed)
{
x-=speed;
}
}
break;
}
//让坦克随机产生一个新的方向
if(Math.random()>0.50)
this.direct=(int)(Math.random()*4);
//判断敌人坦克是否死亡
if(this.isLive==false)
{
//让坦克死亡后,退出线程
break;
}
}
}
}
//我的坦克
classHeroextendsTank
{
//子弹
//Shots=null;
Vectorss=newVector();
Shots=null;
publicHero(intx,inty)
{
super(x,y);
}
//坦克向上移动
//坦克的开火的能力和动作
publicvoidshotEnemy()
{
switch(this.direct)
{
case0:
s=newShot(x+9,y-1,0);
ss.add(s);
break;
case1:
s=newShot(x+30