⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tank.java

📁 一个坦克游戏的源代码
💻 JAVA
字号:
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.util.Random;
public class Tank {
	
	public static final int XSPEED = 5;
	public static final int YSPEED = 5;
	
	public static final int LIFEVALUE = 100;
	private int life = LIFEVALUE;
	public int getLife() {
		return life;
	}

	public void setLife(int life) {
		this.life = life;
	}

	private int oldx, oldy;
	
	private boolean live = true;
	private static Random r = new Random();
	
	private BloodBar bb = new BloodBar();
	private int step = r.nextInt(12) + 3;
	
	public boolean isLive() {
		return live;
	}

	public void setLive(boolean live) {
		this.live = live;
	}

	private int x, y;
	
	private boolean bL = false, bR = false, bU = false, bD = false;
	
	TankClient tc;
	
	private boolean good;

	public boolean isGood() {
		return good;
	}
    
	private static Toolkit tk = Toolkit.getDefaultToolkit();
	private static Image[] tankImages = null;
	private static Map<String,Image> imgs = new HashMap<String,Image>();
	static
	{
		tankImages = new Image[]
		{
				tk.getImage(Tank.class.getClassLoader().getResource("images/tankD.gif")),
		        tk.getImage(Tank.class.getClassLoader().getResource("images/tankL.gif")),
		        tk.getImage(Tank.class.getClassLoader().getResource("images/tankLD.gif")),
		        tk.getImage(Tank.class.getClassLoader().getResource("images/tankLU.gif")),
		        tk.getImage(Tank.class.getClassLoader().getResource("images/tankR.gif")),
		        tk.getImage(Tank.class.getClassLoader().getResource("images/tankRD.gif")),
		        tk.getImage(Tank.class.getClassLoader().getResource("images/tankRU.gif")),
		        tk.getImage(Tank.class.getClassLoader().getResource("images/tankU.gif")),
		};
		imgs.put("D", tankImages[0]);
		imgs.put("L", tankImages[1]);
		imgs.put("LD", tankImages[2]);
		imgs.put("LU", tankImages[3]);
		imgs.put("R", tankImages[4]);
		imgs.put("RD", tankImages[5]);
		imgs.put("RU", tankImages[6]);
		imgs.put("U", tankImages[7]);
	}
	private Direction dir = Direction.STOP;
	public Direction ptDir = Direction.D;
	
	public static final int WIDTH = 30;
	public static final int HEIGHT = 30;

	public Tank(int x, int y,boolean good) {
		this.x = x;
		this.y = y;
		this.oldx = x;
		this.oldy = y;
		this.good = good;
	}

	public Tank(int x, int y, boolean good, Direction dir, TankClient tc) {
		this(x, y,good);
		this.oldx = x;
		this.oldy = y;
		this.dir = dir;
		this.tc = tc;
	}

	void move() {
		this.oldx = x;
		this.oldy = y;
		switch (dir) {
		case U:
			y -= YSPEED;
			break;
		case D:
			y += YSPEED;
			break;
		case L:
			x -= XSPEED;
			break;
		case R:
			x += XSPEED;
			break;
		case LU:
			x -= XSPEED;
			y -= YSPEED;
			break;
		case LD:
			x -= XSPEED;
			y += YSPEED;
			break;
		case RU:
			x += XSPEED;
			y -= YSPEED;
			break;
		case RD:
			x += XSPEED;
			y += YSPEED;
			break;
		case STOP:
			break;
		}
		if (dir != Direction.STOP)
		{
			ptDir = dir;
		}
		if(x < 0) x = 0;
		if(y < 30) y = 30;
		if(x + Tank.WIDTH > TankClient.GAME_WIDTH)
		{
			x = TankClient.GAME_WIDTH - Tank.WIDTH;
		}
		if(y + Tank.HEIGHT > TankClient.GAME_HEIGHT)
		{
			y = TankClient.GAME_HEIGHT - Tank.HEIGHT;
		}
		
		if(!good)
		{
			Direction[] dirs = Direction.values();
			if(step == 0)
			{
               step = r.nextInt(12) + 3;
			   int rn = r.nextInt(dirs.length);
			   dir = dirs[rn];
			}
			step--;
			if(r.nextInt(40) > 38) this.fire();
		}
	}

	public void draw(Graphics g) {
		if(!live) 
		{
			 if(!good)
				 tc.tanks.remove(this);  
			 return;
		}
		Color c = g.getColor();
		/*if(good) g.setColor(Color.RED);
		else g.setColor(Color.BLUE);
		g.fillOval(x, y, WIDTH, HEIGHT);*/
		g.setColor(Color.RED);
		if(good) bb.draw(g);
		g.setColor(c);
		switch (ptDir) {
		case U:
			g.drawImage(imgs.get("U"), x, y, null);
			break;
		case D:
			g.drawImage(imgs.get("D"), x, y, null);
			break;
		case L:
			g.drawImage(imgs.get("L"), x, y, null);
			break;
		case R:
			g.drawImage(imgs.get("R"), x, y, null);
			break;
		case LU:
			g.drawImage(imgs.get("LU"), x, y, null);
			break;
		case LD:
			g.drawImage(imgs.get("LD"), x, y, null);
			break;
		case RU:
			g.drawImage(imgs.get("RU"), x, y, null);
			break;
		case RD:
			g.drawImage(imgs.get("RD"), x, y, null);
			break;
		}
		move();
	}

	public void keyPressed(KeyEvent e) {
		int key = e.getKeyCode();
		switch (key) {
		case KeyEvent.VK_F2:
			if(!this.live)
			{
				this.live = true;
				this.life = LIFEVALUE;
			}
			break;
		case KeyEvent.VK_RIGHT:
			bR = true;
			break;
		case KeyEvent.VK_LEFT:
			bL = true;
			break;
		case KeyEvent.VK_UP:
			bU = true;
			break;
		case KeyEvent.VK_DOWN:
			bD = true;
			break;
		}
		//if (dir != Direction.STOP)
			//ptDir = dir;
		locateDirection();
	}

	public void keyReleased(KeyEvent e) {
		int key = e.getKeyCode();
		switch (key) {
		case KeyEvent.VK_A:
			superFire();
			break;
		case KeyEvent.VK_CONTROL:
			fire();
			break;
		case KeyEvent.VK_RIGHT:
			bR = false;
			break;
		case KeyEvent.VK_LEFT:
			bL = false;
			break;
		case KeyEvent.VK_UP:
			bU = false;
			break;
		case KeyEvent.VK_DOWN:
			bD = false;
			break;
		}
		locateDirection();
	}

	void locateDirection() {

		if (bR && !bL && !bU && !bD)
			dir = Direction.R;
		else if (bR && !bL && bU && !bD)
			dir = Direction.RU;
		else if (bR && !bL && !bU && bD)
			dir = Direction.RD;
		else if (!bR && bL && !bU && !bD)
			dir = Direction.L;
		else if (!bR && bL && bU && !bD)
			dir = Direction.LU;
		else if (!bR && bL && !bU && bD)
			dir = Direction.LD;
		else if (!bR && !bL && bU && !bD)
			dir = Direction.U;
		else if (!bR && !bL && !bU && bD)
			dir = Direction.D;
		else if (!bR && !bL && !bU && !bD)
			dir = Direction.STOP;

	}

	public Missile fire() {
		if(!live) return null;
		int x = this.x + tankImages[0].getWidth(null)/ 2 - Missile.WIDTH / 2;
		int y = this.y + tankImages[0].getHeight(null)/ 2 - Missile.HEIGHT / 2;
		Missile m = new Missile(x, y, good, ptDir, this.tc);
	    tc.missiles.add(m);
		return m;
	}
	
	public Missile fire(Direction dir) {
		if(!live) return null;
		int x = this.x + tankImages[0].getWidth(null) / 2 - Missile.WIDTH / 2;
		int y = this.y + tankImages[0].getHeight(null) / 2 - Missile.HEIGHT / 2;
		Missile m = new Missile(x, y, good, dir, this.tc);
	    tc.missiles.add(m);
		return m;
	}
	
	private void superFire()
	{
		Direction[] dirs = Direction.values();
		for(int i=0; i<8; i++)
		{
			fire(dirs[i]);
		}
	}
	
	public Rectangle getRect()
    {
    	return new Rectangle(x,y,WIDTH,HEIGHT);
    }
	
	private void stay()
	{
		x = oldx;
		y = oldy;
		
	}

	public boolean collidesWithWall(Wall w)
    {
    	if(this.live && this.getRect().intersects(w.getRect()))
    	{
    		this.stay();
    		return true;
    	}
    	return false;
    }
	
	public boolean collidesWithTanks(java.util.List<Tank> tanks)
	{
		for(int i=0; i<tanks.size(); i++)
		{
			Tank t = tanks.get(i);
			if(this != t)
			{
				if(this.live && t.isLive() && this.getRect().intersects(t.getRect()))
				{
					this.stay();
					t.stay();
					return true;
				}
			}
		}
		return false;
	}
	private class BloodBar
	{
		public void draw(Graphics g)
		{
			Color c = g.getColor();
			g.setColor(Color.RED);
			g.drawRect(x, y-10, tankImages[0].getWidth(null), 10);
			int w = tankImages[0].getWidth(null) * life/100;
			g.fillRect(x, y-10, w, 10);
			g.setColor(c);
		}
	}
	public boolean eat(Blood b)
	{
		if(this.live && b.isLive() && this.getRect().intersects(b.getRect()))
    	{
    		this.life = LIFEVALUE;
    		b.setLive(false);
    		return true;
    	}
    	return false;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -