Java 坦克大战单机版 源代码

Java 坦克大战单机版 源代码

尚学堂版本的修改版

玩法:
方向键:控制走动
Ctrl:控制发弹
A:超级子弹
X:八方向发弹
=:添加敌方坦克
F2:重新开始
其他功能:
在头上实时显示血条
吃到血块时能补血
自动积分
敌方坦克过少时自动添加
收获:
系统复习了J2SE的基本上所有内容
对软件工程的理解进一步加深
对面向对象的思想及其优点进一步加深
熟悉了eclipse的使用,包括打包发布以及Doc的生成

源代码:

//TankClient.java
 
package edu.wkx;
import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
 
/**
 * 坦克客户端主类
 * @author Java_Bean 王凯旋
 *
 */
 
@SuppressWarnings("serial")
public class TankClient extends Frame {
 
	static final int GAME_WIDTH = 800;
	static final int GAME_HEIGHT = 600;
	private int x = 50;
	private int y = 50;
	private int refreshTime = 16;
	private int bloodTime = 500;
	private int bloodStep = 0;
	private int maxBloods = 10;
	private int minTanks = 3;
	private int maxTanks = 20;
	private Image bufImg = null;
	private Color bgColor = Color.GREEN;
	private boolean hasGetdist = false;
	private int disX = 0;
	private int disY = 0;
	private int enemyNum = 10;
	private static Random rand = new Random();
	private boolean start = false;
	private int score = 0;
	private int killPoint = 5;
 
	private List<Explode> explodes = new ArrayList<Explode>();
	private List<Tank> tanks = new ArrayList<Tank>();
	private List<Missile> missiles = new ArrayList<Missile>();
	private List<Wall> walls = new ArrayList<Wall>();
	private List<Blood> bloods = new ArrayList<Blood>();
 
	/**
	 * 启动窗口
	 */
	
	public void launchFrame() {
		this.setTitle("TankWar");
		this.setLocation(300, 300);
		this.setSize(GAME_WIDTH, GAME_HEIGHT);
		this.setResizable(false);
		this.addWindowListener(new WindowAdapter() {
 
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
 
		});
		this.addMouseListener(new MouseAdapter() {
 
			public void mouseReleased(MouseEvent e) {
				hasGetdist = false;
			}
 
		});
		this.addMouseMotionListener(new MouseAdapter() {
 
			public void mouseDragged(MouseEvent e) {
 
				if (!hasGetdist) {
					disX = e.getX();
					disY = e.getY();
					hasGetdist = true;
				}
				setLocation(e.getXOnScreen() - disX, e.getYOnScreen() - disY);
			}
 
		});
		this.setBackground(bgColor);
		this.addKeyListener(new KeyMonitor());
		this.setVisible(true);
		gameInit();
	}
	
	private void gameInit() {
		tanks.add(new Tank(x, y, true, this));
		addTank(10);
		walls.add(new Wall(300, 400, 300, 30));
		walls.add(new Wall(400, 300, 10, 200));
		score = 0;
		start = true;
	}
 
	// 重写paint方法
 
	private void addBlood() {
		bloodStep++;
		if (bloodStep >= bloodTime && bloods.size() < maxBloods) {
			bloodStep = 0;
			Blood blood = new Blood(x, y);
			blood.setX(rand.nextInt(GAME_WIDTH - blood.getSize()));
			blood.setY(rand.nextInt(GAME_HEIGHT - blood.getSize() - 25) + 25);
			for (int i = 0; i < tanks.size(); i++)
				if (blood.getRect().intersects(tanks.get(i).getRect()))
					return;
			for (int i = 0; i < walls.size(); i++)
				if (blood.getRect().intersects(walls.get(i).getRect()))
					return;
			for (int i = 0; i < bloods.size(); i++)
				if (blood.getRect().intersects(bloods.get(i).getRect()))
					return;
			bloods.add(blood);
		}
	}
 
	/**
	 * 游戏对象绘制方法
	 */
	
	public void paint(Graphics g) {
		if (start) {
			addBlood();
			g.drawString("MissilesCount : " + missiles.size(), 10, 40);
			g.drawString("ExplodeCount : " + explodes.size(), 10, 50);
			g.drawString("TanksCount : " + (tanks.size()), 10, 60);
			g.drawString("WallsCount : " + walls.size(), 10, 70);
			g.drawString("BloodsCount : " + bloods.size(), 10, 80);
			g.drawString("Score : " + score, 10, 100);
			for (int i = 0; i < explodes.size(); i++)
				explodes.get(i).draw(g);
			for (int i = 0; i < missiles.size(); i++) {
				Missile missile = missiles.get(i);
				for (int j = 0; j < walls.size(); j++) {
					Wall w = walls.get(j);
					if (missile.hitWall(w))
						missiles.remove(missile);
				}
				for (int k = 0; k < tanks.size(); k++) {
					Tank tank = tanks.get(k);
					if (missiles.contains(missile) && missile.hitTank(tank)) {
						missiles.remove(missile);
						int life = tank.getLife() - missile.getAttackHurt();
						if (life <= 0) {
							score += killPoint;
							tanks.remove(tank);
							explodes.add(new Explode(tank.getX()
									+ tank.getSize() / 2, tank.getY()
									+ tank.getSize() / 2, this));
							if (tank.isGood())
								gameOver();
						} else {
							tank.setLife(life);
						}
					}
				}
			}
			for (int i = 0; i < tanks.size(); i++) {
				Tank t = tanks.get(i);
				t.draw(g);
				if (t.isGood())
					g.drawString("TankLife : " + t.getLife(), 10, 90);
				for (int j = 0; j < bloods.size(); j++) {
					Blood blood = bloods.get(j);
					if (blood.getRect().intersects(t.getRect())) {
						bloods.remove(blood);
						t.setLife(t.getLife() + blood.getBlood());
					}
				}
			}
			for (int i = 0; i < missiles.size(); i++)
				missiles.get(i).draw(g);
			for (int i = 0; i < walls.size(); i++)
				walls.get(i).draw(g);
			for (int i = 0; i < bloods.size(); i++)
				bloods.get(i).draw(g);
			if(tanks.size()<minTanks)
				addTank(maxTanks-tanks.size());
		} else {
			g.drawString("GAME OVER", 10, 40);
			g.drawString("SCORE : " + score, 10, 60);
			g.drawString("PRESS F2 TO RESTART", 10, 80);
		}
	}
 
	private void gameOver() {
		tanks.clear();
		missiles.clear();
		bloods.clear();
		walls.clear();
		start = false;
	}
 
	/**
	 * 添加双缓冲消除屏幕闪烁
	 */
 
	public void update(Graphics g) {
 
		if (bufImg == null)
			// 创建一个虚拟屏幕(图片)
			bufImg = this.createImage(GAME_WIDTH, GAME_HEIGHT);
		// 得到虚拟屏幕的图像类
		Graphics gBufImg = bufImg.getGraphics();
		// 保存虚拟屏幕的画笔颜色
		Color c = gBufImg.getColor();
		// 重绘背景
		gBufImg.setColor(bgColor);
		gBufImg.fillRect(0, 0, GAME_WIDTH, GAME_HEIGHT);
		// 恢复虚拟屏幕的画笔颜色
		gBufImg.setColor(c);
		// 调用paint方法在虚拟屏幕上绘制图形
		paint(gBufImg);
		// 将虚拟屏幕贴到屏幕
		g.drawImage(bufImg, 0, 0, null);
	}
 
	// 运行线程
 
	private class PaintThread implements Runnable {
 
		public void run() {
			while (true) {
				try {
					Thread.sleep(refreshTime);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				repaint();
			}
		}
 
	}
 
	// 添加键盘监听器类
 
	private class KeyMonitor extends KeyAdapter {
 
		public void keyReleased(KeyEvent e) {
			if (start) {
				for (int i = 0; i < tanks.size(); i++) {
					tanks.get(i).keyReleased(e.getKeyCode());
				}
			}
		}
 
		public void keyPressed(KeyEvent e) {
			if (start) {
				for (int i = 0; i < tanks.size(); i++) {
					tanks.get(i).keyPressed(e.getKeyCode());
				}
 
				if (e.getKeyCode() == KeyEvent.VK_EQUALS) {
					addTank(1);
				}
			}
			if (!start && e.getKeyCode() == KeyEvent.VK_F2) {
				gameInit();
				start = true;
			}
 
		}
	}
	
	private void addTank(int tankNum){
		while(true&&tankNum>0){
			boolean addAble=true;
			Tank t = new Tank(x, y, false, TankClient.this);
			t.setX(rand.nextInt(GAME_WIDTH - t.getSize()));
			t.setY(rand.nextInt(GAME_HEIGHT - t.getSize() - 25) + 25);
			for (int i = 0; i < tanks.size(); i++)
				if (t.getRect().intersects(tanks.get(i).getRect())){
					addAble=false;
					break;
				}
			for (int i = 0; i < walls.size(); i++)
				if (t.getRect().intersects(walls.get(i).getRect())){
					addAble=false;
					break;
				}
			if(addAble){
				tanks.add(t);
				tankNum--;	
			}
		}
	}
 
	/**
	 * 主方法
	 * @param args 命令行参数
	 */
 
	public static void main(String[] args) {
		TankClient tc = new TankClient();
		tc.launchFrame();
		new Thread(tc.new PaintThread()).start();
	}
 
	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 int getRefreshTime() {
		return refreshTime;
	}
 
	public void setRefreshTime(int refreshTime) {
		this.refreshTime = refreshTime;
	}
 
	public Image getBufImg() {
		return bufImg;
	}
 
	public void setBufImg(Image bufImg) {
		this.bufImg = bufImg;
	}
 
	public Color getBgColor() {
		return bgColor;
	}
 
	public void setBgColor(Color bgColor) {
		this.bgColor = bgColor;
	}
 
	public boolean isHasGetdist() {
		return hasGetdist;
	}
 
	public void setHasGetdist(boolean hasGetdist) {
		this.hasGetdist = hasGetdist;
	}
 
	public int getDisX() {
		return disX;
	}
 
	public void setDisX(int disX) {
		this.disX = disX;
	}
 
	public int getDisY() {
		return disY;
	}
 
	public void setDisY(int disY) {
		this.disY = disY;
	}
 
	public List<Explode> getExplodes() {
		return explodes;
	}
 
	public void setExplodes(List<Explode> explodes) {
		this.explodes = explodes;
	}
 
	public List<Tank> getTanks() {
		return tanks;
	}
 
	public void setTanks(List<Tank> tanks) {
		this.tanks = tanks;
	}
 
	public List<Missile> getMissiles() {
		return missiles;
	}
 
	public void setMissiles(List<Missile> missiles) {
		this.missiles = missiles;
	}
 
	public int getEnemyNum() {
		return enemyNum;
	}
 
	public void setEnemyNum(int enemyNum) {
		this.enemyNum = enemyNum;
	}
	public List<Wall> getWalls() {
		return walls;
	}
 
	public void setWalls(List<Wall> walls) {
		this.walls = walls;
	}
 
 
}

刚刚收到邮件,幸运获得了百度之星的纪念T-shirt ,哇哈哈哈~~

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注