📄 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.awt.event.MouseEvent;
import java.util.ArrayList;
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 = 30;
public static final int HEIGHT = 30;
private int tankId;
public int totalBlood = 100;
public int blood = 100;
private boolean ready=false;
TankClient tc;
private String user;
private int controlMissileSpeed = 5;
private boolean auto = false;
public int x, y;
private int oldX, oldY;
public boolean bL = false, bU = false, bR = false, bD = false;
Direction dir = Direction.STOP;
private Direction ptDir = Direction.D;
public boolean good;
public boolean isAirplane;
private boolean live = true;
private String level="--坦克新兵--";
private static Random r = new Random();
private int step = r.nextInt(12) + 3;
private int missileId = 1; // 记录missile的ID
private String color;
String tankColor = "blue";
String badTankColor = "white";
String playerTankColor = "red";
String airplane = "airplane";
private static Map<String, Image> tankImgs = new HashMap<String, Image>();
private static Map<String, Image> badTankImgs = new HashMap<String, Image>();
private static Map<String, Image> playerTankImgs = new HashMap<String, Image>();
private static Map<String, Image> badAirplaneImgs = new HashMap<String, Image>();
private static Toolkit tk = Toolkit.getDefaultToolkit();
{
tankImgs = setTankColor(tankColor);
badTankImgs = setTankColor(badTankColor);
badAirplaneImgs = setTankColor(airplane);
playerTankImgs = setTankColor(playerTankColor);
}
public Map<String, Image> setTankColor(String tankColor) {
Map<String, Image> temp = new HashMap<String, Image>();
Image[] tankimgs = new Image[] {
tk.getImage(Tank.class.getClassLoader().getResource(
"images/" + tankColor + "TankL.png")),
tk.getImage(Tank.class.getClassLoader().getResource(
"images/" + tankColor + "TankLU.png")),
tk.getImage(Tank.class.getClassLoader().getResource(
"images/" + tankColor + "TankR.png")),
tk.getImage(Tank.class.getClassLoader().getResource(
"images/" + tankColor + "TankRU.png")),
tk.getImage(Tank.class.getClassLoader().getResource(
"images/" + tankColor + "TankU.png")),
tk.getImage(Tank.class.getClassLoader().getResource(
"images/" + tankColor + "TankLD.png")),
tk.getImage(Tank.class.getClassLoader().getResource(
"images/" + tankColor + "TankD.png")),
tk.getImage(Tank.class.getClassLoader().getResource(
"images/" + tankColor + "TankRD.png")) };
temp.put("L", tankimgs[0]);
temp.put("LU", tankimgs[1]);
temp.put("R", tankimgs[2]);
temp.put("RU", tankimgs[3]);
temp.put("U", tankimgs[4]);
temp.put("LD", tankimgs[5]);
temp.put("D", tankimgs[6]);
temp.put("RD", tankimgs[7]);
return temp;
}
public Tank(int x, int y, boolean good) {
this.x = x;
this.y = y;
this.good = good;
}
public Tank(int x, int y, int tankId, boolean good, boolean auto,
Direction dir, TankClient tc) {
this(x, y, good);
this.auto = auto;
this.dir = dir;
this.tc = tc;
this.tankId = tankId;
}
public void drawTank(Graphics g) {
if (controlMissileSpeed > 0) {
controlMissileSpeed--;
}
if (good && auto == false) {
color = tankColor;
} else if (!good && auto == false) {
color = playerTankColor;
} else if (!good && auto == true) {
if (isAirplane) {
color = airplane;
} else {
color = badTankColor;
}
}
/* if (!live) {
tc.badTanks.remove(this);
tc.playerTanks.remove(this);
return;
}*/
//显示玩家昵称
if (!this.auto) {
for(int i=0; i<tc.playerTanks.size(); i++){
Tank pt = tc.playerTanks.get(i);
if(pt.tankId==this.tankId){
g.drawString(pt.getUser(), x, y - 20);
}
}
if(this.tankId==tc.tank.getTankId())
g.drawString(tc.tank.getUser(), x, y - 20);
}
g.setColor(Color.YELLOW);
g.drawRect(x, y - 10, totalBlood, 4);
g.fillRect(x + 1, y - 8, blood, 2);
if (good && !auto) {
dirDraw(g, tankImgs);
} else if (!good && !auto) {
dirDraw(g, playerTankImgs);
} else if (!good && auto) {
if (!isAirplane) {
dirDraw(g, badTankImgs);
} else {
dirDraw(g, badAirplaneImgs);
}
}
move();
}
// 跟据坦克的类型画出坦克
public void dirDraw(Graphics g, Map<String, Image> imgs) {
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;
}
}
void move() {
try {
if (tc.playerTanks.size() > 0) {
for (int i = 0; i < tc.badTanks.size(); i++) {
Tank tank = tc.badTanks.get(i);
tank.setLive(false);
}
}
} catch (Exception e) {
e.printStackTrace();
}
/*
* if(tc.badTanks.size()>0){ Msg autoTankMsg = new
* AutoTankNewMsg(this,tc,tc.badTanks.size());
* tc.client.send(autoTankMsg); }
*/
oldX = x;
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 (!good && auto) {
if (step == 0) {
dir = getRandomDirection();
step = r.nextInt(12) + 3;
}
step--;
if (r.nextInt(20) > 18) {
this.fire();
}
}
if (x < 0)
x = 0;
if (y < 30)
y = 30;
if (x + Tank.WIDTH > TankClient.DEFAULT_WIDTH)
x = TankClient.DEFAULT_WIDTH - Tank.WIDTH;
if (y + Tank.HEIGHT > TankClient.DEFAULT_HEIGHT)
y = TankClient.DEFAULT_HEIGHT - Tank.HEIGHT;
}
public Direction getRandomDirection() {
Direction[] dirs = Direction.values();
int rn = r.nextInt(dirs.length);
dir = dirs[rn];
return dir;
}
public void pressEvent(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() {
Direction olddir = dir;
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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -