坦克大战
坦克大战游戏的界面如图所示:
本项目是在韩顺平java学习基础的指导下完成的,视频连接:韩顺平Java基础
该项目主要包括以下几个类:Bomb、EnemyTank、Hero、HspTankGame06、MyPanel、Node、Recoder、Shot、
Tank。
该项目主要包括:多线程技术、面向对象编程技术、IO流技术。
1、HspTankGame06
package com.hspedu.tankgame06;
import com.hspedu.tankgame06.MyPanel;
import com.hspedu.tankgame06.Recorder;
import javax.swing.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Scanner;
public class HspTankGame06 extends JFrame {
static Scanner scanner = new Scanner(System.in);
// 定义MyPanel
MyPanel mp = null;
public static void main(String[] args) {
HspTankGame06 hspTankGame01 = new HspTankGame06();
}
public HspTankGame06(){
System.out.println("请输入选择,1:新游戏,2:继续上局");
String key = scanner.next();
mp = new MyPanel(key);
Thread thread = new Thread(mp);
thread.start();
this.add(mp);
this.setSize(1300,950);
this.addKeyListener(mp);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
Recorder.keepRecorder();
System.exit(0);
// super.windowClosing(e);
}
});
}
}
2、MyPanel
package com.hspedu.tankgame06;
import com.hspedu.tankgame06.*;
import com.sun.jdi.ShortType;
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.File;
import java.util.Vector;
//为了让Panel不停的重绘子弹,需要将MyPanel 实现 Runnable,当做一个线程使用
public class MyPanel extends JPanel implements KeyListener ,Runnable {
// 定义我的坦克
// 定义一个Node对象的Vector,用于恢复敌人坦克的坐标
Vector<Node> nodes = new Vector<>();
Hero hero = null;
Vector<EnemyTank> enemyTanks = new Vector<>();
// 定义一个vector,用于存放炸弹
Vector<Bomb> bombs = new Vector<>();
// 当子弹击中坦克是,就加入一个Bomb对象到bombs中
int enemyTankSize = 3;
// 定义三张炸弹图片用于显示爆炸
Image image1 = null;
Image image2 = null;
Image image3 = null;
// 因为是多线程问题所以放在集合中
public MyPanel(String key){
File file = new File(Recorder.getRecordFile());
if (file.exists()){
nodes = Recorder.getNodesAndEnemyTankRec();
}else {
System.out.println("文件不存在只能开启新的游戏");
key = "1";
}
// 将MyPanel对象的enemyTanks 设置给 Recorder 的 enemyTanks
Recorder.setEnemyTanks(enemyTanks);
hero = new Hero(500,100);
switch (Integer.parseInt(key)){
case 1:
Recorder.setAllEnemyTankNum(0);
for (int i = 0; i < enemyTankSize; i++) {
EnemyTank enemyTank1 = new EnemyTank(100 * (i + 1), 0);
enemyTank1.setEnemyTanks(enemyTanks);
enemyTank1.setDirect(2);
// 启动敌人tank线程,让其动起来
new Thread(enemyTank1).start();
// 给该enemyTank 加入一颗子弹
shot shot = new shot(enemyTank1.getX()+20,enemyTank1.getY()+60,enemyTank1.getDirect());
enemyTank1.shots.add(shot);
new Thread(shot).start();
enemyTanks.add(enemyTank1);
}
break;
case 2:
for (int i = 0; i < nodes.size(); i++) {
Node node = nodes.get(i);
EnemyTank enemyTank1 = new EnemyTank(node.getX(),node.getY());
enemyTank1.setEnemyTanks(enemyTanks);
enemyTank1.setDirect(node.getDirect());
// 启动敌人tank线程,让其动起来
new Thread(enemyTank1).start();
// 给该enemyTank 加入一颗子弹
shot shot = new shot(enemyTank1.getX()+20,enemyTank1.getY()+60,enemyTank1.getDirect());
enemyTank1.shots.add(shot);
new Thread(shot).start();
enemyTanks.add(enemyTank1);
}
default:
System.out.println("输入有误");
}
// enemyTank = new EnemyTank(500,500);//初始化自己的tank
// 初始化图片对象
// image1 = Toolkit.getDefaultToolkit().getImage(Panel.class.getResource(""));
// image2 = Toolkit.getDefaultToolkit().getImage(Panel.class.getResource(""));
// image3 = Toolkit.getDefaultToolkit().getImage(Panel.class.getResource(""));
hero.setSpeed(50);
}
// 编写方法,显示我方击毁tank的信息
public void showInfo(Graphics g){
// 画出玩家的总成绩
g.setColor(Color.BLACK);
Font font = new Font("宋体", Font.BOLD, 25);
g.setFont(font);
g.drawString("您累计击毁敌方坦克",1024,30);
drawTank(1020,60,g,0,1);
g.setColor(Color.BLACK);
g.drawString(Recorder.getAllEnemyTankNum()+"",1080,100);
}
@Override
public void paint(Graphics g) {
super.paint(g);
g.fillRect(0,0,1000,750);//填充矩形默认黑色
// 画出坦克
showInfo(g);
if (hero!=null&& hero.isLive){
drawTank(hero.getX(),hero.getY(),g,hero.getDirect(),0);
}
// 画出hero射击的子弹
for (int i = 0; i < hero.shots.size(); i++) {
shot shot = hero.shots.get(i);
if (shot !=null && shot.isLive != false){
// g.fill3DRect(hero.shot.x,hero.shot.y,1,1,false);
g.draw3DRect(shot.x,shot.y,6,6,false);;
}else {//如果该shot对象已经无效,就从shots集合中拿掉
hero.shots.remove(shot);
}
}
// 如果集合中有炸弹的就要画出来
// 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){
// g.drawImage(image2,bomb.x,bomb.y,60,60,this);
// }else {
// g.drawImage(image3,bomb.x,bomb.y,60,60,this);
// }
// }
// System.out.println("第一个坦克");
// drawTank(hero.getX()+70,hero.getY(),g,hero.getDirect(),1);
System.out.println("第二个坦克");
// drawTank(hero.getX()+120,hero.getY(),g,hero.getDirect(),1);
// drawTank(hero.getX()+150,hero.getY()+150,g,hero.getDirect(),1);
// System.out.println("“”“”“");
// 画出敌人的坦克
// 编写方法画出坦克,遍历几何
// System.out.println(enemyTankSize);
for (int i = 0; i < enemyTanks.size(); i++) {
EnemyTank enemyTank1 = enemyTanks.get(i);
if (enemyTank1.isLive) {
drawTank(enemyTank1.getX(), enemyTank1.getY(), g, enemyTank1.getDirect(), 1);
// 画出enemyTank所有子弹
for (int j = 0; j < enemyTank1.shots.size(); j++) {
shot shot = enemyTank1.shots.get(j);
if (shot.isLive) {
// 取出当前shot的x,y
g.draw3DRect(shot.x, shot.y, 6, 6, false);
} else {
// 从vetor中移除
enemyTank1.shots.remove(shot);
}
}
}
}
}
/**
* **/
public void drawTank(int x,int y,Graphics g ,int direct,int type){
// 根据不同类型的坦克,设置不同颜色
switch (type){
case 0://我们的坦克
g.setColor(Color.cyan);
break;
case 1://敌人的坦克
g.setColor(Color.yellow);
break;
}
// 根据坦克的方向来绘制坦克
switch (direct) {
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,x+20,y+30);
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;
default:
System.out.println();
}
}
public void hitEnemyTank(){
for (int j = 0; j < hero.shots.size(); j++) {
shot shot = hero.shots.get(j);
if (shot != null && shot.isLive){
for (int i = 0; i < enemyTanks.size(); i++) {
EnemyTank enemyTank = enemyTanks.get(i);
hitTank(shot,enemyTank);
}
}
}
}
public void hitHeroTank(){
for (int i = 0; i < enemyTanks.size(); i++) {
EnemyTank enemyTank = enemyTanks.get(i);
for (int j = 0; j < enemyTank.shots.size(); j++) {
shot shot = enemyTank.shots.get(j);
if (hero.isLive&&shot.isLive){
hitTank(shot,hero);
}
}
}
}
public void hitTank(shot shot ,Tank Tank){
switch (Tank.getDirect()){
case 0:
case 2:
if (shot.x>Tank.getX()&&shot.x<Tank.getX()+40 && shot.y>Tank.getY()
&&shot.y<Tank.getY()+60){
shot.isLive = false;
Tank.isLive = false;
// 当自己的子弹击中敌人对象后,将enemytank从Vector中拿掉
enemyTanks.remove(Tank);
// 判断删除的坦克是否是敌人坦克,若是加一
if(Tank instanceof EnemyTank){
Recorder.addallEnemyTankNum();
}
Bomb bomb = new Bomb(Tank.getX(),Tank.getY());
bombs.add(bomb);
}
case 1:
case 3:
if (shot.x>Tank.getX()&&shot.x<Tank.getX()+60 && shot.y>Tank.getY()
&&shot.y<Tank.getY()+40){
shot.isLive = false;
Tank.isLive = false;
enemyTanks.remove(Tank);
if(Tank instanceof EnemyTank){
Recorder.addallEnemyTankNum();
}
Bomb bomb = new Bomb(Tank.getX(),Tank.getY());
bombs.add(bomb);
}
break;
}
}
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
//处理WDSA键按下的情况
if (e.getKeyCode()==KeyEvent.VK_W){//上
hero.setDirect(0);
if (hero.getY()>0) {
hero.moveUp();
}
// drawTank(hero.getX(),hero.getY(),g,hero.getDirect(),1);
}else if (e.getKeyCode()==KeyEvent.VK_D){//右
hero.setDirect(1);
if (hero.getX()+90<=1000){
hero.moveRight();
}
}else if (e.getKeyCode()==KeyEvent.VK_S){//左移动
hero.setDirect(2);
if (hero.getY()+90<=750){hero.moveDown();}
}else if (e.getKeyCode()==KeyEvent.VK_A){//下移动
hero.setDirect(3);
if(hero.getX()>0){
hero.moveLeft();
}
}
if (e.getKeyCode()==KeyEvent.VK_J){
// 弹壳子弹打中敌人坦克
// if (hero.shot==null || !hero.shot.isLive) {
// hero.shotEnemyTank();
// }
// 多颗子弹打中敌人坦克
hero.shotEnemyTank();
}
this.repaint();
}
@Override
public void keyReleased(KeyEvent e) {
}
@Override
public void run() {
while (true) {
// 判断是否集中了敌人坦克
try {
Thread.sleep(100);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
hitEnemyTank();
hitHeroTank();
// if (hero.shot.isLive){
// for (int i = 0; i < enemyTanks.size(); i++) {
// EnemyTank enemyTank = enemyTanks.get(i);
//
//
// }
// }
this.repaint();
}
}
}
3、Tank
package com.hspedu.tankgame06;
public class Tank {
private int x;//坦克的横坐标
private int y;//坦克的纵坐标
private int direct;
private int speed = 4;
boolean isLive = true;
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 int getDirect() {
return direct;
}
public void setDirect(int direct) {
this.direct = direct;
}
public Tank(int x, int y) {
this.x = x;
this.y = y;
}
public int getX(){
return x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
}
4、EnemyTank
package com.hspedu.tankgame06;
import com.hspedu.tankgame06.Tank;
import com.hspedu.tankgame06.shot;
import java.util.Vector;
public class EnemyTank extends Tank implements Runnable{
Vector<shot> shots = new Vector<>();
// 增加成员,EnemyTank可以得到敌人坦克的Vector
Vector<EnemyTank> enemyTanks = new Vector<>();
boolean isLive = true;
public EnemyTank(int x, int y) {
super(x, y);
}
//添加一个方法可以将Mypanel成员的Vector<EnemyTank> = new Vector<>();
// 设置到EnemyTank 的成员 enemyTanks
// 编写方法,判断当前的坦克是否和enemyTanks中的其他坦克发生重叠或碰撞
public boolean isTouchEnemyTank(){
// 判断当前敌人坦克的方向
switch (this.getDirect()){
case 0:
// 让当前敌人坦克和其他所有的敌人坦克比较
for (int i = 0; i < enemyTanks.size(); i++) {
// 取出一个坦克
EnemyTank enemyTank = enemyTanks.get(i);
// 不和自己比较
if (enemyTank != this){
// 敌人坦克上下
if (enemyTank.getDirect() == 0 || enemyTank.getDirect() == 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.getDirect() == 1 || enemyTank.getDirect() == 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:
for (int i = 0; i < enemyTanks.size(); i++) {
// 取出一个坦克
EnemyTank enemyTank = enemyTanks.get(i);
// 不和自己比较
if (enemyTank != this){
// 敌人坦克上下
if (enemyTank.getDirect() == 0 || enemyTank.getDirect() == 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.getDirect() == 1 || enemyTank.getDirect() == 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:
for (int i = 0; i < enemyTanks.size(); i++) {
// 取出一个坦克
EnemyTank enemyTank = enemyTanks.get(i);
// 不和自己比较
if (enemyTank != this){
// 敌人坦克上下
if (enemyTank.getDirect() == 0 || enemyTank.getDirect() == 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.getDirect() == 1 || enemyTank.getDirect() == 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:
for (int i = 0; i < enemyTanks.size(); i++) {
// 取出一个坦克
EnemyTank enemyTank = enemyTanks.get(i);
// 不和自己比较
if (enemyTank != this){
// 敌人坦克上下
if (enemyTank.getDirect() == 0 || enemyTank.getDirect() == 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.getDirect() == 1 || enemyTank.getDirect() == 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;
}
public void setEnemyTanks(Vector<EnemyTank> enemyTanks) {
this.enemyTanks = enemyTanks;
}
@Override
public void run() {
while(true){
// 如果
if(isLive&&shots.size() <1){
shot s = null;
switch (getDirect()){
case 0:
s = new shot(getX()+20,getY(),0);
case 1:
s = new shot(getX()+60,getY()+20,1);
case 2:
s = new shot(getX()+20,getY()+60,2);
case 3:
s = new shot(getX(),getY()+20,3);
}
shots.add(s);
new Thread(s).start();
}
switch (getDirect()){
case 0://向上
for (int i = 0; i < 30; i++) {
if(getY()>0 && !isTouchEnemyTank()) {
moveUp();
}
try {
Thread.sleep(50);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
break;
case 1://向右
for (int i = 0; i < 30; i++) {
if (getX()+60<1000 && !isTouchEnemyTank()) {
moveRight();
}
try {
Thread.sleep(50);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
break;
case 2://向下
for (int i = 0; i < 30; i++) {
if (getY()+60<750 && !isTouchEnemyTank()) {
moveDown();
}
try {
Thread.sleep(50);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
break;
case 3://向左
for (int i = 0; i < 30; i++) {
if (getX()>0 && !isTouchEnemyTank()) {
moveLeft();
}
try {
Thread.sleep(50);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
break;
}
// 返回0到4但取不到4
setDirect((int)(Math.random()*4));
if(!isLive){
break;
}
}
}
}
5、Hero
package com.hspedu.tankgame06;
import com.hspedu.tankgame06.Tank;
import com.hspedu.tankgame06.shot;
import java.util.Vector;
public class Hero extends Tank {
// 定义一个shot对象,表示一个射击线程
shot shot = null;
Vector<shot> shots = new Vector<>();
public Hero(int x, int y) {
super(x, y);
}
public void shotEnemyTank(){
if (shots.size() == 5){
return;
}
// 创建shot对象,根据当前Hero对象的位置和方向创建Shot
switch (getDirect()){
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);
new Thread(shot).start();
}
}
6、Bomb
package com.hspedu.tankgame06;
public class Bomb {
int x,y;
int life = 9;//炸弹的生命周期
boolean isLive = true;
public Bomb(int x, int y) {
this.x = x;
this.y = y;
}
public void lifeDown (){
if (life > 0) {
life--;
}else {
isLive = false;
}
}
}
7、Shot
package com.hspedu.tankgame06;
public class shot implements Runnable{
int x;
int y;
int direct = 0;
boolean isLive = true;
int speed = 2;
public shot(int x, int y, int direct) {
this.x = x;
this.y = y;
this.direct = direct;
}
@Override
public void run() {
while (true){
// 线程休眠50ms
try {
Thread.sleep(50);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
switch (direct){
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+"y="+y);
// 当子弹碰到敌人塔克时,也应该结束
if( !(x>=0&&x<=1000&& y>=0 && y<=750 && isLive) ){
isLive = false;
break;
}
}
}
}
8、Node
package com.hspedu.tankgame06;
//一个Node对象表示一个敌人坦克信息
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;
}
}
9、Recoder
package com.hspedu.tankgame06;
import com.hspedu.tankgame06.EnemyTank;
import com.hspedu.tankgame06.Node;
import java.io.*;
import java.util.Vector;
public class Recorder {
// 设置变量,记录我方击毁敌人坦克数
private static int allEnemyTankNum = 0;
// 定义IO对象
private static FileWriter fw = null;
private static BufferedWriter bw = null;
private static BufferedReader br = null;
private static String recordFile = "d:\\myRecord.txt";
// 定义一个vector,指向Mypanel对象的敌人坦克向量
private static Vector<EnemyTank> enemyTanks = null;
private static Vector<Node> nodes = new Vector<>();
public static void setEnemyTanks(Vector<EnemyTank> enemyTanks) {
Recorder.enemyTanks = enemyTanks;
}
// 定义一个Node的Vector,用于保存敌人的信息
public static Vector<Node> getNodesAndEnemyTankRec(){
try {
br = new BufferedReader(new FileReader(recordFile));
allEnemyTankNum = Integer.parseInt(br.readLine());
String line = "";
while ((line = br.readLine()) != null){
// 生成信息数组
String[] xyz = line.split(" ");
Node node = new Node(Integer.parseInt(xyz[0]),Integer.parseInt(xyz[1]),Integer.parseInt( xyz[2]));
nodes.add(node);
}
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
try {
if (br != null){
br.close();
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
return nodes;
}
public static String getRecordFile() {
return recordFile;
}
//增加一个方法,当游戏退出时,将allEnemyTankNum保存到文件
public static void keepRecorder() {
BufferedWriter bw = null;
try {
bw = new BufferedWriter(new FileWriter(recordFile));
bw.write(allEnemyTankNum +"\r\n");
for (int i = 0; i < enemyTanks.size(); i++) {
EnemyTank enemyTank = enemyTanks.get(i);
if(enemyTank.isLive){
String record = enemyTank.getX() + " "
+ enemyTank.getY() + " "
+ enemyTank.getDirect();
bw.write(record+"\r\n");
}
}
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
try {
if (bw != null){
bw.close();
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
public static int getAllEnemyTankNum() {
return allEnemyTankNum;
}
public static void setAllEnemyTankNum(int allEnemyTankNum) {
Recorder.allEnemyTankNum = allEnemyTankNum;
}
//当我方坦克击毁一个敌人坦克,就应当allEnemyTankNum++
public static void addallEnemyTankNum(){
Recorder.allEnemyTankNum = Recorder.allEnemyTankNum + 1;
}
}
该项目中还存在待完善的部分如:坦克爆炸部分没有添加图片效果(没有找到相应的图片)、游戏开始时没有音乐,需要的可自行添加。