package tankwar2_6;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.Random;
/***
* 坦克类
*
* @author xuss
*
*/
public class Tank {
/*
* Tank的 x 坐标
*/
private int x;
/*
* Tank的 y 坐标
*/
private int y;
/*
* 坦克的大小,宽度
*/
private static int sizeX = 30;
/*
* 高度
*/
private static int sizeY = 30;
/*
* Tank 存在标记
*/
private boolean live = true;
/*
* 记录上一步的xy坐标
*/
private int oldX;
private int oldY;
/*
* 生命值:血
*/
private int life = 100;
private BloodBar bloodbar = new BloodBar();
public int getLife() {
return life;
}
public void setLife(int life) {
this.life = life;
}
/**
* Tank是否活着
* */
public boolean isLive() {
return live;
}
/**
* 主要用来设置使坦克死去
* */
public void setLive(boolean live) {
this.live = live;
}
/**
* Tank 在 X 轴的 速度
*/
public static int paceX = 10;
/**
* Tank 在 Y 轴的 速度
*/
public static int paceY = 10;
/*
* 左方向标志
*/
private boolean bL = false;
/*
* 上方向标志
*/
private boolean bU = false;
/*
* 右方向标志
*/
private boolean bR = false;
/*
* 下方向标志
*/
private boolean bD = false;
/*
* 持有TankClient 对象
*/
private TankClient tc = null;
/*
* 我方炮杆颜色
*/
private static Color MY_GUNCOLOR = Color.cyan;
/*
* 敌方炮杆颜色
*/
private static Color ENREMY_GUNCOLOR = Color.cyan;
/*
* 随机数产生器
*/
private final static Random r = new Random();
/**
* 8个枚举类型的方向常量,和 STOP
*/
public enum Direction {
L, LU, U, RU, R, RD, D, LD, STOP
};
/*
* Tank 的前进方向
*/
private Direction dir = Direction.STOP;
/*
* Tank 的炮筒方向
*/
private Direction ptDir = Direction.L;
/*
* 敌我之过分
*/
public boolean good;
public boolean isGood() {
return good;
}
/*
* 我方颜色
*/
private static Color MY_TANKCOLOR = Color.RED;
/*
* 敌方颜色
*/
private static Color ENEMY_TANKCOLOR = Color.black;
/*
*
* 用于控制记录坦克移动的步骤
*/
private int step;
/**
*
* @param x
* 坐标
* @param y
* 坐标
*/
public Tank(int x, int y, boolean good) {
this.x = x;
this.y = y;
this.oldX = x;
this.oldY = y;
this.good = good;
if (!this.good) {
this.dir = Direction.D;
this.step = r.nextInt(12) + 3;
}
}
/**
*
* @param x
* 坐标
* @param y
* 坐标
* @param tc
* TankClient
*/
public Tank(int x, int y, boolean good, TankClient tc) {
this(x, y, good);
this.tc = tc;
}
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;
}
/**
* draw()方法
* */
public void draw(Graphics g) {
if (!this.isLive()) {
if (!this.good) {
this.tc.enemyTanks.remove(this);
}
return;
}
Color c = g.getColor();
// 设置车身颜色
if (good) {
g.setColor(Tank.MY_TANKCOLOR);
} else {
g.setColor(Tank.ENEMY_TANKCOLOR);
}
g.fillOval(x, y, sizeX, sizeY);
g.setColor(c);
c = g.getColor();
// 设置炮杆颜色
if (good) {
g.setColor(Tank.MY_GUNCOLOR);
} else {
g.setColor(Tank.ENREMY_GUNCOLOR);
}
switch (ptDir) {
case L:
g.drawLine(x + Tank.sizeX / 2, y + Tank.sizeY / 2, x, y
+ Tank.sizeY / 2);
break;
case LU:
g.drawLine(x + Tank.sizeX / 2, y + Tank.sizeY / 2, x, y);
break;
case U:
g.drawLine(x + Tank.sizeX / 2, y + Tank.sizeY / 2, x + Tank.sizeX
/ 2, y);
break;
case RU:
g.drawLine(x + Tank.sizeX / 2, y + Tank.sizeY / 2, x + Tank.sizeX,
y);
break;
case R:
g.drawLine(x + Tank.sizeX / 2, y + Tank.sizeY / 2, x + Tank.sizeX,
y + Tank.sizeY / 2);
break;
case RD:
g.drawLine(x + Tank.sizeX / 2, y + Tank.sizeY / 2, x + Tank.sizeX,
y + Tank.sizeY);
break;
case D:
g.drawLine(x + Tank.sizeX / 2, y + Tank.sizeY / 2, x + Tank.sizeX
/ 2, y + Tank.sizeY);
break;
case LD:
g.drawLine(x + Tank.sizeX / 2, y + Tank.sizeY / 2, x, y
+ Tank.sizeY);
break;
}
g.setColor(c);
if (this.isGood()) {
bloodbar.drow(g);
}
move(); // move()
}
/**
* 取得Tank的sizeX
*
* @return Tank的sizeX
*/
public static int getSizeX() {
return sizeX;
}
/**
* 设置Tank的sizeX
*
* @param sizeX
*/
public static void setSizeX(int sizeX) {
Tank.sizeX = sizeX;
}
/**
* 取得Tank的sizeY
*
* @return int
*/
public static int getSizeY() {
return sizeY;
}
/**
* 设置Tank的sizeY
*
* @param sizeY
*/
public static void setSizeY(int sizeY) {
Tank.sizeY = sizeY;
}
/*
* 根据 Tank的方向以及其移动的速度计算其下一位置
*/
private void move() {
this.oldX = this.x;
this.oldY = this.y;
switch (dir) {
case L:
x -= paceX; // 左
break;
case LU:
x -= paceX;
y -= paceY;// 左上
break;
case U:
y -= paceY;// 上
break;
case RU:
x += paceX;
y -= paceY;// 右上
break;
case R:
x += paceX;// 右
break;
case RD:
x += paceX;
y += paceY;// 右下
break;
case D:
y += paceY;// 下
break;
case LD:
x -= paceX;
y += paceY;// 左下
break;
case STOP:
break;
}
// 变换炮筒方向
if (this.dir != Direction.STOP) {
this.ptDir = this.dir;
}
/*
* 解决出界
*/
if (x < 0) {
x = 0;
}
if (y < 25) {
y = 25;
}
if (x > TankClient.gameX - Tank.sizeX) {
x = TankClient.gameX - Tank.sizeX;
}
if (y > TankClient.gameY - Tank.sizeY) {
y = TankClient.gameY - Tank.sizeY;
}
// //////////////////////////////
if (!this.good) {
if (this.step == 0) {
step = r.nextInt(12) + 3;
// 枚举类型不能直接访问,先要转化为数组
Direction[] dirs = Direction.values();
int rn = r.nextInt(dirs.length);
this.dir = dirs[rn];
}
this.step--;
if (r.nextInt(40) > 38) {
this.fire();
}
}
}
/***
* 响应键盘keyPressed事件
*
* @param KeyEvent
* keyevent
*/
public void keyPressed(KeyEvent k) {
int key = k.getKeyCode();
// System.out.println(key);
switch (key) {
case KeyEvent.VK_F2:// ==37
if(!this.live){this.live=true;this.setLife(100);}
break;
case KeyEvent.VK_LEFT:// ==37
bL = true;
break;
case KeyEvent.VK_UP:// =38
bU = true;
break;
case KeyEvent.VK_RIGHT:// =39
bR = true;
break;
case KeyEvent.VK_DOWN:// =40
bD = true;
break;
}
locateDirection(); // locateDirection();
}
/***
* 响应键盘keyReleased事件
*
* @param KeyEvent
* keyevent
*/
public void keyReleased(KeyEvent k) {
int key = k.getKeyCode();
switch (key) {
case KeyEvent.VK_CONTROL:
fire();
// TODO
break;
case KeyEvent.VK_LEFT:// ==37
bL = false;
break;
case KeyEvent.VK_UP:// =38
bU = false;
break;
case KeyEvent.VK_RIGHT:// =39
bR = false;
break;
case KeyEvent.VK_DOWN:// =40
bD = false;
break;
case KeyEvent.VK_A:// =40
this.superFire();
break;
}
locateDirection();
}
/*
* 将4个方向键转化为8个方向键
*/
private 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
java写的单机版坦克大战@version2.6
需积分: 10 140 浏览量
2009-05-03
11:00:46
上传
评论
收藏 21KB RAR 举报
xuss1987
- 粉丝: 0
- 资源: 15
最新资源
- 基于Vue+Echarts实现风力发电机中传感器的数据展示监控可视化系统+源代码+文档说明(高分课程设计)
- 基于单片机的风力发电机转速控制源码
- 基于C++实现的风力发电气动平衡监测系统+源代码+测量数据(高分课程设计)
- 毕业设计- 基于STM32F103C8T6 单片机,物联网技术的太阳能发电装置+源代码+文档说明+架构图+界面截图
- 基于 LSTM(长短期记忆)(即改进的循环神经网络)预测风力发电厂中风力涡轮机产生的功率+源代码+文档说明
- 基于stm32f103+空心杯电机+oled按键+运动算法
- 《CKA/CKAD应试指南/从docker到kubernetes 完全攻略》学习笔记 第1章docker基础(1.1-1.4)
- 基于python实现的水下压缩空气储能互补系统建模仿真与经济效益分析+源代码+论文
- 华中科技大学-自然语言处理实验,Bi-LSTM+CRF的中文分词框架,并且利用基于深度学习的方法进行中文命名实体识别++源码报告
- 基于动态罚函数的铁路车流分配与径路优化模型python源码
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈