一、防止敌人坦克重叠运动
1.创建成员来获取敌人坦克
//增加成员,EnemyTank可以得到敌人坦克的Vector
Vector<Enemy> enemyTanks = new Vector<>();
2.创建方法来判断是否重叠
//编写方法,判断当前的这个坦克是否和enemyTanks中的其他坦克发生的重叠或者碰撞
public boolean isTouchEnemyTank() {
switch (getDirect()) {
case 0://上
for (int i = 0; i < enemyTanks.size(); i++) {
//取出坦克
Enemy enemy = enemyTanks.get(i);
//不和自己比较
if (enemy != this) {
//如果敌人坦克是上下方向
if (enemy.getDirect() == 0 || enemy.getDirect() == 2) {
//当前坦克左上角坐标
if (this.getX() >= enemy.getX()
&& this.getX() <= enemy.getX() + 40
&& this.getY() >= enemy.getY()
&& this.getY() <= enemy.getY() + 60) {
return true;
}
//当前坦克右上角坐标
if (this.getX()+ 40 >= enemy.getX()
&& this.getX() + 40 <= enemy.getX() + 40
&& this.getY() >= enemy.getY()
&& this.getY() <= enemy.getY() + 60) {
return true;
}
}
//如果敌人方向是左右
if (enemy.getDirect() == 1 || enemy.getDirect() == 3) {
if (this.getX() >= enemy.getX()
&& this.getX() <= enemy.getX() + 60
&& this.getY() >= enemy.getY()
&& this.getY() <= enemy.getY() + 40) {
return true;
}
if (this.getX()+ 40 >= enemy.getX()
&& this.getX() + 40 <= enemy.getX() + 60
&& this.getY() >= enemy.getY()
&& this.getY() <= enemy.getY() + 40) {
return true;
}
}
}
}
break;
case 1://右
for (int i = 0; i < enemyTanks.size(); i++) {
//取出坦克
Enemy enemy = enemyTanks.get(i);
//不和自己比较
if (enemy != this) {
//如果敌人坦克是上下方向
if (enemy.getDirect() == 0 || enemy.getDirect() == 2) {
//当前坦克右上角坐标
if (this.getX() +60>= enemy.getX()
&& this.getX() +60<= enemy.getX() + 40
&& this.getY() >= enemy.getY()
&& this.getY() <= enemy.getY() + 60) {
return true;
}
//当前坦克右下角坐标
if (this.getX() + 60>= enemy.getX()
&& this.getX() + 60 <= enemy.getX() + 40
&& this.getY() +40 >= enemy.getY()
&& this.getY() +40<= enemy.getY() + 60) {
return true;
}
}
//如果敌人方向是左右
if (enemy.getDirect() == 1 || enemy.getDirect() == 3) {
if (this.getX() +60>= enemy.getX()
&& this.getX() +60<= enemy.getX() + 60
&& this.getY() >= enemy.getY()
&& this.getY() <= enemy.getY() + 40) {
return true;
}
if (this.getX() + 60>= enemy.getX()
&& this.getX() + 60 <= enemy.getX() + 60
&& this.getY() +40 >= enemy.getY()
&& this.getY() +40<= enemy.getY() + 40) {
return true;
}
}
}
}
break;
case 2://下
for (int i = 0; i < enemyTanks.size(); i++) {
//取出坦克
Enemy enemy = enemyTanks.get(i);
//不和自己比较
if (enemy != this) {
//如果敌人坦克是上下方向
if (enemy.getDirect() == 0 || enemy.getDirect() == 2) {
//当前坦克左下角坐标
if (this.getX() >= enemy.getX()
&& this.getX() <= enemy.getX() + 40
&& this.getY() +60 >= enemy.getY()
&& this.getY() +60<= enemy.getY() + 60) {
return true;
}
//当前坦克右下角坐标
if (this.getX() + 40>= enemy.getX()
&& this.getX() + 40 <= enemy.getX() + 40
&& this.getY() +60 >= enemy.getY()
&& this.getY() +60<= enemy.getY() + 60) {
return true;
}
}
//如果敌人方向是左右
if (enemy.getDirect() == 1 || enemy.getDirect() == 3) {
if (this.getX() >= enemy.getX()
&& this.getX() <= enemy.getX() + 60
&& this.getY() +60>= enemy.getY()
&& this.getY() +60<= enemy.getY() + 40) {
return true;
}
if (this.getX() + 40>= enemy.getX()
&& this.getX() + 40 <= enemy.getX() + 60
&& this.getY() +60 >= enemy.getY()
&& this.getY() +60<= enemy.getY() + 40) {
return true;
}
}
}
}
break;
case 3://左
for (int i = 0; i < enemyTanks.size(); i++) {
//取出坦克
Enemy enemy = enemyTanks.get(i);
//不和自己比较
if (enemy != this) {
//如果敌人坦克是上下方向
if (enemy.getDirect() == 0 || enemy.getDirect() == 2) {
//当前坦克左上角坐标
if (this.getX() >= enemy.getX()
&& this.getX() <= enemy.getX() + 40
&& this.getY() >= enemy.getY()
&& this.getY() <= enemy.getY() + 60) {
return true;
}
//当前坦克左下角坐标
if (this.getX() >= enemy.getX()
&& this.getX() <= enemy.getX() + 40
&& this.getY() +40 >= enemy.getY()
&& this.getY() +40<= enemy.getY() + 60) {
return true;
}
}
//如果敌人方向是左右
if (enemy.getDirect() == 1 || enemy.getDirect() == 3) {
if (this.getX() >= enemy.getX()
&& this.getX() <= enemy.getX() + 60
&& this.getY() >= enemy.getY()
&& this.getY() <= enemy.getY() + 40) {
return true;
}
if (this.getX() >= enemy.getX()
&& this.getX() <= enemy.getX() + 60
&& this.getY() +40 >= enemy.getY()
&& this.getY() +40<= enemy.getY() + 40) {
return true;
}
}
}
}
break;
}
return false;
}
3.使用方法
//将enemy设置给enemytank
enemytank.setEnemyTanks(enemy);
switch (getDirect()) {
case 0://向上
//让坦克多走几步保持走30部
for (int i = 0; i < 30; i++) {
if (getY() >= 0 && !isTouchEnemyTank()) {
moveUp();//划定上界限
}
//休眠
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
break;
case 1://向右
for (int i = 0; i < 30; i++) {
if (getX() + 60 <= 1000 && !isTouchEnemyTank()) {
moveRight();//划定右界限
}
//休眠
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
break;
case 2://向下
for (int i = 0; i < 30; i++) {
if (getY() + 60 <= 750 && !isTouchEnemyTank()) {
moveDown();//划定下界限
}
//休眠
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
break;
case 3://向左
for (int i = 0; i < 30; i++) {
if (getX() >= 0 && !isTouchEnemyTank()) {
moveLeft();//划定左界限
}
//休眠
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
break;
}
二、记录玩家总成绩存盘
1.写出右侧界面
//编写方法显示我方击毁敌方坦克的信息
public void showInfo(Graphics g){
//画出玩家的总成绩
g.setColor(Color.BLACK);
Font font = new Font("宋体", Font.BOLD, 25);
g.setFont(font);
g.drawString("您累计击毁敌方坦克",1020,30);
drawTank(1020,60,g,0,0);//画出一个敌方坦克
g.setColor(Color.BLACK);//这里需要重新设置成黑色
g.drawString("0",1080,100);
}
@Override
public void paint(Graphics g) {
super.paint(g);
g.fillRect(0, 0, 1000, 750);
showInfo(g);
if (hero != null && hero.isLive) {//加一个判断来决定是否画
2.记录坦克击毁数目
public class Recorder {
//定义变量记录击毁数
private static int enemyNum = 0;
//定义IO对象
private static FileWriter fw = null;
private static BufferedWriter bw = null;
private static String filePath = "d:\\myRecord.txt";
public static int getEnemyNum() {
return enemyNum;
}
public static void setEnemyNum(int enemyNum) {
Recorder.enemyNum = enemyNum;
}
//当我方击毁一个时就让enemyNum加一
public static void addNum(){
Recorder.enemyNum++;
}
}
g.drawString(Recorder.getEnemyNum()+"",1080,100);
public void hitTank(Shot s, Tank e) {
//判断s是否击中坦克
switch (e.getDirect()) {
//判断方向上和下区域相等
case 0:
case 2:
if (s.x > e.getX() && s.x < e.getX() + 40
&& s.y > e.getY() && s.y < e.getY() + 60) {
s.isLive = false;
e.isLive = false;
enemy.remove(e);//击中后就把坦克从集合中去除
//如果是我方坦克击中敌方坦克就加一
if(e instanceof Enemy){
Recorder.addNum();
}
//创建Bomb对象加入到bombs中
Bomb bomb = new Bomb(e.getX(), e.getY());
bombs.add(bomb);
}
break;
//左右方向
case 1:
case 4:
if (s.x > e.getX() && s.x < e.getX() + 60
&& s.y > e.getY() && s.y < e.getY() + 40) {
s.isLive = false;
e.isLive = false;
enemy.remove(e);
//如果是我方坦克击中敌方坦克就加一
if(e instanceof Enemy){
Recorder.addNum();
}
//创建Bomb对象加入到bombs中
Bomb bomb = new Bomb(e.getX(), e.getY());
bombs.add(bomb);
}
break;
}
}
3.将击毁数量存盘
//增加一个方法,当游戏退出时将enemyNum值保存到filePath
public static void keep() {
try {
bw = new BufferedWriter(new FileWriter(filePath,true));
bw.write(enemyNum +"");
bw.newLine();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (bw != null) {
bw.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
//在JFrame中增加响应关闭窗口的处理
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
Recorder.keep();
System.exit(0);
}
});
4.记录坦克坐标和方向
//增加一个方法,当游戏退出时将enemyNum值保存到filePath
//对这个方法进行升级保存坐标和方向
public static void keep() {
try {
bw = new BufferedWriter(new FileWriter(filePath, true));
bw.write(enemyNum + "" + "\r\n");
//遍历敌人坦克Vector根据情况保存
for (int i = 0; i < enemies.size(); i++) {
//取出
Enemy enemy = enemies.get(i);
if (enemy.isLive) {
//保存信息
String record = enemy.getX() + " " + enemy.getY() + " " + enemy.getDirect();
//写入文件
bw.write(record + "\r\n");
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (bw != null) {
bw.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
//将MyPanel的enemytank设置给Recorder
Recorder.setEnemies(enemy);
5.继续上局游戏
//增加一个方法用于读取文件恢复相关信息
//该方法在继续上局的时候调用
public static Vector<Node> getNodesAndNum(){
try {
br = new BufferedReader(new FileReader(filePath));
enemyNum = Integer.parseInt(br.readLine());
//循环读取文件
String line = "";
while ((line = br.readLine())!=null){
String[] xyd = line.split(" ");
Node node = new Node(Integer.parseInt(xyd[0]), Integer.parseInt(xyd[1]),
Integer.parseInt(xyd[2]));
nodes.add(node);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (br != null) {
br.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return nodes;
}
//增加一个方法,当游戏退出时将enemyNum值保存到filePath
//对这个方法进行升级保存坐标和方向
public class Node {
private int x;
private int y;
private int direct;
public Node(int x, int y, int direct) {
this.x = x;
this.y = y;
this.direct = direct;
}
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;
}
public int getDirect() {
return direct;
}
public void setDirect(int direct) {
this.direct = direct;
}
}
switch (key){
case "1":
//初始化敌人坦克
for (int i = 0; i < enemysize; i++) {
//传入坦克
Enemy enemytank = new Enemy((100 * (i + 1)), 0);
//将enemy设置给enemytank
enemytank.setEnemyTanks(enemy);
//设置方向
enemytank.setDirect(2);
//启动敌人坦克
new Thread(enemytank).start();
//给该enemy加入一颗子弹
Shot shot = new Shot(enemytank.getX() + 20, enemytank.getY() + 60, enemytank.getDirect());
//加入enemytank的Vector进行管理
enemytank.shots.add(shot);
//然后启动线程
new Thread(shot).start();
//加入集合
enemy.add(enemytank);
}
break;
case "2"://继续上局游戏
nodes = Recorder.getNodesAndNum();
//初始化敌人坦克
for (int i = 0; i < nodes.size(); i++) {
Node node = nodes.get(i);
//传入坦克
Enemy enemytank = new Enemy(node.getX(), node.getY());
//将enemy设置给enemytank
enemytank.setEnemyTanks(enemy);
//设置方向
enemytank.setDirect(node.getDirect());
//启动敌人坦克
new Thread(enemytank).start();
//给该enemy加入一颗子弹
Shot shot = new Shot(enemytank.getX() + 20, enemytank.getY() + 60, enemytank.getDirect());
//加入enemytank的Vector进行管理
enemytank.shots.add(shot);
//然后启动线程
new Thread(shot).start();
//加入集合
enemy.add(enemytank);
}
break;
}
public TankGame05() {
System.out.println("请输入选择1:新游戏2:继续上局");
String key = scanner.next();