Java——坦克大战(3)

本次实现:

  • 让敌方坦克能向随机方向移动
  • 敌我双方均能发射子弹且能击毁目标
  • 实现击中目标后产生爆炸效果
  • 优化相关细节及参数,将部分功能封装成一个(函数)方法
详细代码:
1、
package com.tank;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;

public class TankGame extends JFrame{
	
	MyPanel mp = null;
	
	public static void main(String[] args) {
		TankGame test = new TankGame();

	}
		
		//构造函数
	public TankGame(){
		mp = new MyPanel();
		Thread t  = new Thread(mp);
		t.start();//不启动run()方法不会定时重绘
		
		this.add(mp);
		this.addKeyListener(mp);
		
		this.setSize(410, 300);
		this.setTitle("坦克大战");
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setVisible(true);
		
	}
	

}

//炸弹类
class Bomb{
	int x, y;
	int life = 13;
	boolean isLive =true;
	
	public Bomb(int x, int y){
		this.x = x;
		this.y = y;
	}
	
	//生命周期	如不定义周期,爆炸效果会瞬间执行完毕
	public void lifeDown(){
		if (life>0){
			life--;
		}else{
			isLive = false;
		}	
	}
}


class MyPanel extends JPanel implements KeyListener, Runnable{
	//定义我的坦克
	Hero hero = null;
	
	//定义敌军坦克组,vector tanks 简写为vts
	Vector  vts= new Vector ();
	
	int eSize = 3;
	
	//定义一个炸弹集合
	Vector  vBombs= new Vector();
	
	//定义三张爆炸效果图
	Image image1 = null;
	Image image2 = null;
	Image image3 = null;
	
	public MyPanel(){
		hero = new Hero(186, 235);
		hero.setColor(0);
		
		//初始化爆炸效果图
		image1 = Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/bomb_1.gif"));
		image2 = Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/bomb_2.gif"));
		image3 = Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/bomb_3.gif"));
		//初始化敌军坦克
		for(int i=0; i8){
				g.drawImage(image1, bomb.x, bomb.y, 30, 30, this);
			}else if(bomb.life>4){
				g.drawImage(image2, bomb.x, bomb.y, 30, 30, this);
			}else {
				g.drawImage(image3, bomb.x, bomb.y, 30, 30, this);
			}
			bomb.lifeDown();//生命周期减少
			if(bomb.isLive==false){
				vBombs.remove(bomb);
			}
		}
		
		//画出敌军坦克
		for(int i=0; it.x && b.xt.y && b.yt.x && b.xt.y && b.y
2、
package com.tank;

import java.util.Vector;

class Tank{
	//坦克横、纵坐标 
	int x = 0;	
	int y = 0;	
	//坦克颜色
	int color = 0;
	//是否存活
	boolean isLive = true;
	public int getColor() {
		return color;
	}

	public void setColor(int color) {
		this.color = color;
	}

	//坦克方向   0 = 上, 1 = 下,2 = 左, 3 = 右
	int direct = 0;

	public int getDirect() {
		return direct;
	}

	public void setDirect(int direct) {
		this.direct = direct;
	}

	public int getX() {
		return x;
	}

	public void setX(int x) {
		this.x = x;
	}

	public int getY() {
		return y;
	}

	public void setY(int y) {
		this.y = y;
	}

	public Tank(int x, int y){
		this.x = x; 
		this.y = y;
	}
}

	//英雄坦克——我的
class Hero extends Tank{
	//创建英雄坦克的炮弹
	Bullet b = null;
	//创建向量
	Vector  vb = new Vector ();
	//移动速度
	int speed = 3;
	//坦克的初始位置
	public Hero (int x, int y){
		super(x, y);	
	}
	//我的坦克 移动方法
	public void moveUp(){
		y-=speed;
	}
	public void moveDown(){
		y+=speed;
	}
	public void moveLeft(){
		x-=speed;
	}
	public void moveRight(){
		x+=speed;
	}
	
		//坦克开炮
	public void shot(){
		switch(this.direct){
		case 0:
			b = new Bullet(x+10, y, this.direct);//向上
			vb.add(b);//将炮弹加入向量
			break;
		case 1:
			b = new Bullet(x+10, y+30, this.direct);//向下
			vb.add(b);
			break;
		case 2:
			b = new Bullet(x, y+20, this.direct);//向左
			vb.add(b);
			break;
		case 3:
			b = new Bullet(x+30, y+20, this.direct);//向右
			vb.add(b);
			break;
		}
			//启动炮弹线程 
		Thread t = new Thread(b);
		t.start();
	}
	
}

//敌方坦克     实现线程接口
class Enemy extends Tank implements Runnable{
	
	//移动速度
	int speed = 1;
	
	//定义一个向量存放敌方坦克的炮弹
	Vector  eb = new Vector ();

	public Enemy(int x, int y) {
		super(x, y);
	}

	@Override
	public void run() {
		while(true){
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
				// TODO 自动生成的 catch 块
				e.printStackTrace();
			}
			
			switch(this.direct){
			case 0:		//上
				for(int i=0; i<25; i++){
					if(y>0){
						y-=speed;
					}
					try {
						Thread.sleep(50);
					} catch (InterruptedException e) {
						// TODO 自动生成的 catch 块
						e.printStackTrace();
					}
				}
				break;
			case 1:		//下
				for(int i=0; i<30; i++){
					if(y<300-30){ //必须要减去一个y轴的长度,不然坦克y点在边界时,其部分出界了
						y+=speed;
					}
					try {
						Thread.sleep(50);
					} catch (InterruptedException e) {
						// TODO 自动生成的 catch 块
						e.printStackTrace();
					}
				}
				break;
			case 2:		//左
				for(int i=0; i<35; i++){
					if(x>0){
						x-=speed;
					}
					try {
						Thread.sleep(50);
					} catch (InterruptedException e) {
						// TODO 自动生成的 catch 块
						e.printStackTrace();
					}
				}
				break;
			case 3:		//右
				for(int i=0; i<40; i++){
					if(x<400-30){
						x+=speed;
					}
					try {
						Thread.sleep(50);
					} catch (InterruptedException e) {
						// TODO 自动生成的 catch 块
						e.printStackTrace();
					}
				}
				break;
			}
			
			if(isLive){
				if(eb.size()<5){
					Bullet b = null;
					switch(direct){
					case 0:
						b = new Bullet(x+9, y, this.direct);//向上
						eb.add(b);//将炮弹加入向量
						break;
					case 1:
						b = new Bullet(x+9, y+30, this.direct);//向下
						eb.add(b);
						break;
					case 2:
						b = new Bullet(x, y+19, this.direct);//向左
						eb.add(b);
						break;
					case 3:
						b = new Bullet(x+30, y+19, this.direct);//向右
						eb.add(b);
						break;
					}
					Thread t = new Thread(b);
					t.start();
				}
			}
			
			
			
				//坦克产生一个随机方向
			this.direct = (int)(Math.random()*4);
				//坦克死亡后退出线程
			if(this.isLive == false){
				break;
			}
		}
		
	}
	
}

//炮弹类
class Bullet implements Runnable{
	int x, y;
	int direct;	//坦克方向决定炮弹方向
	int speed = 6;
	boolean isLive = true;//用于判定炮弹是否死亡
	
	public Bullet(int x, int y, int direct){
		this.x = x;
		this.y = y;
		this.direct = direct;
	}
	
	@Override//炮弹运行
	public void run() {
		while(isLive){
			try {
				Thread.sleep(130);
			} catch (InterruptedException e) {
				// TODO 自动生成的 catch 块
				e.printStackTrace();
			}
			switch(direct){
			case 0:
				y-=speed;
				break;
			case 1:
				y+=speed;
				break;
			case 2:
				x-=speed;
				break;
			case 3:
				x+=speed;
			}
			if(x<0 || x>400|| y<0 || y>300){
				isLive = false;
			}
		}
		
	}
	
}

演示效果:
Java——坦克大战(3)_第1张图片






你可能感兴趣的:(Java)