tank java_Tank.java

import java.awt.Color;

import java.awt.Graphics;

import java.awt.Rectangle;

import java.awt.event.KeyEvent;

import java.util.Random;

public class Tank {

public static final int XSPEED=5;

public static final int YSPEED=5;

public static final int WIDTH=30;

public static final int HEIGHT=30;

private int x,y;

private int oldX,oldY;

private boolean good;

private int life=100;

private BloodBar bb=new BloodBar();

public int getLife() {

return life;

}

public void setLife(int life) {

this.life = life;

}

public boolean isGood() {

return good;

}

private boolean live=true;

private static Random r=new Random();

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

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

switch(ptdir){

case L:

g.drawLine(x+Tank.WIDTH/2, y+Tank.HEIGHT/2, x, y+Tank.HEIGHT/2);

break;

case LU:

g.drawLine(x+Tank.WIDTH/2, y+Tank.HEIGHT/2, x, y);

break;

case U:

g.drawLine(x+Tank.WIDTH/2, y+Tank.HEIGHT/2, x+Tank.WIDTH/2, y);

break;

case RU:

g.drawLine(x+Tank.WIDTH/2, y+Tank.HEIGHT/2, x+Tank.WIDTH, y);

break;

case R:

g.drawLine(x+Tank.WIDTH/2, y+Tank.HEIGHT/2, x+Tank.WIDTH, y+Tank.HEIGHT/2);

break;

case RD:

g.drawLine(x+Tank.WIDTH/2, y+Tank.HEIGHT/2, x+Tank.WIDTH, y+Tank.HEIGHT);

break;

case D:

g.drawLine(x+Tank.WIDTH/2, y+Tank.HEIGHT/2, x+Tank.WIDTH/2, y+Tank.HEIGHT);

break;

case LD:

g.drawLine(x+Tank.WIDTH/2, y+Tank.HEIGHT/2, x, y+Tank.HEIGHT);

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() {

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

}

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、付费专栏及课程。

余额充值