import java.awt.*;
import java.awt.event.*;
import java.util.*;
public class Tank {
public static final int XSPEED = 3;
public static final int YSPEED = 3;
public static final int WIDTH = 30;
public static final int HEIGHT = 30;
private int x,y;
private int oldX,oldY;
private int life = 100;
BloodBar bb = new BloodBar();
private boolean bL = false,bU = false,bR = false,bD = false;
private boolean live = true;
private boolean good;
private int step = r.nextInt(15) + 3; //小于15随机数,为不使step为0,所以在后面加了3
TankClient tc;
private static Random r = new Random();
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.good = good;
}
public Tank(int x, int y, boolean good, Direction dir,TankClient tc) {
this(x,y,good);
this.tc = tc;
this.dir = dir;
}
public void draw(Graphics g) {
if(!tc.mh.isLife()) {
tc.myTank.setLive(false);
tc.myTank.setLife(0);
}
if(!live) {
if(!good) {
tc.enemytanks.remove(this);
} return;
}
Color c = g.getColor();
if(good)
g.setColor(Color.red);
else g.setColor(Color.DARK_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();
}
public void stay() {
x = this.oldX;
y = this.oldY;
}
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 += YSPEED;
break;
case LD:
x -= XSPEED;
y += YSPEED;
break;
case STOP:
break;
}
if(this.dir != Direction.STOP) {
this.ptdir = this.dir;
}
if(x < 5) x = 5;
if(y < 25) y = 25;
if(x + Tank.WIDTH >= TankClient.GAME_WIDTH) x = TankClient.GAME_WIDTH - Tank.WIDTH;
if(y + Tank.HEIGHT >= TankClient.GAME_HEIGHT) y = TankClient.GAME_HEIGHT - Tank.HEIGHT;
if(!good) {
Direction[] dirs = Direction.values(); //将值转换为数组
if(step == 0) {
step = r.nextInt(15) + 3;
int rn = r.nextInt(dirs.length);
dir = dirs[rn]; //给方向赋随机值
}
step --; //为防止step减为0,加入了上面的if
if(r.nextInt(40) > 36) {
this.fire();
}
}
}
public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();
switch(key) {
case KeyEvent.VK_LEFT :
bL = true;
break;
case KeyEvent.VK_UP :
bU = true;
break;
case KeyEvent.VK_RIGHT :
bR = true;
break;
case KeyEvent.VK_DOWN :
bD = true;
break;
}
locateDirection();
}
void locateDirection() {
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_F1:
if(tc.enemytanks.size() == 0) {
for(int i=0;i<9;i++) {
tc.enemytanks.add(new Tank(50 + 50*(i + 3),30 + 30*(i + 4),false,Tank.Direction.L,tc));
}
}
break;
case KeyEvent.VK_F2:
if(!this.live)
this.live = true;
this.life = 100;
break;
case KeyEvent.VK_S:
superFire();
break;
case KeyEvent.VK_CONTROL:
fire();
break;
case KeyEvent.VK_LEFT :
bL = false;
break;
case KeyEvent.VK_UP :
bU = false;
break;
case KeyEvent.VK_RIGHT :
bR = false;
break;
case KeyEvent.VK_DOWN :
bD = false;
break;
}
locateDirection();
}
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,good,ptdir,this.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,this.tc);
tc.missiles.add(m);
return m;
}
public void superFire() {
Direction[] dirs = Direction.values();
for(int i=0;i<8;i++) {
fire(dirs[i]);
}
}
public Rectangle getRect() {
return new Rectangle(x,y,WIDTH,HEIGHT);
}
public boolean isLive() {
return live;
}
public void setLive(boolean live) {
this.live = live;
}
public boolean isGood() {
return good;
}
public void collidesWithWall(Wall w) {
if(this.getRect().intersects(w.getRect())) {
this.stay();
}
}
public void collidesWithTank(java.util.List<Tank> tanks) {
for(int i=0;i<tanks.size();i++) {
Tank t = tanks.get(i);
if(this != t) {
if(this.live && t.isLive() && this.getRect().intersects(t.getRect())) {
this.stay();
}
}
}
}
public void collidesWithProtectWall(ProtectWall pw) {
if(this.getRect().intersects(pw.getRect())) {
this.stay();
}
}
public void collidesWithMyHome(MyHome mh) {
if(this.getRect().intersects(mh.getRect())) {
this.stay();
}
}
public int getLife() {
return life;
}
public void setLife(int life) {
this.life = life;
}
private class BloodBar {
public void draw(Graphics g) {
Color c = g.getColor();
g.setColor(Color.red);
g.drawRect(x, y - 15, WIDTH, 10);
int w = WIDTH * life/100;
g.fillRect(x, y - 15, 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;
}
public void setGood(boolean good) {
this.good = good;
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
资源详情
资源评论
资源推荐
收起资源包目录
TankWar.rar (95个子文件)
TankWar2.8
.project 386B
bin
Tank$Direction.class 1KB
TankClient$KeyMonitor.class 826B
Missile.class 4KB
TankClient.class 5KB
TankClient$PaintThread.class 866B
ProtectWall.class 1KB
TankClient$1.class 643B
Tank$BloodBar.class 1000B
Wall.class 947B
Blood.class 1KB
MyHome.class 1KB
Explode.class 1KB
Tank.class 8KB
src
Missile.java 3KB
Blood.java 741B
Explode.java 554B
TankClient.java 4KB
Tank.java 7KB
Wall.java 450B
MyHome.java 756B
ProtectWall.java 665B
.classpath 232B
TankWar2.6
.project 386B
bin
Tank$Direction.class 1KB
TankClient$KeyMonitor.class 826B
Missile.class 4KB
TankClient.class 4KB
TankClient$PaintThread.class 866B
TankClient$1.class 643B
Tank$BloodBar.class 1000B
Wall.class 941B
Blood.class 2KB
Explode.class 1KB
Tank.class 7KB
src
Missile.java 2KB
Blood.java 772B
Explode.java 554B
TankClient.java 4KB
Tank.java 7KB
Wall.java 440B
.classpath 232B
TankWar1.0
.project 386B
bin
Tank$Direction.class 1KB
TankClient$KeyMonitor.class 826B
Missile.class 2KB
TankClient.class 2KB
TankClient$PaintThread.class 866B
TankClient$1.class 643B
Tank.class 3KB
src
Missile.java 883B
TankClient.java 2KB
Tank.java 2KB
.classpath 232B
TankWar1.8
.project 386B
bin
Tank$Direction.class 1KB
TankClient$KeyMonitor.class 826B
Missile.class 3KB
TankClient.class 4KB
TankClient$PaintThread.class 866B
TankClient$1.class 643B
Explode.class 1KB
Tank.class 5KB
src
Missile.java 2KB
Explode.java 554B
TankClient.java 3KB
Tank.java 4KB
.classpath 232B
TankWar0.6
.project 386B
bin
TankClient$KeyMonitor.class 928B
TankClient.class 2KB
TankClient$PaintThread.class 866B
TankClient$1.class 643B
src
TankClient.java 3KB
.classpath 232B
TankWar0.1
.project 386B
bin
TankClient.class 815B
TankClient$1.class 643B
src
TankClient.java 484B
.classpath 232B
TankWar1.9.1
.project 388B
bin
TankClient$KeyMonitor.class 826B
Missile.class 3KB
TankClient.class 3KB
TankClient$PaintThread.class 866B
TankClient$1.class 643B
Explode.class 1KB
Dir.class 1KB
Tank.class 5KB
src
Dir.java 51B
Missile.java 2KB
Explode.java 554B
TankClient.java 3KB
Tank.java 5KB
.classpath 232B
共 95 条
- 1
hjc00
- 粉丝: 7
- 资源: 63
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- torch-1.8.1+cu111-cp38-cp38-linux-x86-64.whl +torchvision
- 计算机设计 - VB+ACCESS网络计时管理系统设计(源代码+系统),保证可靠运行,毕业生可参考,免费资源下载
- 计算机设计 - vb+ACCESS身份证管理系统设计(LW+源代码),保证可靠运行,毕业生可参考,免费资源下载
- ARCMAP自动编号工具
- W801学习笔记十三:掌机系统-系统基础组件-PNG-loader
- studydatastruct3
- XHS链接提取/作品采集工具
- general-exporter windows
- kotlin语法快速入门文档
- general-exporter linux
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论2