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

📄 tankclient.java

📁 java小项目,坦克大战,学习的好资料 eclipse下可运行
💻 JAVA
字号:
import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;
import java.util.List;

public class TankClient extends Frame {
	public static final int GAME_WIDTH = 800;
	public static final int GAME_HEIGHT = 600;	//将经常可能改动的地方定义成常量,有利于程序的维护和扩展
	public static final int SLEEPTIME = 20;
	public static final int SUM = 12;
	
	Image offScreenImage = null;		//声明一个虚拟图像,将重画的坦克显示在这里,然后一次向显示在显示器上
	
	Tank myTank = new Tank(50,50,true,Tank.Direction.STOP,this);
	Wall w = new Wall(150,200);
	Blood b = new Blood();
	MyHome mh = new MyHome(0,255,true,this);
	ProtectWall pw1 = new ProtectWall(0,230,60,10,true);
	ProtectWall pw2 = new ProtectWall(60,230,10,80,true);
	ProtectWall pw3 = new ProtectWall(0,300,60,10,true);
	
	List<Tank> enemytanks = new ArrayList<Tank>();
	List<Explode> explodes = new ArrayList<Explode>();
	List<Missile> missiles = new ArrayList<Missile>();
	public static void main(String[] args) {
		new TankClient().launchFrame();
	}
	
	public void paint(Graphics g) {		//paint方法在repaint中会自动被调用	
		g.drawString("子弹数量:" + missiles.size(), 10,50);
		g.drawString("灭敌数量:" + (SUM - enemytanks.size()), 10,70);
		g.drawString("敌方数量:" + enemytanks.size(), 10,90);
		g.drawString("生 命 值:" + myTank.getLife(), 10,110);
		if(!mh.isLife()) g.drawString("GAME OVER!",350, 300);
		if(enemytanks.size() == 0 && myTank.isLive()) g.drawString("YOU WIN!",350, 300);
		if(enemytanks.size() == 0 && myTank.isLive()) g.drawString("Press F1 to get more enemys!",300, 320);
		for(int i=0;i<missiles.size();i++) {
			Missile m = missiles.get(i);
			m.hitTanks(enemytanks);
			m.hitTank(myTank);
			m.hitWall(w);
			m.hithome(mh);
			m.hitProtectWall(pw1);
			m.hitProtectWall(pw2);
			m.hitProtectWall(pw3);
			
			//if(!m.isLive()) missiles.remove(m);
			//else m.draw(g);
			m.draw(g);
		}
		for(int i=0;i<explodes.size();i++) {
			Explode e = explodes.get(i);
			e.draw(g);
		}
		
		for(int i=0;i<enemytanks.size();i++) {
			Tank t = enemytanks.get(i);
			t.collidesWithWall(w);
			t.collidesWithTank(enemytanks);
			t.collidesWithProtectWall(pw1);
			t.collidesWithProtectWall(pw2);
			t.collidesWithProtectWall(pw3);
			t.collidesWithMyHome(mh);
			t.draw(g);
		}
		myTank.draw(g);
		w.draw(g);
		b.draw(g);
		myTank.eat(b);
		mh.draw(g);
		pw1.draw(g);
		pw2.draw(g);
		pw3.draw(g);
	}
	
	 public void Update(Graphics g) {	//repaint方法会首先调用Update方法,然后Update方法会在调用paint方法,所以是在此处声明Update方法,截住调用paint方法。
		 if(offScreenImage == null) {
			 offScreenImage = this.createImage(GAME_WIDTH,GAME_HEIGHT);	//创建虚拟的图片
			 Graphics goffScreen = offScreenImage.getGraphics();	//拿到画笔goffScreen
			 Color c = goffScreen.getColor();	//得到背景色
			 goffScreen.drawRect(0, 0, GAME_WIDTH, GAME_HEIGHT);//重画窗口,相当于刷新
			 goffScreen.setColor(Color.white);//重设窗口背景色。以上三句相当于刷屏,一位每次画一个坦克出来,必须刷掉才能画新的坦克,否则所有的坦克都会显示出来,形成一条线。
			 paint(goffScreen);//调用paint方法,将画笔goffScreen传进去,画出坦克
			 g.drawImage(offScreenImage, 0, 0, null);//画出虚拟的图片
		 }
	 }
	
	public void launchFrame() {
		
		for(int i=0;i<SUM;i++) {
			enemytanks.add(new Tank(50 + 50*(i + 3),30 + 30*(i + 4),false,Tank.Direction.L,this));
		}
		
		this.setLocation(112,84);
		setSize(GAME_WIDTH,GAME_HEIGHT);
		setTitle("坦克大战");
		this.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent arg0) {
				System.exit(0);
			}
		});
		this.setResizable(false);
		this.setBackground(Color.white);
		this.addKeyListener(new KeyMonitor());	//将键盘监听加入frame中来
		this.setVisible(true);
		new Thread(new PaintThread()).start();
	}
	
	private class PaintThread implements Runnable {
		public void run() {
			try {
				while(true) {
					repaint();
					Thread.sleep(SLEEPTIME);
				}
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
	
	private class KeyMonitor extends KeyAdapter {		//实现键盘监听事件。不实现接口而实现继承,因为实现接口要将不需要的方法也的实现
		
		public void keyReleased(KeyEvent e) {
			myTank.keyReleased(e);
		} 
		
		public void keyPressed(KeyEvent e) {
			myTank.keyPressed(e);
		} 
	}
}

⌨️ 快捷键说明

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