Java———坦克大战

本文围绕Java技术在坦克大战游戏开发中的应用展开。介绍了Java绘图坐标体系和绘图技术,包括Graphics类的使用;阐述了Java事件处理机制;详细分析了线程在坦克发射子弹、敌方坦克行动等方面的应用思路及代码;还说明了IO流在存储击杀坦克数和上一局坦克信息中的应用。
摘要由CSDN通过智能技术生成

目录

java绘图坐标体系

坐标体系-介绍

java绘图技术

绘图原理

绘制圆形

Graphics类

演示代码

绘制坦克模型

java事件处理机制

事件处理机制

基本介绍

案例演示(BallMove.java)

事件处理机制深入理解

线程——应用到坦克大战

坦克发射子弹

思路分析

代码演示

敌方坦克可以发射子弹

思路分析

当己方坦克击中敌方坦克时,敌人的坦克就消失

思路分析

代码演示

敌人的坦克也可以自由随机的上下左右移动

思路分析

代码演示

控制坦克的范围

思路分析

代码演示

控制坦克多颗发射

思路分析

代码演示

控制坦克是否重叠

思路分析

代码演示

IO流——应用到坦克大战

存储击杀坦克数

思路分析

存储上一局的坦克信息

思路分析

代码演示


4月24日

java绘图坐标体系

坐标体系-介绍

下图说明了Java坐标系。坐标原地位于左上角,以像素为单位。在Java左边中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。

java绘图技术

绘图原理

Component类提供了两个和绘图相关重要的方法:

  1. paint(Graphics g)绘制组件的外观:
  2. repaint()刷新组件的外观。

当组件第一次在屏幕显示的时候,程序会自动的调用paint()方法来绘制组件。

以下情况paint()将会被调用

  1. 窗口最小化,在最大化
  2. 窗口大小发生变化
  3. repaint方法被调用

绘制圆形

package com.ashuo.draw;

import javax.swing.*;
import java.awt.*;

public class DrawCircle extends JFrame{//JFrame对应一个窗口,可以理解成一个画框

    //定义一个画板
    private MyPanel mp = null;
    public static void main(String[] args) {
        new DrawCircle();
    }
    public DrawCircle(){//构造器完成
        //初始化面板
        mp = new MyPanel();
        //把面板放入画框
        this.add(mp);
        //设置大小
        this.setSize(1000,800);
        //当点击窗口的小X真正的退出
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //设置可视化
        this.setVisible(true);
    }
}
//1.先定义一个面板 ,继承JPanel类 ,画图形,就在面板上画
class MyPanel extends JPanel {
    //说明:
    //1.Mypanel 对象就是一个面板
    //2.Graphics g g理解为一个画笔
    //3.Graphics 提供了很多绘图方法
    @Override
    public void paint(Graphics g){//绘图方法
        super.paint(g);//调用父类的方法完成初始化
        g.drawOval(10,10,200,200);
    }
}

Graphics类

Graphics类你可以理解就是画笔,为我们提供各种绘制图形的方法:

  1. 画直线 drawLine(int x1,int y1,int x2,int y2)
  2. 画矩形边框 drawRect( int x, int y, int width, int height)
  3. 画椭圆边框 drawOval( int x, int y, int width, int height)
  4. 填充矩形fillRect(int x, int y, int width, int height)
  5. 填充椭圆fillOval(int x, int y, int width, int height)
  6. 画图片 drawImage(Image img,int x,int y,..)
  7. 设置画笔的字体 setFont(Font font)
  8. 设置画笔的颜色 setColor(Color c)
  9. 画字符串 drawString(String str,int x,int y)

演示代码

   g.drawOval(10,10,200,200);


        //演示绘制不同的图形。。
//        1. 画直线 drawLine(int x1,int y1,int x2,int y2)
//        g.drawLine(10,10,100,100);
//        2. 画矩形边框 drawRect( int x, int y, int width, int height)
//        g.drawRect(10,10,100,100);
//        3. 画椭圆边框 drawOval( int x, int y, int width, int height)
//        4. 填充矩形fillRect(int x, int y, int width, int height)
//        g.setColor(Color.blue);
//        g.fillRect(10,10,200,200);
//        5. 填充椭圆fillOval(int x, int y, int width, int height)
//        g.setColor(Color.red);
//        g.fillOval(10,10,100,100);
//        6. 画图片 drawImage(Image img,int x,int y,..)
//        1.加载图片资源
        Image image = Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/bg.jpg"));
        g.drawImage(image,100,100,240,240,this);
//        7. 设置画笔的字体 setFont(Font font)
//        8. 设置画笔的颜色 setColor(Color c)
//        9. 画字符串 drawString(String str,int x,int y)
        g.setColor(Color.red);
        g.setFont(new Font("隶书",Font.BOLD,50));
        g.drawString("hello world",80,100);

绘制坦克模型

package com.ashuo.tankgame;

import javax.swing.*;
import java.awt.*;

public class Mypanel extends JPanel {
    //定义我的坦克
    Hero hero = null;
    public Mypanel(){
        hero = new Hero(100,100);

    }

    @Override
    public void paint(Graphics g) {
        super.paint(g);
        g.fillRect(0,0,1000,750);//填充矩形
        drawTank(hero.getX(),hero.getY(),g,0,0);
        //绘制坦克-封装到方法
    }
    //编写方法,画出坦克

    /**
     *
     * @param x 坦克的左上角x坐标
     * @param y 坦克的左上角y坐标
     * @param g 画笔
     * @param direct 坦克方向(上下左右)
     * @param type 坦克类型
     */
    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+10,y+10,20,40,false);
                g.fill3DRect(x+30,y,10,60,false);
                g.fillOval(x+10,y+20,20,20);
                g.drawLine(x+20,y,x+20,y+30);
                break;
            default:
                System.out.println("暂时没有处理");
        }
    }
}

java事件处理机制

事件处理机制

基本介绍

Java事件处理是采取“委派事件模型”。当事件发生事件的对象,会把此“信息”传递给“事件的监听者”处理,这里所说的”信息“实际上就是java.awt.enent事件类库里某个类所创建的对象,把它称为”事件的对象“

示意图:

案例演示(BallMove.java)

怎么让一个小球受到键盘的控制,上下左右移动?

package com.ashuo.event_;
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class BallMove extends JFrame{
    MyPanel1 mp = null;
    public static void main(String[] args) {
        BallMove ballMove = new BallMove();
    }
    public BallMove(){
        mp = new MyPanel1();
        this.add(mp);
        this.setSize(1000,800);
        this.addKeyListener(mp);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);
    }
}
//面板
//keyListener 是监听器,可以监听键盘事件
class MyPanel1 extends JPanel implements KeyListener {
    int x = 10;
    int y = 10;
    @Override
    public void paint(Graphics g) {
        super.paint(g);
        g.fillOval(x,y,20,20);
    }
    //监听键盘有字符输出,该方法就会触发
    @Override
    public void keyTyped(KeyEvent e) {

    }
    //当某个键按下,该方法就会触发
    @Override
    public void keyPressed(KeyEvent e) {
        //System.out.println((char) e.getKeyCode() + "被按下");
        //根据用户按下的不同键,来处理小球的移动(上下左右的键)
        //在java 中会给每一个键分配一个值
        if(e.getKeyCode() == KeyEvent.VK_DOWN){
            y++;
        }else if (e.getKeyCode() == KeyEvent.VK_UP){
            y--;
        }else if (e.getKeyCode() == KeyEvent.VK_RIGHT){
            x++;
        }else if (e.getKeyCode() == KeyEvent.VK_LEFT){
            x--;
        }
        this.repaint();

    }
    //当某个键松下,该方法就会触发
    @Override
    public void keyReleased(KeyEvent e) {

    }
}

事件处理机制深入理解

  1. 几个重要的概念 事件源、事件、事件监听器
  2. 事件源:事件源是一个产生事件的对象,比如按钮,窗口等
  3. 事件:事件就是承载事件源状态改变时的对象,比如当键盘事件、鼠标事件、窗口事件等等,会生成一个事件对象,该对象保存着当前事件很多信息,比如KeyEvent 对象有含义被按下键的Code值。java.awt.evnet包和javax.swing.event包中定义了各种事件类型
  4. 事件监听器接口
    1. 当事件源产生一个事件,可以传送事件监听者处理
    2. 事件监听者实际上就是一个类,该类实现了某个事件监听器接口
    3. 事件监听器接口有多种,不同的事件监听器接口可以监听不同的事件,一个类可以实现多个监听接口
    4. 这些接口在java.awt.event包和javax.swing.event包中定义。

线程——应用到坦克大战

坦克发射子弹

思路分析

  1. 当发射一颗子弹,就相当于启动一个线程
  2. Hero有子弹对象,当按下J时,我们就启动一个发射行为(线程),让子弹不停的移动,形成一个射击的效果
  3. 我们MyPanel需要不停的重绘子弹,才能出现该效果
  4. 当子弹移动到面板边界时,就应该销毁(把启动的子弹的线程销毁)

代码演示

package com.tankgame;

public class Shot implements Runnable{
    int x;
    int y;
    int direct = 0;
    int speed = 3;
    boolean isLive = true;//子弹是否存活
    static Object o = new Object();

    public Shot(int x, int y, int direct) {
        this.x = x;
        this.y = y;
        this.direct = direct;
    }

    @Override
    public void run() {
            while (true) {
                try {
                    Thread.sleep(50);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                switch (direct) {
                    case 0:
                        y -= speed;
                        break;
                    case 1:
                        x += speed;
                        break;
                    case 2:
                        y += speed;
                        break;
                    case 3:
                        x -= speed;
                        break;
                }
                //根据方向改变x,y坐标
                if (!(x >= 0 && x <= 1000 && y >= 0 && y <= 750)) {
                    isLive = false;
                    break;
                }
            }
        }
}
package com.tankgame;

public class Hero extends Tank {
    Shot shot = null;
    public Hero(int x , int y){
        super(x,y);
    }

    public void shotEnemyTank(){
        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;
        }
        new Thread(shot).start();
    }
}
paint方法的绘制子弹代码
if (hero.shot != null && hero.shot.isLive != false){
    drawGan(hero.shot.x,hero.shot.y,g,hero.getDirect());
}
keyPressed方法控制启动子弹线程
if (e.getKeyCode() == KeyEvent.VK_J){
    hero.shotEnemyTank();
}
panint在面板一直重绘
@Override
    public void run() {//每隔100毫秒 ,重绘区域

        while (true){
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            this.repaint();
        }
    }

敌方坦克可以发射子弹

思路分析

  1. 在敌人坦克类,使用Vector 保存多个Shot
  2. 当每创建一个敌人坦克对象,给该敌人坦克对象初始一个Shot对象,同时启动Shot
  3. 在绘制敌人坦克时,需要遍历敌人坦克对象Vector,绘制所有的子弹,当isLive == false时,就会Vector移除
Shot shot = new Shot(enemyTank.getX() + 20, enemyTank.getY() + 60, enemyTank.getDirect());
enemyTank.shotList.add(shot);
new Thread(shot).start();
for (int j = 0; j < enemyTank.shotList.size(); j++){
    Shot shot = enemyTank.shotList.get(j);
    if (shot.isLive == true){
        g.draw3DRect(shot.x,shot.y,3,3,false);
    }else {
        enemyTank.shotList.remove(shot);
    }
}

当己方坦克击中敌方坦克时,敌人的坦克就消失

思路分析

  1. 如果子弹的x坐标和y坐标在敌人坦克的范围之内就让敌人的坦克remove
  2. 定义一个方法检测我方子弹和敌方坦克是否重叠
  3. 结束坦克生命

代码演示

    //我方子弹是否击中敌人tank
    public void hitTank(Shot s , EnemyTank enemyTank){
        switch (enemyTank.getDirect()){
            case 0:
            case 2:
                if ((s.x > enemyTank.getX() && s.x < enemyTank.getX() +40)
                && (s.y > enemyTank.getY() && s.y < enemyTank.getY() + 60)){
                    s.isLive = false;
                    enemyTank.isLive = false;
                    enemyList.remove(enemyTank);
                    Bomb bomb = new Bomb(enemyTank.getX(), enemyTank.getY());
                    bombs.add(bomb);
                }
                break;
            case 1:
            case 3:
                if ((s.x > enemyTank.getX() && s.x < enemyTank.getX() +60)
                        && (s.y > enemyTank.getY() && s.y < enemyTank.getY() + 40)){
                    s.isLive = false;
                    enemyTank.isLive = false;
                    enemyList.remove(enemyTank);
                    Bomb bomb = new Bomb(enemyTank.getX(), enemyTank.getY());
                    bombs.add(bomb);
                }
                break;
        }
    }

敌人的坦克也可以自由随机的上下左右移动

思路分析

  1. 因为要求敌人的坦克,可以自由移动,因此需要将敌人坦克当作线程使用
  2. 我们需要EnemyTank 实现Runnable
  3. 在run方法实现自由移动

代码演示

  @Override
    public void run() {
        while(true){
            //根据坦克的方向来继续移动
            switch (getDirect()) {
                case 0:
                    //让坦克保持一个方向
                    for (int i = 0; i < 30; i++) {
                        modeUp();
                        try {
                            Thread.sleep(50);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    break;
                case 1:
                    for (int i = 0; i < 30; i++) {
                        modeRight();
                        try {
                            Thread.sleep(50);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    break;
                case 2:
                    for (int i = 0; i < 30; i++) {
                        modeDown();
                        try {
                            Thread.sleep(50);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    break;
                case 3:
                    for (int i = 0; i < 30; i++) {
                        modeLeft();
                        try {
                            Thread.sleep(50);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    break;
            }
            setDirect((int) (Math.random()*4));
            if (!isLive){
                break;
            }
        }

控制坦克的范围

思路分析

  1. 当坦克移动的时候判断x和y的坐标位置是否超出画笔
  2. 如果超出画板就不会自增或自减运算

代码演示

    public void modeUp(){
        if (y > 0){
            y -= spend;
        }
    }
    public void modeDown(){
        if ((y+120) < 750){
            y += spend;
        }
    }
    public void modeLeft(){
        if ( x > 0){
            x -= spend;
        }
    }
    public void modeRight(){
        if ( (x+80) < 1000){
            x += spend;
        }
    }

控制坦克多颗发射

思路分析

  1. 在Tank类中加入一个short的子弹集合
  2. 在启动坦克线程在run方法中添加子弹数量(不超过5)
  3. 根据坦克方向绘制子弹方向
  4. 在Mypanel类中绘制子弹的实体

代码演示

while(true){
            if ((shotList.size() < 3) && isLive){
                Shot s = null;
                switch(getDirect()){
                    case 0:
                        s = new Shot(getX() + 20,getY(),getDirect());
                        break;
                    case 1:
                        s = new Shot(getX() + 60,getY()+20,getDirect());
                        break;
                    case 2:
                        s = new Shot(getX() + 20,getY()+60,getDirect());
                        break;
                    case 3:
                        s = new Shot(getX() ,getY()+20,getDirect());
                        break;
                }
                shotList.add(s);
                try {
                    new Thread(s).start();
                    Thread.sleep(200);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
for (int j = 0; j < enemyTank.shotList.size(); j++){
                    Shot shot = enemyTank.shotList.get(j);
                    if (shot.isLive){
                        g.draw3DRect(shot.x,shot.y,3,3,false);
                    }else {
                        enemyTank.shotList.remove(shot);
                    }
                }

控制坦克是否重叠

思路分析

  1. 判断是否重叠可以分为八种情况
  2. 当坦克在运行在上方时
    1. 判断与左右方向坦克是否重叠
    2. 判断与上下方向坦克是否重
  1. 当坦克在运行在右方时
    1. 判断与左右方向坦克是否重叠
    2. 判断与上下方向坦克是否重叠
  1. 当坦克在运行在下方时
    1. 判断与左右方向坦克是否重叠
    2. 判断与上下方向坦克是否重叠
  1. 当坦克在运行在左方时
    1. 判断与左右方向坦克是否重叠
    2. 判断与上下方向坦克是否重叠
  1. 如果判断成功就在不会移动坦克

代码演示

    public boolean tankOverlap(){
        switch (getDirect()){
            case 0:
                for (int i = 0 ; i < enemyTanks.size(); i++){
                    Tank tank = enemyTanks.get(i);
                    //我方坦克的左上角 [this.getX(),this.getY()]和右上角[this.getX() + 40, this.getY()]
                    if (this != tank){
                        //其他坦克上下的情况
                        if (tank.getDirect() == 0 || tank.getDirect() == 2){
                            if (this.getX() >= tank.getX() &&
                                    this.getX()  <= tank.getX() +40
                                    && this.getY() >= tank.getY()
                                    && this.getY() <= tank.getY() + 60){
                                return true;
                            }
                            if (this.getX() + 40 > tank.getX() &&
                                    this.getX() + 40 <= tank.getX() + 40
                                    && this.getY() >= tank.getY()
                                    && this.getY() <= tank.getY() + 60){
                                return true;
                            }
                        }
                        //其他坦克左右的情况 [tank.getX() + 40 , tank.getY() + ]
                        if (tank.getDirect() == 1 || tank.getDirect() == 3){
                            if (this.getX()  >= tank.getX() &&
                                    this.getX()   <= tank.getX() +60
                                    && this.getY()  >= tank.getY()
                                    && this.getY() <= tank.getY() + 40){
                                return true;
                            }
                            if (this.getX() + 40 > tank.getX() &&
                                    this.getX() + 40 <= tank.getX() + 60
                                    && this.getY() >= tank.getY()
                                    && this.getY() <= tank.getY() + 40){
                                return true;
                            }
                        }
                    }
                }
                break;
            case 1:
                for (int i = 0 ; i < enemyTanks.size(); i++){
                    Tank tank = enemyTanks.get(i);
                    //我方坦克的左上角 [this.getX(),this.getY()]和右上角[this.getX() + 40, this.getY()]
                    if (this != tank){
                        //其他坦克上下的情况
                        if (tank.getDirect() == 0 || tank.getDirect() == 2){
                            if (this.getX() + 60 >= tank.getX() &&
                                    this.getX() + 60 <= tank.getX() +40
                                    && this.getY() >= tank.getY()
                                    && this.getY() <= tank.getY() + 60){
                                return true;
                            }
                            if (this.getX() + 60 > tank.getX() &&
                                    this.getX() + 60 <= tank.getX() + 40
                                    && this.getY() + 40>= tank.getY()
                                    && this.getY() + 40 <= tank.getY() + 60){
                                return true;
                            }
                        }
                        //其他坦克左右的情况 [tank.getX() + 40 , tank.getY() + ]
                        if (tank.getDirect() == 1 || tank.getDirect() == 3){
                            if (this.getX() + 60 >= tank.getX() &&
                                    this.getX() + 60  <= tank.getX() +60
                                    && this.getY()  >= tank.getY()
                                    && this.getY() <= tank.getY() + 40){
                                return true;
                            }
                            if (this.getX() + 60 > tank.getX() &&
                                    this.getX() + 60 <= tank.getX() + 60
                                    && this.getY() + 40 >= tank.getY()
                                    && this.getY() + 40 <= tank.getY() + 40){
                                return true;
                            }
                        }
                    }
                }
                break;
            case 2:
                for (int i = 0 ; i < enemyTanks.size(); i++){
                    Tank tank = enemyTanks.get(i);
                    //我方坦克的左上角 [this.getX(),this.getY()]和右上角[this.getX() + 40, this.getY()]
                    if (this != tank){
                        //其他坦克上下的情况
                        if (tank.getDirect() == 0 || tank.getDirect() == 2){
                            if (this.getX()  >= tank.getX() &&
                                    this.getX()  <= tank.getX() +40
                                    && this.getY() + 60   >= tank.getY()
                                    && this.getY() + 60 <= tank.getY() + 60){
                                return true;
                            }
                            if (this.getX() + 40 > tank.getX() &&
                                    this.getX() + 40  <= tank.getX() + 40
                                    && this.getY() + 60>= tank.getY()
                                    && this.getY() + 60 <= tank.getY() + 60){
                                return true;
                            }
                        }
                        //其他坦克左右的情况 [tank.getX() + 40 , tank.getY() + ]
                        if (tank.getDirect() == 1 || tank.getDirect() == 3){
                            if (this.getX()  >= tank.getX() &&
                                    this.getX()   <= tank.getX() +60
                                    && this.getY() + 60 >= tank.getY()
                                    && this.getY() + 60 <= tank.getY() + 40){
                                return true;
                            }
                            if (this.getX() + 40 > tank.getX() &&
                                    this.getX() + 40 <= tank.getX() + 60
                                    && this.getY() + 60 >= tank.getY()
                                    && this.getY() + 60 <= tank.getY() + 40){
                                return true;
                            }
                        }
                    }
                }
                break;
            case 3:
                for (int i = 0 ; i < enemyTanks.size(); i++){
                    Tank tank = enemyTanks.get(i);
                    //我方坦克的左上角 [this.getX(),this.getY()]和右上角[this.getX() + 40, this.getY()]
                    if (this != tank){
                        //其他坦克上下的情况
                        if (tank.getDirect() == 0 || tank.getDirect() == 2){
                            if (this.getX()  >= tank.getX() &&
                                    this.getX()   <= tank.getX() +40
                                    && this.getY()   >= tank.getY()
                                    && this.getY()  <= tank.getY() + 60){
                                return true;
                            }
                            if (this.getX() > tank.getX() &&
                                    this.getX() <= tank.getX() + 40
                                    && this.getY() + 40 >= tank.getY()
                                    && this.getY() + 40 <= tank.getY() + 60){
                                return true;
                            }
                        }
                        //其他坦克左右的情况 [tank.getX() + 40 , tank.getY() + ]
                        if (tank.getDirect() == 1 || tank.getDirect() == 3){
                            if (this.getX()  >= tank.getX() &&
                                    this.getX()   <= tank.getX() +60
                                    && this.getY()  >= tank.getY()
                                    && this.getY()  <= tank.getY() + 40){
                                return true;
                            }
                            if (this.getX()  > tank.getX() &&
                                    this.getX()  <= tank.getX() + 60
                                    && this.getY()  + 40>= tank.getY()
                                    && this.getY() +40 <= tank.getY() + 40){
                                return true;
                            }
                        }
                    }
                }
                break;
        }
        return false;
    }

IO流——应用到坦克大战

存储击杀坦克数

思路分析

  1. 先在画板上绘制坦克杀敌数的信息
  2. 新增Recorder类用于记录相关文件,和文件交互
  3. 新增击杀数增加方法,在MyPanel类中判断是否击杀坦克该方法执行
 if (tank instanceof EnemyTank){
                        Recorder.addallEnemyTankNum();
                    }

存储上一局的坦克信息

思路分析

  1. 新增Node类用来存放坦克的基本信息x y 方向
  2. 在Recorder 类中新增两个方法一个输入文件信息,另一个输入文件信息。

代码演示

public static Vector<Node> getNodesAndEnemyNUm() {
        if (new File(recoder).exists()) {
            try {
                bufferedReader = new BufferedReader(new FileReader(recoder));
                allEnemyTankNum = Integer.parseInt(bufferedReader.readLine());
                String string = null;
                while ((string = bufferedReader.readLine()) != null) {
                    String[] s = string.split(" ");
                    Node node = new Node();
                    node.setX(Integer.parseInt(s[0]));
                    node.setY(Integer.parseInt(s[1]));
                    node.setDirect(Integer.parseInt(s[2]));
                    nodes.add(node);
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (bufferedReader != null) {
                    try {
                        bufferedReader.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
        return nodes;
    }
    public static void keepRecord(){
        try {
             bufferedWriter = new BufferedWriter(new FileWriter(recoder));
             bufferedWriter.write(allEnemyTankNum + "");
             bufferedWriter.newLine();
             for (int i = 0; i < enemyTanks.size(); i++){
                 Tank enemyTank = enemyTanks.get(i);
                 if (enemyTank.isLive){
                     bufferedWriter.write(enemyTank.getX() + " " + enemyTank.getY() + " " + enemyTank.getDirect());
                     bufferedWriter.newLine();
                 }
             }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (bufferedWriter != null){
                try {
                    bufferedWriter.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值