韩顺平老师讲的坦克大战项目,用代码进行了复现,有几个自己的总结 1 有个别功能没有实现,EnemyTank中敌人坦克向四周移动功能没有实现,只是实现了随机转向,但一直停在原地不动,没有找到bug所在。 2 读取历史记录的功能没有实现,选择继续上局游戏时不能读取历史的数据 具体的代码块在Record类中 3 对于static和构造器的理解,当定义为static是在整个项目的任意文件类都可以进行访问,若没有static修饰则需要新建类才能进行访问;关于构造器的理解,新建一个类相当于建了一个无参或有参构造器,均是通过构造器进行相应的操作。 MyPanel.clss
package com.hsp.tankgame06;
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.File;
import java.io.FileOutputStream;
import java.security.Key;
import java.util.Vector;
//定义一个画板
public class MyPanel extends JPanel implements KeyListener ,Runnable{
//定义我的坦克
Hero hero = null;
//定义敌人的坦克群
Vector<EnemyTank> enemyTanks = new Vector<>();
int enemytanksize = 8;
//定义一个炸弹集合,当子弹击中坦克时添加一个bomb到bombs集合中
Vector<Bomb> bombs = new Vector<>();
//定义三张图片
Image image1 = null;
Image image2 = null;
Image image3 = null;
//初始化一个Record记录方法
//注意这里能用Record直接访问,是因为在Record用static定义的成员变量和方法,不需要重新键新建类
//Record record = new Record();
Vector<Node> nodes = new Vector<>();//用于存放敌人坦克的坐标
public MyPanel(String key){//构造器
//判断记录文件是否存在
//如果存在就正常执行 如果不存在就提示开启新游戏将key=1
if (key == "2"){
File file = new File(Record.getRecordfile());
if (file.exists()){
nodes = Record.getRecordinfo();
}else {
key = "1";
}
}
//初始化坦克,就是设置自己坦克的初始值
hero = new Hero(300,300);
hero.setSpeed(6);
//初始化敌人的坦克群
switch (key){
case "1"://开始新游戏
for (int i = 0; i < enemytanksize; i++) {
EnemyTank enemyTank = new EnemyTank((100 * (i + 1)), 300);
enemyTank.setDirection(2);
//初始化的时候启动敌人坦克线程
new Thread(enemyTank).start();
//给enemyTank加入一颗子弹
Shot shot = new Shot(enemyTank.getX()+20,enemyTank.getY()+60,enemyTank.getDirection());
//加入enemyTank的Vector成员
enemyTank.shots.add(shot);
//启动shot对象
new Thread(shot).start();
enemyTanks.add(enemyTank);
}
//初始化EnemyTank类中的setEnemyTanks方法,将坦克集数据传递过去
for (int i = 0; i < enemyTanks.size(); i++) {
EnemyTank enemyTank = enemyTanks.get(i);
enemyTank.setEnemyTanks(enemyTanks);
}
break;
case" 2"://继续上一局游戏
for (int i = 0; i < nodes.size(); i++) {
Node node = nodes.get(i);
EnemyTank enemyTank = new EnemyTank(node.getX(), node.getY());
enemyTank.setDirection(node.getDirection());
//初始化的时候启动敌人坦克线程
new Thread(enemyTank).start();
//给enemyTank加入一颗子弹
Shot shot = new Shot(enemyTank.getX()+20,enemyTank.getY()+60,enemyTank.getDirection());
//加入enemyTank的Vector成员
enemyTank.shots.add(shot);
//启动shot对象
new Thread(shot).start();
enemyTanks.add(enemyTank);
}
//初始化EnemyTank类中的setEnemyTanks方法,将坦克集数据传递过去 防止坦克相互碰撞的方法
for (int i = 0; i < enemyTanks.size(); i++) {
EnemyTank enemyTank = enemyTanks.get(i);
enemyTank.setEnemyTanks(enemyTanks);
}
break;
}
//初始化三张照片
image1 = Toolkit.getDefaultToolkit().getImage("E:\\下载\\bomb1.jpeg");
image2 = Toolkit.getDefaultToolkit().getImage("E:\\下载\\bomb2.jpeg");
image3 = Toolkit.getDefaultToolkit().getImage("E:\\下载\\bomb3.jpeg");
//添加背景音乐
// new AePlayWave("C:\\Users\\86178\\IdeaProjects\\untitled17\\Tankgame\\practise\\src\\com\\hsp\\tankgame06\\Calmkuma,Ace - Monsters.mp3").start();
}
//画出页面的信息方法
public void ShowInfo(Graphics g){
g.setColor(Color.BLACK);
Font font = new Font("宋体", Font.BOLD, 30);
g.setFont(font);
g.drawString("您击毁的敌方坦克数为:",1020,30);
drawTank(1020,60,g,0,0);
g.setColor(Color.BLACK);
g.drawString(Record.getDestructiveEnemyTanknums()+"",1100,100);
g.drawString("敌方击毁的我方坦克数为:",1020,160);
drawTank(1020,170,g,0,1);
g.setColor(Color.BLACK);
g.drawString(Record.getDestructiveheroTanknums()+"",1100,210);
}
@Override
public void paint(Graphics g) {
super.paint(g);
ShowInfo(g);
g.fillRect(0,0,1000,750);//画出游戏区域,默认画笔颜色是灰
//在画板上开始画自己的坦克,定义成一个方法
if (hero != null&&hero.islive == true) {
drawTank(hero.getX(), hero.getY(), g, hero.getDirection(), 1);
}
//在画板上开始画敌人的坦克群
for (int i = 0; i < enemyTanks.size(); i++) {
EnemyTank enemyTank = enemyTanks.get(i);
if (enemyTank.islive == true){
drawTank(enemyTank.getX(),enemyTank.getY(),g,enemyTank.getDirection(),0);
//画敌人坦克的子弹
for (int j = 0; j < enemyTank.shots.size(); j++) {
Shot shot = enemyTank.shots.get(j);
if (shot.islive == true){
//画出子弹
g.fill3DRect(shot.x,shot.y,3,3,false);
}else {
enemyTank.shots.remove(shot);
}
}
}else if (enemyTank.islive == false){
//当坦克被击中时从集合中移除坦克
enemyTanks.remove(enemyTank);
}
}
//将坦克集信息添加到Record中
Record.setEnemyTanks(enemyTanks);
//在画板上画hero发射出的子弹
for (int i = 0; i < hero.shots.size(); i++) {
Shot shot = hero.shots.get(i);
if (shot != null&&shot.islive == true){
g.draw3DRect(shot.x,shot.y,1,1,false);
}
}
//在画板上画出击中后爆炸的效果
for (int i = 0; i < bombs.size(); i++) {
Bomb bomb = bombs.get(i);
if (bomb.life>=6){
//画第一张图片
g.drawImage(image1,bomb.x,bomb.y,60,60,this);
}else if (bomb.life>=3&&bomb.life<6){
//画第二张图片
g.drawImage(image2,bomb.x,bomb.y,60,60,this);
}else {
//画第三张图片
g.drawImage(image3,bomb.x,bomb.y,60,60,this);
}
bomb.lifedown();
//如果bomb.life值为0,则移除bomb
if (bomb.life == 0){
bombs.remove(bomb);
}
}
}
//画坦克的方法
public void drawTank(int x,int y,Graphics g,int direction,int type){
switch (type){
case 0: //自己的坦克
g.setColor(Color.cyan);
break;
case 1: //敌人的坦克
g.setColor(Color.YELLOW);
break;
}
switch (direction){
case 0://方向向上
g.fill3DRect(x,y,10,60,false);
g.fill3DRect(x+30,y,10,60,false);
g.fill3DRect(x+10,y+10,20,40,false);
g.fillOval(x+10,y+20,20,20);
g.drawLine(x+20,y+30,x+20,y);
break;
case 1://方向向右
g.fill3DRect(x,y,60,10,false);
g.fill3DRect(x,y+30,60,10,false);
g.fill3DRect(x+10,y+10,40,20,false);
g.fillOval(x+20,y+10,20,20);
g.drawLine(x+30,y+20,x+60,y+20);
break;
case 2://方向向下
g.fill3DRect(x,y,10,60,false);
g.fill3DRect(x+30,y,10,60,false);
g.fill3DRect(x+10,y+10,20,40,false);
g.fillOval(x+10,y+20,20,20);
g.drawLine(x+20,y+30,x+20,y+60);
break;
case 3://方向向左
g.fill3DRect(x,y,60,10,false);
g.fill3DRect(x,y+30,60,10,false);
g.fill3DRect(x+10,y+10,40,20,false);
g.fillOval(x+20,y+10,20,20);
g.drawLine(x+30,y+20,x,y+20);
break;
}
}
//子弹击中我方坦克的方法
public void hitMyTank(Vector<EnemyTank> enemyTanks, Hero hero){
//判断敌人坦克发出来的子弹和我的位置会不会有重合
for (int i = 0; i < enemyTanks.size(); i++) {
EnemyTank enemyTank = enemyTanks.get(i);
if (enemyTank.islive== true){
for (int j = 0; j < enemyTank.shots.size(); j++) {
Shot shot = enemyTank.shots.get(j);
if (hero != null&&hero.islive&&shot.islive&&shot != null) {
switch (hero.getDirection()) {
case 0:
case 2:
if (shot.x > hero.getX() && shot.x < (hero.getX() + 40) && shot.y > hero.getY() && shot.y < (hero.getY() + 60)) {
shot.islive = false;
hero.islive = false;
Record.mynums();
enemyTank.shots.remove(shot);
Bomb bomb = new Bomb(hero.getX(), hero.getY());
bombs.add(bomb);
}
break;
case 1:
case 3:
if (shot.x > hero.getX() && shot.x < (hero.getX() + 60) && shot.y > hero.getY() && shot.y < (hero.getY() + 40)) {
shot.islive = false;
hero.islive = false;
Record.mynums();
enemyTank.shots.remove(shot);
Bomb bomb = new Bomb(hero.getX(), hero.getY());
bombs.add(bomb);
}
break;
}
}
}
}
}
}
//子弹击中敌人坦克的方法
public void hitEnemyTank(Vector<Shot> shots, Vector<EnemyTank> enemyTanks){
//判断子弹的xy坐标和坦克区域的坐标是否会重叠
for (int i = 0; i < shots.size(); i++) {
Shot shot = shots.get(i);
if (shot!= null&&shot.islive) {
for (int j = 0; j < enemyTanks.size(); j++) {
EnemyTank enemyTank = enemyTanks.get(j);
switch (enemyTank.getDirection()) {
case 0:
case 2:
if (shot.x > enemyTank.getX() && shot.x < (enemyTank.getX() + 40) && shot.y > enemyTank.getY() && shot.y < (enemyTank.getY() + 60)) {
enemyTank.islive = false;
enemyTanks.remove(enemyTank);
Record.nums();
shot.islive = false;
shots.remove(shot);
Bomb bomb = new Bomb(enemyTank.getX(), enemyTank.getY());
bombs.add(bomb);
}
break;
case 1:
case 3:
if (shot.x > enemyTank.getX() && shot.x < (enemyTank.getX() + 60) && shot.y > enemyTank.getY() && shot.y < (enemyTank.getY() + 40)) {
enemyTank.islive = false;
enemyTanks.remove(enemyTank);
Record.nums();
shot.islive = false;
shots.remove(shot);
Bomb bomb = new Bomb(enemyTank.getX(), enemyTank.getY());
bombs.add(bomb);
}
break;
}
}
}
}
}
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_W){
//向上运动
hero.setDirection(0);
if (hero.getY()>0){
hero.moveup();
}
}else if (e.getKeyCode() == KeyEvent.VK_S){
//向下运动
hero.setDirection(2);
if (hero.getY()+60<750){
hero.movedown();
}
}else if (e.getKeyCode() == KeyEvent.VK_A){
//向左运动
hero.setDirection(3);
if (hero.getX() > 0) {
hero.moveleft();
}
} else if (e.getKeyCode() == KeyEvent.VK_D) {
//向右运动
hero.setDirection(1);
if (hero.getX()+60<1000){
hero.moveright();
}
} else if (e.getKeyCode() == KeyEvent.VK_E) {
//向右上运动
hero.setDirection(0);
hero.moverightup();
}else if (e.getKeyCode() == KeyEvent.VK_C) {
//向右下运动
hero.setDirection(2);
hero.moverightdown();
}else if (e.getKeyCode() == KeyEvent.VK_Z) {
//向左下运动
hero.setDirection(2);
hero.moveleftdown();
}else if (e.getKeyCode() == KeyEvent.VK_Q) {
//向左上运动
hero.setDirection(0);
hero.moveleftup();
}else if (e.getKeyCode() == KeyEvent.VK_J){
//发射子弹
hero.shotEnemyTank();
}
this.repaint();//这个repaint方法是在按键的时候重写,下面的repaint方法是一直执行的重写
}
@Override
public void keyReleased(KeyEvent e) {
}
@Override
public void run() {
while (true){
try {
Thread.sleep(10);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
//判断子弹是否击中坦克
//这个位置hero.shot!= null的原因是,当刚开始打开程序还没有按下J键的时候,hero.shot为null,这个地方会报错,所以界面上会卡住画不出
// if (hero.shot!= null&&hero.shot.islive){
// //遍历敌人的坦克
// for (int i = 0; i < enemyTanks.size(); i++) {
// EnemyTank enemyTank = enemyTanks.get(i);
// hitEnemyTank(hero.shot,enemyTank);
// }
// }
hitEnemyTank(hero.shots,enemyTanks);
hitMyTank(enemyTanks,hero);
this.repaint();
}
}
}
TankGame.class
package com.hsp.tankgame06;
import javax.swing.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.IOException;
import java.util.Scanner;
//定义一个画框
public class TankGame07 extends JFrame {
private MyPanel mp = null;
Scanner sc = new Scanner(System.in);
public static void main(String[] args) {
new TankGame07();
}
public TankGame07(){
System.out.println("请您选择模式:1开启新游戏;2继续上局游戏");
String key = sc.next();
mp = new MyPanel(key);
Thread thread = new Thread(mp);//把MyPanel包装成线程
thread.start();
this.add(mp);
this.addKeyListener(mp);
this.setSize(1400,750);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
//监听窗口关闭的方法
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
try {
Record.Recordinfo();//注意这里能用Record直接访问Recordinfo方法,是因为在Record用static定义的成员变量和方法
} catch (IOException ex) {
throw new RuntimeException(ex);
}
System.exit(0);
}
});
}
}
Tank.class
package com.hsp.tankgame06;
//定义父类坦克
public class Tank {
private int x;
private int y;
private int direction;
boolean islive = true;//代表坦克是否存活
private int speed;
public int getSpeed() {
return speed;
}
public void setSpeed(int speed) {
this.speed = speed;
}
//定义向左向右向上向下运动的方式
public void moveup(){
y -= speed;
}
public void movedown(){
y += speed;
}
public void moveleft(){
x -= speed;
}
public void moveright(){
x += speed;
}
public void moveleftup(){
x -= speed;
y -= speed;
}
public void moverightup(){
x += speed;
y -= speed;
}
public void moveleftdown(){
x -= speed;
y += speed;
}
public void moverightdown(){
x += speed;
y += speed;
}
public Tank(int x, int y) {
this.x = x;
this.y = y;
}
public Tank() {
}
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 getDirection() {
return direction;
}
public void setDirection(int direction) {
this.direction = direction;
}
}
EnemyTank.class
package com.hsp.tankgame06;
import java.util.Random;
import java.util.Vector;
public class EnemyTank extends Tank implements Runnable{
public EnemyTank(int x, int y) {
super(x, y);
}
Vector<Shot> shots = new Vector<>();//每个敌人坦克包括很多子弹
Vector<EnemyTank> enemyTanks = new Vector<>();
//新建一个方法,将MyPanel中的enemyTanks集合传入进来
public void setEnemyTanks(Vector<EnemyTank> enemyTanks) {
this.enemyTanks = enemyTanks;
}
//定义一个碰撞方法
public boolean isTouchEnemyTank(){
for (int i = 0; i < enemyTanks.size(); i++) {
EnemyTank enemyTank = enemyTanks.get(i);
if (this != enemyTank){
switch (this.getDirection()){
case 0:
if (enemyTank.getDirection() == 0||enemyTank.getDirection()== 2){
if (this.getX()>= enemyTank.getX()
&&this.getX()<= enemyTank.getX()+40
&&this.getY()>= enemyTank.getY()
&&this.getY()<=enemyTank.getY()+60){
return true;
}
if (this.getX()+40>= enemyTank.getX()
&&this.getX()+40<= enemyTank.getX()+40
&&this.getY()>= enemyTank.getY()
&&this.getY()<=enemyTank.getY()+60){
return true;
}
}
if (enemyTank.getDirection() == 1||enemyTank.getDirection()== 3){
if (this.getX()>= enemyTank.getX()
&&this.getX()<= enemyTank.getX()+60
&&this.getY()>= enemyTank.getY()
&&this.getY()<=enemyTank.getY()+40){
return true;
}
if (this.getX()+40>= enemyTank.getX()
&&this.getX()+40<= enemyTank.getX()+60
&&this.getY()>= enemyTank.getY()
&&this.getY()<=enemyTank.getY()+40){
return true;
}
}
break;
case 1:
if (enemyTank.getDirection() == 0||enemyTank.getDirection()== 2){
if (this.getX()+60>= enemyTank.getX()
&&this.getX()+60<= enemyTank.getX()+40
&&this.getY()>= enemyTank.getY()
&&this.getY()<=enemyTank.getY()+60){
return true;
}
if (this.getX()+60>= enemyTank.getX()
&&this.getX()+60<= enemyTank.getX()+40
&&this.getY()+40>= enemyTank.getY()
&&this.getY()+40<=enemyTank.getY()+60){
return true;
}
}
if (enemyTank.getDirection() == 1||enemyTank.getDirection()== 3){
if (this.getX()+60>= enemyTank.getX()
&&this.getX()+60<= enemyTank.getX()+60
&&this.getY()>= enemyTank.getY()
&&this.getY()<=enemyTank.getY()+40){
return true;
}
if (this.getX()+60>= enemyTank.getX()
&&this.getX()+60<= enemyTank.getX()+60
&&this.getY()+40>= enemyTank.getY()
&&this.getY()+40<=enemyTank.getY()+40){
return true;
}
}
break;
case 2:
if (enemyTank.getDirection() == 0||enemyTank.getDirection()== 2){
if (this.getX()>= enemyTank.getX()
&&this.getX()<= enemyTank.getX()+40
&&this.getY()+60>= enemyTank.getY()
&&this.getY()+60<=enemyTank.getY()+60){
return true;
}
if (this.getX()+40>= enemyTank.getX()
&&this.getX()+40<= enemyTank.getX()+40
&&this.getY()+60>= enemyTank.getY()
&&this.getY()+60<=enemyTank.getY()+60){
return true;
}
}
if (enemyTank.getDirection() == 1||enemyTank.getDirection()== 3){
if (this.getX()>= enemyTank.getX()
&&this.getX()<= enemyTank.getX()+60
&&this.getY()+60>= enemyTank.getY()
&&this.getY()+60<=enemyTank.getY()+40){
return true;
}
if (this.getX()+40>= enemyTank.getX()
&&this.getX()+40<= enemyTank.getX()+60
&&this.getY()+60>= enemyTank.getY()
&&this.getY()+60<=enemyTank.getY()+40){
return true;
}
}
break;
case 3:
if (enemyTank.getDirection() == 0||enemyTank.getDirection()== 2){
if (this.getX()>= enemyTank.getX()
&&this.getX()<= enemyTank.getX()+40
&&this.getY()>= enemyTank.getY()
&&this.getY()<=enemyTank.getY()+60){
return true;
}
if (this.getX()>= enemyTank.getX()
&&this.getX()<= enemyTank.getX()+40
&&this.getY()+40>= enemyTank.getY()
&&this.getY()+40<=enemyTank.getY()+60){
return true;
}
}
if (enemyTank.getDirection() == 1||enemyTank.getDirection()== 3){
if (this.getX()>= enemyTank.getX()
&&this.getX()<= enemyTank.getX()+60
&&this.getY()>= enemyTank.getY()
&&this.getY()<=enemyTank.getY()+40){
return true;
}
if (this.getX()>= enemyTank.getX()
&&this.getX()<= enemyTank.getX()+60
&&this.getY()+40>= enemyTank.getY()
&&this.getY()+40<=enemyTank.getY()+40){
return true;
}
}
break;
}
}
}
return false;
}
@Override
public void run() {
Random random = new Random();
//给敌人的坦克子弹集增加多个子弹
//判断如果坦克还存在并且坦克的子弹集里面的子弹数量少
while (true) {
if (this.islive==true&&shots.size()<100){
Shot shot = null;
switch (getDirection()){
case 0:
shot = new Shot(getX()+20,getY(),0);
break;
case 1:
shot = new Shot(getX()+60,getY()+20,1);
break;
case 2:
shot = new Shot(getX()+20,getY()+60,2);
break;
case 3:
shot= new Shot(getX(),getY()+20,3);
break;
}
shots.add(shot);
shot.start();
}
//确定坦克移动的方向,让其按照方向移动
switch (getDirection()){
case 0://向上移动
for (int i = 0; i < 80; i++) {
if (this.getY()>=0&&!isTouchEnemyTank()){
this.moveup();
}
try {
Thread.sleep(50);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
break;
case 1://向右移动
for (int i = 0; i < 80; i++) {
if (this.getX()+60<=1000&&!isTouchEnemyTank()){
this.moveright();
}
try {
Thread.sleep(50);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
break;
case 2://向下移动
for (int i = 0; i < 80; i++) {
if (this.getY()+60<=750&&!isTouchEnemyTank()){
this.movedown();
}
try {
Thread.sleep(50);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
break;
case 3://向左移动
for (int i = 0; i < 80; i++) {
if (this.getX()>=0&&!isTouchEnemyTank()){
this.moveleft();
}
try {
Thread.sleep(50);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
break;
}
//随机改变坦克的移动方向
setDirection(random.nextInt(4));
//如果坦克被击中,退出线程
if (islive == false){
break;
}
}
}
}
Hero.class
package com.hsp.tankgame06;
import java.util.Vector;
//定义自己的坦克
public class Hero extends Tank {
//这里子类没有用父类的构造器,而是用自己的构造器
Shot shot = null;
Vector<Shot> shots = new Vector<>();
public Hero(int x, int y) {
}
//定义发射一颗子弹的方法
public void shotEnemyTank(){
switch (getDirection()){
case 0:
shot = new Shot(getX()+20,getY(),0);
break;
case 1:
shot = new Shot(getX()+60,getY()+20,1);
break;
case 2:
shot = new Shot(getX()+20,getY()+60,2);
break;
case 3:
shot = new Shot(getX(),getY()+20,3);
break;
}
shots.add(shot);
shot.start();
}
}
Shot.class
package com.hsp.tankgame06;
//定义一颗子弹,将其定义为一个线程
public class Shot extends Thread{
int x;
int y;
int direction=0;
int speed = 8;
boolean islive = true;//代表子弹是否存活
public Shot(int x, int y, int direction) {
this.x = x;
this.y = y;
this.direction = direction;
}
@Override
public void run() {
while (true){
try {
Thread.sleep(50);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
switch (direction){
case 0://向上
y -= speed;
break;
case 1://向右
x += speed;
break;
case 2://向下
y += speed;
break;
case 3://向左
x -= speed;
break;
}
// System.out.println("x的坐标为"+x);
// System.out.println("y的坐标为"+y);
if (!(x>=0&&x<=1000&&y>=0&&y<=750&&islive == true)){
this.islive = false;
break;
}
}
System.out.println("有子弹线程退出");
}
}
Bomb.class
package com.hsp.tankgame06;
//定义爆炸效果
public class Bomb {
int x;
int y;
int life = 9;
boolean islive = true;
//生成构造器,后面可通过构造器创建Bomb类对象
public Bomb(int x, int y) {
this.x = x;
this.y = y;
}
public void lifedown(){
if (life>0){
life--;
}else {
islive = false;
}
}
}
Record.class
package com.hsp.tankgame06;
import java.io.*;
import java.util.Vector;
//记录数据
public class Record {
private static int DestructiveEnemyTanknums = 0;
private static int DestructiveheroTanknums = 0;
private static BufferedWriter bw = null;
private static BufferedReader br = null;
private static String recordfile = "D:\\recordfiles.txt";
//建立一个Node集合用来存放读取的信息
private static Vector<Node> nodes = new Vector<>();
//定义一个坦克集用来接收MyPanel文件中的坦克集信息,之后在将这坦克的信息记录输出
private static Vector<EnemyTank> enemyTanks = null;
public static Vector<EnemyTank> getEnemyTanks() {
return enemyTanks;
}
//让MyPanel中判断Recordfile是否存在时能够拿到Recordfile文件
public static String getRecordfile() {
return recordfile;
}
public static void setEnemyTanks(Vector<EnemyTank> enemyTanks) {
Record.enemyTanks = enemyTanks;
}
//定义一个方法将记录的数据读取
public static Vector<Node> getRecordinfo(){
try {
br = new BufferedReader(new FileReader(recordfile));
DestructiveEnemyTanknums = Integer.parseInt(br.readLine());
DestructiveheroTanknums = 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 (Exception e) {
throw new RuntimeException(e);
} finally {
try {
if (br != null){
br.close();
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
return nodes;
}
//定义一个方法将记录的数据输出
public static void Recordinfo() throws IOException {
try {
bw = new BufferedWriter(new FileWriter(recordfile));
bw.write(DestructiveEnemyTanknums+"");
bw.newLine();
bw.write(DestructiveheroTanknums+"");
bw.newLine();
for (int i = 0; i < enemyTanks.size(); i++) {
EnemyTank enemyTank = enemyTanks.get(i);
if (enemyTank.islive) {
bw.write(enemyTank.getX() + " " + enemyTank.getY() + " " + enemyTank.getDirection());
bw.newLine();
}
}
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
if (bw != null){
bw.close();
}
}
}
public static int getDestructiveheroTanknums() {
return DestructiveheroTanknums;
}
public void setDestructiveheroTanknums(int destructiveheroTanknums) {
DestructiveheroTanknums = destructiveheroTanknums;
}
public static int getDestructiveEnemyTanknums() {
return DestructiveEnemyTanknums;
}
public void setDestructiveEnemyTanknums(int destructiveEnemyTanknums) {
DestructiveEnemyTanknums = destructiveEnemyTanknums;
}
//记录我方击毁的坦克数量
public static void nums(){
DestructiveEnemyTanknums ++;
}
//记录击毁我方的坦克数量
public static void mynums(){
DestructiveheroTanknums ++;
}
}
Node.class
package com.hsp.tankgame06;
public class Node {
private int x;
private int y;
private int direction;
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 getDirection() {
return direction;
}
public void setDirection(int direction) {
this.direction = direction;
}
public Node(int x, int y, int direction) {
this.x = x;
this.y = y;
this.direction = direction;
}
}