1.主类 package s1230坦克大战; import java.awt.Color; import java.awt.Graphics; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.util.Vector; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JPanel; import 工具类.ThreadSleep; public class Tank1 extends JFrame { static int panelXLength=700; static int panelYlength=700; static int gameXLength=500; static int gameYLength=500; static int zidanNum=0; MyPanel mp=null; public static void main(String[] args) { Tank1 t1=new Tank1(); } public Tank1() { mp=new MyPanel(); this.add(mp); this.setTitle("坦克大战"); //设置窗体的标题 this.setLocationRelativeTo(null); //设置窗体出现位置居中 this.setDefaultCloseOperation(3); //设置窗体的关闭操作 this.setResizable(true); //设置禁止调整窗体的大小 this.setIconImage((new ImageIcon("E:/Michael/javaImage/扫雷图片/bomb.png").getImage())); //设置标题栏图标 this.setSize(panelXLength,panelYlength); //设置窗体的大小 this.setLocationRelativeTo(null); //设置窗体出现在屏幕中间 this.addKeyListener(mp); this.setVisible(true); Thread o=new Thread(mp); //添加线程很重要 不然子弹不会动 o.start(); //这个线程的作用是不断执行MyPanel } class MyPanel extends JPanel implements KeyListener,Runnable { MyTank mt=null; //有什么作用? Vector dtk=new Vector(); //new 出一个新的vector对象,vector多线程 int tankNum=3; public MyPanel() { mt=new MyTank(250,400); //创建我方坦克 for(int i=0;idt.x&&zd.xdt.y&&zd.ydt.x&&zd.xdt.y&&zd.y5) y-=speed;} //向上移动 public void downMove() {if(y<460)y+=speed;} //向下移动 public void leftMove() {if(x>5) x-=speed;} //向左移动 public void rightMove() {if(x<460)x+=speed;} //向右移动 public int getFangxiang() {return fangxiang;} public void setFangxiang(int fangxiang) {this.fangxiang = fangxiang;} public int getLeixing() {return leixing;} public void setLeixing(int leixing) {this.leixing = leixing;} } class MyTank extends Tank { Vector aa=new Vector(); //专门存放子弹,来解决一按发射键子弹消失的问题 Zidan zd=null; public MyTank(int x,int y) {super(x,y);} //调用父类的构造方法 public void shoot() { switch(this.fangxiang) { case 0: zd=new Zidan(x+10,y,0); aa.add(zd);break; //每发射一颗子弹都加入到容器Vector中 case 1: zd=new Zidan(x,y+10,1); aa.add(zd);break; case 2: zd=new Zidan(x+10,y+30,2); aa.add(zd);break; case 3: zd=new Zidan(x+30,y+10,3); aa.add(zd);break; } Thread t=new Thread(zd); //这个线程是为了让子弹动起来 t.start(); } } class EnemyTank extends Tank implements Runnable { int speed=1; //每次线程调用,坦克前进一次的距离 Zidan zd=null; Vector dzd=new Vector(); //专门存放子弹,来解决一按发射键子弹消失的问题 public EnemyTank(int x,int y) {super(x,y);} //调用父类的构造方法 public void shoot() { switch(this.fangxiang) { case 0: zd=new Zidan(x+10,y,0); dzd.add(zd);break; //每发射一颗子弹都加入到容器Vector中 case 1: zd=new Zidan(x,y+10,1); dzd.add(zd);break; case 2: zd=new Zidan(x+10,y+30,2); dzd.add(zd);break; case 3: zd=new Zidan(x+30,y+10,3); dzd.add(zd);break; } Thread t=new Thread(zd); //这个线程是为了让子弹动起来 t.start(); } public void run() { while(true) { int length; Random a=new Random(); this.fangxiang=(int)(Math.random()*4); //随机产生方向 switch(this.fangxiang) { case 0: length=a.nextInt(59)+13; //每次随机方向,坦克前进的距离为 次数*speed,就是每次随机方向前进的总距离 for(int i=0;i5)y-=speed; else break; try {Thread.sleep(50);} //通过线程挂起的时间,控制地方坦克移动的频率,0.2秒前进一次 catch (Exception e) {} } break; case 1: length=a.nextInt(59)+13; //每次随机方向,坦克前进的次数 次数*speed,就是每次随机方向前进的总距离 for(int i=0;i5)x-=speed; else break; try {Thread.sleep(50);} //通过线程挂起的时间,控制地方坦克移动的频率,0.2秒前进一次 catch (Exception e) {} } break; case 2: length=a.nextInt(59)+13; //每次随机方向,坦克前进的次数 次数*speed,就是每次随机方向前进的总距离 for(int i=0;i dzd=new Vector(); //坦克发子弹的代码 time++; if(time%2==0) { if(life) { if(dzd.size()<5) { Zidan zd=null; switch(fangxiang) { case 0: zd=new Zidan(x+10,y,0); dzd.add(zd); break; case 1: zd=new Zidan(x+10,y,1); dzd.add(zd); break; case 2: zd=new Zidan(x+10,y,2); dzd.add(zd); break; case 3: zd=new Zidan(x+10,y,3); dzd.add(zd); break; } Thread t5=new Thread(zd); t5.start(); } } } } } } class Zidan implements Runnable { int x,y; int fangxiang; int speed=9; boolean life=true; public Zidan(int x,int y,int fangxiang) {this.x=x; this.y=y; this.fangxiang=fangxiang; } public void run() { while(true) //线程下面有死循环都要有休眠时间 { try {Thread.sleep(50);} catch (Exception e) {} switch(fangxiang) { case 0: y-=speed;break; case 1: x-=speed;break; case 2: y+=speed;break; case 3: x+=speed;break; } if(x<0||x>500||y<0||y>500) //子弹出了游戏边界就自动就将生命值设为false {this.life=false; break;} } } }