坦克大战

package myTankTest_test;

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.JFrame;
import javax.swing.JPanel;





public class MyTankGame_test extends JFrame {
	
	//MyPanel mp = null;

    public static void main(String[] args) {
    	MyTankGame_test mtg = new MyTankGame_test();
     }
	
	public  MyTankGame_test(){
		MyPanel mp = new MyPanel();
		Thread t = new Thread(mp);
		t.start();
		this.add(mp);
		this.addKeyListener(mp);
		this.setSize(400,300);
		this.setVisible(true);
	}
	
	
}




class MyPanel extends JPanel implements KeyListener,Runnable{
	
	Hero hero = null;
	EnemyTank et = null;
	Vector<EnemyTank> ets = new Vector<EnemyTank>();
	int enSize = 4;
	
	public MyPanel(){
	    //初始化我方坦克
		hero = new Hero(100,100);//加上Tank就不对了,这是为什么?
	    //初始化敌人坦克
		  for(int i=0;i<enSize;i++){
			  et = new EnemyTank((i+1)*50,20);
			  et.setDirect(2);
			  ets.add(et);
		  }
	}

	public void paint(Graphics g){
		super.paint(g);
		
	    g.fillRect(0,0,400,300);
	    //画出我的坦克
	    this.drawTank(hero.getX(), hero.getY(), g, hero.getDirect(), 1);
	   
	    for(int i=0;i<hero.ss.size();i++){
			Shot myshot=hero.ss.get(i);
			
			//画出一颗子弹
			if(myshot!=null&&myshot.isLive==true)
			{
				g.draw3DRect(myshot.x,myshot.y,1,1,false);
			}
			if(myshot.isLive==false)
			{
				//从ss中删除该子弹
				hero.ss.remove(myshot);
			}
		}
	    //画出敌方坦克
	    for(int i=0;i<ets.size();i++){
	    	EnemyTank et = ets.get(i);
	    	this.drawTank(et.getX(), et.getY(), g, et.getDirect(), 0);
	    }
	    
    }
	
	
	public void drawTank(int x,int y,Graphics g,int direct,int type){
		//判断什么类型的坦克
				switch(type){
				case 0:
					g.setColor(Color.cyan);
					break;
				case 1:
					g.setColor(Color.yellow);
					break;
				}
				
				//判断方向
				switch(direct)
				{
				//向上
				case 0:
					//画出我的坦克(到时再封装成一个方法)
					//1.画出左边的矩形
					g.fill3DRect(x-10,y-15,5,30,false);
					//2.画出右边的矩形
					g.fill3DRect(x+5,y-15,5,30,false);
					//3.画出中间矩形
					g.fill3DRect(x-5,y-10,10,20,false);
					//4.画出圆形
					g.fillOval(x-5,y-5,10,10);
					//5.画出线
					g.drawLine(x,y,x,y-15);
					break;
					//向右
				case 1:
					//1.画出上边的矩形
					g.fill3DRect(x-15,y-10,30,5,false);
					//2.画出下边的矩形
					g.fill3DRect(x-15,y+5,30,5,false);
					//3.画出中间矩形
					g.fill3DRect(x-10,y-5,20,10,false);
					//4.画出圆形
					g.fillOval(x-5,y-5,10,10);
					//5.画出线
					g.drawLine(x,y,x+15,y);
					break;
					//向下
				case 2:
					//1.画出左边的矩形
					g.fill3DRect(x-10,y-15,5,30,false);
					//2.画出右边的矩形
					g.fill3DRect(x+5,y-15,5,30,false);
					//3.画出中间矩形
					g.fill3DRect(x-5,y-10,10,20,false);
					//4.画出圆形
					g.fillOval(x-5,y-5,10,10);
					//5.画出线
					g.drawLine(x,y,x,y+15);
					break;
					//向左
				case 3:
					//1.画出上边的矩形
					g.fill3DRect(x-15,y-10,30,5,false);
					//2.画出下边的矩形
					g.fill3DRect(x-15,y+5,30,5,false);
					//3.画出中间矩形
					g.fill3DRect(x-10,y-5,20,10,false);
					//4.画出圆形
					g.fillOval(x-5,y-5,10,10);
					//5.画出线
					g.drawLine(x,y,x-15,y);
					break;
				}
	}

	@Override
	public void keyPressed(KeyEvent e) {
		// TODO Auto-generated method stub
		if(e.getKeyCode()== KeyEvent.VK_W){
			this.hero.setDirect(0);
			this.hero.moveUp();
		}
		else if(e.getKeyCode()== KeyEvent.VK_S){
			this.hero.setDirect(2);
			this.hero.moveDown();
		}
		else if(e.getKeyCode()== KeyEvent.VK_A){
			this.hero.setDirect(3);
			this.hero.moveLeft();
		}
		else if(e.getKeyCode()== KeyEvent.VK_D){
			this.hero.setDirect(1);
			this.hero.moveRight();
		}
		if(e.getKeyCode()==KeyEvent.VK_J){
			this.hero.shotEnemy();
		}
		
		this.repaint();
	}
	

	@Override
	public void keyReleased(KeyEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void keyTyped(KeyEvent e) {
		// TODO Auto-generated method stub
		
	}

	
		public void run() {
			// TODO Auto-generated method stub
			//每隔100毫秒重绘子弹
			while(true)
			{
				try {
					Thread.sleep(100);
				} catch (Exception e) {
					// TODO: handle exception
					e.printStackTrace();
					
				}
		   this.repaint();
	}
}


class Tank{
	int direct;
	int x;
	int y;
	int color;
	
	
	public Tank(int x,int y){
		this.x = x;
		this.y = y;
	}
	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 getColor() {
		return color;
	}
	public void setColor(int color) {
		this.color = color;
	}
	public int getDirect() {
		return direct;
	}
	public void setDirect(int direct) {
		this.direct = direct;
	}
		
}

//本方坦克
class Hero extends Tank{

	int speed = 2;
	Shot s = null;
	Vector<Shot> ss = new Vector<Shot>();
	
	public Hero(int x, int y) {
		super(x, y);
	}
	
	//坦克移动
	public void moveUp(){
     	y = y - speed;
	}
	public void moveRight(){
		x = x + speed;
	}
	public void moveDown(){
		y = y + speed;
	}
	public void moveLeft(){
		x = x - speed;
	}
	
	//开火
	public void shotEnemy(){
		switch(this.direct){
			case 0:
				//创建子弹,并加入向量
				s=new Shot(x,y-15,0);
				ss.add(s);
				break;
			case 1:
				s=new Shot(x+15,y,1);
				ss.add(s);
				break;
			case 2:
				s=new Shot(x,y+15,2);
				ss.add(s);
				break;
			case 3:
				s=new Shot(x-15,y,3);
				ss.add(s);
				break;
			}
			//启动子弹线程
			Thread t=new Thread(s);
			t.start();
		}
}

//敌方坦克
class EnemyTank extends Tank{
	
    int speed = 2;
  
	public EnemyTank(int x, int y) {
		super(x, y);
		
	}
	
}

class Shot implements Runnable{
	int x;
	int y;
	int direct;
	boolean isLive;
	int speed = 2;
	public Shot(int x,int y,int direct)
	{
		this.x=x;
		this.y=y;
		this.direct=direct;
	}
	public void run() {
		while(true)
		{
			try {
				Thread.sleep(50);
			} catch (Exception e) {
				// TODO: handle exception
			}
			
			switch(direct)
			{
			case 0:
				y-=speed;
				break;
			case 1:
				x+=speed;
				break;
			case 2:
				y+=speed;
				break;
			case 3:
				x-=speed;
				break;
			}			
			//子弹何时死亡?
			//判断子弹是否碰到边缘
			if(x<0||x>400||y<0||y>300)
			{
				this.isLive=false;
				break;
			}
		}
		
	}
  }
}





你可能感兴趣的:(坦克大战)