tank java_Tank.java

import java.awt.Color;

import java.awt.Graphics;

import java.awt.Image;

import java.awt.Rectangle;

import java.awt.Toolkit;

import java.awt.event.KeyEvent;

import java.util.HashMap;

import java.util.Map;

import java.util.Random;

public class Tank {

public static final int XSPEED=5;

public static final int YSPEED=5;

public static final int WIDTH=50;

public static final int HEIGHT=50;

private int x,y;

private int oldX,oldY;

private boolean good;

private int life=100;

private BloodBar bb=new BloodBar();

private boolean live=true;

private static Random r=new Random();

private int step=r.nextInt(12)+3;

private static Toolkit tk=Toolkit.getDefaultToolkit();

private static Map imgs=new HashMap();

private static Map dimgs=new HashMap();

private static Image[] tankimages=null;

private static Image[] dtankimages=null;

//以下为静态语句块,优先读入内存

static {

tankimages=new Image[]{

tk.getImage(Tank.class.getClassLoader().getResource("images/tank1.png")),

tk.getImage(Tank.class.getClassLoader().getResource("images/tank2.png")),

tk.getImage(Tank.class.getClassLoader().getResource("images/tank3.png")),

tk.getImage(Tank.class.getClassLoader().getResource("images/tank4.png")),

tk.getImage(Tank.class.getClassLoader().getResource("images/tank5.png")),

tk.getImage(Tank.class.getClassLoader().getResource("images/tank6.png")),

tk.getImage(Tank.class.getClassLoader().getResource("images/tank7.png")),

tk.getImage(Tank.class.getClassLoader().getResource("images/tank8.png"))

};

imgs.put("LU", tankimages[0]);

imgs.put("U", tankimages[1]);

imgs.put("RU", tankimages[2]);

imgs.put("R", tankimages[3]);

imgs.put("RD", tankimages[4]);

imgs.put("D", tankimages[5]);

imgs.put("LD", tankimages[6]);

imgs.put("L", tankimages[7]);

dtankimages=new Image[]{

tk.getImage(Tank.class.getClassLoader().getResource("images/dt1.png")),

tk.getImage(Tank.class.getClassLoader().getResource("images/dt2.png")),

tk.getImage(Tank.class.getClassLoader().getResource("images/dt3.png")),

tk.getImage(Tank.class.getClassLoader().getResource("images/dt4.png")),

tk.getImage(Tank.class.getClassLoader().getResource("images/dt5.png")),

tk.getImage(Tank.class.getClassLoader().getResource("images/dt6.png")),

tk.getImage(Tank.class.getClassLoader().getResource("images/dt7.png")),

tk.getImage(Tank.class.getClassLoader().getResource("images/dt8.png"))

};

dimgs.put("LU", dtankimages[0]);

dimgs.put("U", dtankimages[1]);

dimgs.put("RU", dtankimages[2]);

dimgs.put("R", dtankimages[3]);

dimgs.put("RD", dtankimages[4]);

dimgs.put("D", dtankimages[5]);

dimgs.put("LD", dtankimages[6]);

dimgs.put("L", dtankimages[7]);

}

//public static final int WIDTH=tankimages[0].getWidth(null);

//public static final int HEIGHT=tankimages[0].getHeight(null);

public int getLife() {

return life;

}

public void setLife(int life) {

this.life = life;

}

public boolean isGood() {

return good;

}

public boolean isLive() {

return live;

}

public void setLive(boolean live) {

this.live = live;

}

TankClient tc;//持有对方的引用

private boolean bL=false,bU=false,bR=false,bD=false;

enum Direction{L,LU,U,RU,R,RD,D,LD,STOP};

private Direction dir=Direction.STOP;

private Direction ptdir=Direction.D;

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.dir=dir;

this.tc=tc;

}

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.gray);

//g.fillOval(x, y, WIDTH, HEIGHT);

//g.setColor(c);

if(good)bb.draw(g);

if(good){

switch(ptdir){

case L:

g.drawImage(imgs.get("L"),x,y,null);

break;

case LU:

g.drawImage(imgs.get("LU"),x,y,null);

break;

case U:

g.drawImage(imgs.get("U"),x,y,null);

break;

case RU:

g.drawImage(imgs.get("RU"),x,y,null);

break;

case R:

g.drawImage(imgs.get("R"),x,y,null);

break;

case RD:

g.drawImage(imgs.get("RD"),x,y,null);

break;

case D:

g.drawImage(imgs.get("D"),x,y,null);

break;

case LD:

g.drawImage(imgs.get("LD"),x,y,null);

break;

}

}else{

switch(ptdir){

case L:

g.drawImage(dimgs.get("L"),x,y,null);

break;

case LU:

g.drawImage(dimgs.get("LU"),x,y,null);

break;

case U:

g.drawImage(dimgs.get("U"),x,y,null);

break;

case RU:

g.drawImage(dimgs.get("RU"),x,y,null);

break;

case R:

g.drawImage(dimgs.get("R"),x,y,null);

break;

case RD:

g.drawImage(dimgs.get("RD"),x,y,null);

break;

case D:

g.drawImage(dimgs.get("D"),x,y,null);

break;

case LD:

g.drawImage(dimgs.get("LD"),x,y,null);

break;

}

}

move();

}

void move(){

this.oldX=x;

this.oldY=y;

switch(dir){

case L:

x-=XSPEED;

break;

case LU:

x-=XSPEED;

y-=YSPEED;

break;

case U:

y-=YSPEED;

break;

case RU:

x+=XSPEED;

y-=YSPEED;

break;

case R:

x+=XSPEED;

break;

case RD:

x+=XSPEED;

y+=YSPEED;

break;

case D:

y+=XSPEED;

break;

case LD:

x-=XSPEED;

y+=YSPEED;

break;

case STOP:

break;

}

if(this.dir!=Direction.STOP){

this.ptdir=dir;

}

if(x<0) x=0;

if(y<30) y=30;

if(x>TankClient.GAME_WIDTH-Tank.WIDTH)x=TankClient.GAME_WIDTH-Tank.WIDTH;

if(y>TankClient.GAME_HEIGHT-Tank.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();

}

}

private void stay(){

x=oldX;

y=oldY;

}

public void keyPressed(KeyEvent e) {

int key=e.getKeyCode();

switch(key){

//case KeyEvent.VK_CONTROL:

//fire();

//break;

case KeyEvent.VK_F2:

if(!this.live){

this.live=true;

this.life=100;

}

break;

case KeyEvent.VK_LEFT:

bL=true;

break;

case KeyEvent.VK_RIGHT:

bR=true;

break;

case KeyEvent.VK_UP:

bU=true;

break;

case KeyEvent.VK_DOWN:

bD=true;

break;

}

locateDirecton();

}

void locateDirecton(){

if(bL&&!bU&&!bR&&!bD) dir=Direction.L;

else if(bL&&bU&&!bR&&!bD) dir=Direction.LU;

else if(!bL&&bU&&!bR&&!bD) dir=Direction.U;

else if(!bL&&bU&&bR&&!bD) dir=Direction.RU;

else if(!bL&&!bU&&bR&&!bD) dir=Direction.R;

else if(!bL&&!bU&&bR&&bD) dir=Direction.RD;

else if(!bL&&!bU&&!bR&&bD) dir=Direction.D;

else if(bL&&!bU&&!bR&&bD) dir=Direction.LD;

else if(!bL&&!bU&&!bR&&!bD) dir=Direction.STOP;

}

public void keyReleased(KeyEvent e) {

int key=e.getKeyCode();

switch(key){

case KeyEvent.VK_CONTROL:

fire();

break;

case KeyEvent.VK_A:

superFire();

break;

case KeyEvent.VK_LEFT:

bL=false;

break;

case KeyEvent.VK_RIGHT:

bR=false;

break;

case KeyEvent.VK_UP:

bU=false;

break;

case KeyEvent.VK_DOWN:

bD=false;

break;

}

locateDirecton();

}

public Missile fire(){

if(!live)return null;

int x=this.x+Tank.WIDTH/2-Missile.WIDTH/2;

int y=this.y+Tank.HEIGHT/2-Missile.HEIGHT/2;

//Missile m=new Missile(x,y,ptdir);//消除子弹方法1

//消除子弹方法2

Missile m=new Missile(x,y,good,ptdir,tc);

tc.missiles.add(m);

return m;

}

public Missile fire(Direction dir){

if(!live)return null;

int x=this.x+Tank.WIDTH/2-Missile.WIDTH/2;

int y=this.y+Tank.HEIGHT/2-Missile.HEIGHT/2;

Missile m=new Missile(x,y,good,dir,tc);

tc.missiles.add(m);

return m;

}

public Rectangle getRect() {

//System.out.println(tankimages[0].getWidth(null)); 读取照片宽度

return new Rectangle(x,y,WIDTH,HEIGHT);

}

/**

* 撞墙

* @param w 被撞的墙

* @return 撞上墙后返回true 否则false

*/

public boolean cllidesWithWall(Wall w){

if(this.live &&this.getRect().intersects(w.getRect())){

this.stay();

return true;

}

return false;

}

public boolean cllidesWithTanks(java.util.List tanks){

for(int i=0;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;

}

public void superFire(){

Direction[] dirs=Direction.values();

for(int i=0;i

fire(dirs[i]);

}

}

public class BloodBar{

public void draw(Graphics g){

Color c=g.getColor();

g.setColor(Color.black);

g.drawRect(x, y-10, WIDTH,10);

int w=WIDTH*life/100;

if(life==100){

g.setColor(Color.orange);

g.fillRect(x, y-10, w,10);

}else if(life==80){

g.setColor(Color.blue);

g.fillRect(x, y-10, w,10);

}else if(life==60){

g.setColor(Color.cyan);

g.fillRect(x, y-10, w,10);

}else if(life==40){

g.setColor(Color.gray);

g.fillRect(x, y-10, w,10);

}else if(life==20){

g.setColor(Color.red);

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=100;

b.setLive(false);

return true;

}

return false;

}

}

一键复制

编辑

Web IDE

原始数据

按行查看

历史

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值