日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java 坦克大战

發布時間:2023/12/31 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 坦克大战 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Mebers.java

package com.text3;import java.io.*; import java.util.Vector;class Node{int x;int y;int direct;public Node(int x, int y, int direct){this.x = x;this.y = y; this.direct = direct;} }//記錄類,同時也可以保存玩家的設置 class Recorder{//記錄沒關有多少敵人private static int enNum = 20;//設置我有多少可以用的人private static int myLife = 3;//記錄敵人的總數private static int allEnNum = 0;//從文件中恢復記錄點static Vector<Node> nodes = new Vector<>();//把玩家擊毀敵人坦克數量保存到文件中private static FileWriter fw = null;private static BufferedWriter bw = null;private static FileReader fr = null;private static BufferedReader br = null;private Vector<EnemyTank> ets = new Vector<>();//完成讀取任務public Vector<Node> getNodesAndEnNums(){try {fr = new FileReader("e:\\myRecording.txt");br = new BufferedReader(fr);String n = null;n = br.readLine();allEnNum = Integer.parseInt(n);while((n=br.readLine())!=null){String[] xyz = n.split(" ");Node node = new Node(Integer.parseInt(xyz[0]),Integer.parseInt(xyz[1]),Integer.parseInt(xyz[2]));nodes.add(node);}} catch (Exception e) {e.printStackTrace();}finally{try {br.close();fr.close();} catch (Exception e2) {e2.printStackTrace();}}return nodes;}public Vector<EnemyTank> getEts() {return ets;}public void setEts(Vector<EnemyTank> ets) {this.ets = ets;}//保存擊毀敵人的數量和和敵人坦克的坐標public void keepRecAndEnemyYank(){try {fw = new FileWriter("e:\\myRecording.txt");bw = new BufferedWriter(fw);bw.write(allEnNum+"\r\n");//保存當前活的敵人坦克的坐標和方向for(int i=0; i<ets.size(); i++){//取出第一個坦克EnemyTank et = ets.get(i);if(et.isLive){//活的保存String recode = et.x+" "+et.y+" "+et.direct;//寫入bw.write(recode+"\r\n");}}} catch (Exception e) {e.printStackTrace();}finally{try {bw.close();fw.close();} catch (Exception e2) {e2.printStackTrace();}}}//讀取記錄public static void getRecoring(){try {fr = new FileReader("e:\\myRecording.txt");br = new BufferedReader(fr);String n = br.readLine();allEnNum = Integer.parseInt(n);} catch (Exception e) {e.printStackTrace();}finally{try {br.close();fr.close();} catch (Exception e2) {e2.printStackTrace();}}}//記錄public static void keepRecording(){try {fw = new FileWriter("e:\\myRecording.txt");bw = new BufferedWriter(fw);bw.write(allEnNum+"\r\n");} catch (Exception e) {e.printStackTrace();}finally{try {bw.close();fw.close();} catch (Exception e2) {e2.printStackTrace();}}}public static int getEnNum() {return enNum;}public static void setEnNum(int enNum) {Recorder.enNum = enNum;}public static int getMyLife() {return myLife;}public static void setMyLife(int myLife) {Recorder.myLife = myLife;}//減少敵人數目public static void reduceEnNum(){enNum--;}public static void addEnNum(){allEnNum++;}public static int getAllEnNum() {return allEnNum;}public static void setAllEnNum(int allEnNum) {Recorder.allEnNum = allEnNum;}}//炸彈類 class Bomb {// 定義炸彈的坐標int x;int 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 {this.isLive = false;}} }// 子彈類 class Shot implements Runnable {int x;int y;int direct;int speed = 1;// 是否或者boolean isLive = true;public Shot(int x, int y, int direct) {this.x = x;this.y = y;this.direct = direct;}@Overridepublic void run() {while (true) {try {Thread.sleep(50);} catch (Exception e) {}switch (direct) {case 0:// 上y -= speed;break;case 1:// 右x += speed;break;case 2:// 下y += speed;break;case 3:// 左x -= speed;break;}// 判斷該子彈是否碰到邊緣if (x < 0 || x > 400 || y < 0 || y > 300) {this.isLive = false;break;}}} }// 坦克類 class TanK {// 表示坦克橫坐標int x = 0;// 表示坦克的縱坐標int y = 0;boolean isLive = true;// 坦克方向// 0表示上 1表示 右 2 表示下 3表示左int direct = 0;// 速度int speed = 2;int color = 0;public int getColor() {return color;}public void setColor(int color) {this.color = color;}public int getSpeed() {return speed;}public void setSpeed(int speed) {this.speed = speed;}public int getDirect() {return direct;}public void setDirect(int direct) {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;}TanK(int x, int y) {this.x = x;this.y = y;} }// 敵人坦克 class EnemyTank extends TanK implements Runnable {int times =0;//定義一個向量,可以訪問到MyPanel上所有的敵人的坦克Vector<EnemyTank> ets = new Vector<>();//定義一個向量,可以存放敵人的子彈Vector<Shot> ss = new Vector<>();//敵人添加子彈,應當在剛剛創建坦克和敵人子彈消失EnemyTank(int x, int y) {super(x, y);}//得到MyPanel的敵人的坦克向量public void setEts(Vector<EnemyTank> vv){this.ets = vv;}//判斷是否碰到了別的敵人的坦克public boolean isTouchOtherEnemy(){boolean b = false;switch(this.direct){case 0://我的坦克向上//取出所以敵人坦克for(int i=0; i<ets.size();i++){//取出第一個坦克EnemyTank et = ets.get(i);//如果不是自己if(et!=this){//敵人的方向是向下或者向上if(et.direct==0 || et.direct==2){if(this.x>=et.x && this.x<=et.x+20 && this.y>=et.y && this.y<=et.y+30){return true;}if(this.x+20>=et.x&&this.x+20<=et.x+20&&this.y>=et.y&&this.y<=et.y+30){return true;}}if(et.direct==1 || et.direct==3){if(this.x>=et.x && this.x<=et.x+30 && this.y>=et.y && this.y<=et.y+20){return true;}if(this.x+20>=et.x&&this.x+20<=et.x+30&&this.y>=et.y&&this.y<=et.y+20){return true;}}}}break;case 1://坦克向右for(int i=0; i<ets.size();i++){//取出第一個坦克EnemyTank et = ets.get(i);//如果不是自己if(et!=this){//敵人的方向是向下或者向上if(et.direct==0 || et.direct==2){if(this.x+30>=et.x && this.x+30<=et.x+20 && this.y>=et.y && this.y<=et.y+30){return true;}if(this.x+30>=et.x&&this.x+30<=et.x+20&&this.y+20>=et.y&&this.y+20<=et.y+30){return true;}}if(et.direct==1 || et.direct==3){if(this.x+30>=et.x && this.x+30<=et.x+30 && this.y+20>=et.y && this.y+20<=et.y+20){return true;}if(this.x+30>=et.x&&this.x+30<=et.x+30&&this.y>=et.y&&this.y<=et.y+20){return true;}}}}break;case 2:for(int i=0; i<ets.size();i++){//取出第一個坦克EnemyTank et = ets.get(i);//如果不是自己if(et!=this){//敵人的方向是向下或者向上if(et.direct==0 || et.direct==2){if(this.x>=et.x && this.x<=et.x+20 && this.y+30>=et.y && this.y+30<=et.y+30){return true;}if(this.x+20>=et.x&&this.x+20<=et.x+20&&this.y+30>=et.y&&this.y+30<=et.y+30){return true;}}if(et.direct==1 || et.direct==3){if(this.x>=et.x && this.x<=et.x+30 && this.y+30>=et.y && this.y+30<=et.y+20){return true;}if(this.x+20>=et.x&&this.x+20<=et.x+30&&this.y+30>=et.y&&this.y+30<=et.y+20){return true;}}}}break;case 3://向左for(int i=0; i<ets.size();i++){//取出第一個坦克EnemyTank et = ets.get(i);//如果不是自己if(et!=this){//敵人的方向是向下或者向上if(et.direct==0 || et.direct==2){if(this.x>=et.x && this.x<=et.x+20 && this.y>=et.y && this.y<=et.y+30){return true;}if(this.x>=et.x&&this.x<=et.x+20&&this.y+20>=et.y&&this.y+20<=et.y+30){return true;}}if(et.direct==1 || et.direct==3){if(this.x>=et.x && this.x<=et.x+30 && this.y>=et.y && this.y<=et.y+20){return true;}if(this.x>=et.x&&this.x<=et.x+30&&this.y+20>=et.y&&this.y+20<=et.y+20){return true;}}}}break;}return b;}@Overridepublic void run() {while (true) {switch (this.direct) {case 0:for (int i = 0; i < 30; i++) {if(y>0 && !this.isTouchOtherEnemy()){y -= speed;}try {Thread.sleep(50);} catch (Exception e) {e.printStackTrace();}}break;case 1:for (int i = 0; i < 30; i++) {if(x<350 && !this.isTouchOtherEnemy()){x += speed;}try {Thread.sleep(50);} catch (Exception e) {e.printStackTrace();}}break;case 2:for (int i = 0; i < 30; i++) {if(y<230 && !this.isTouchOtherEnemy()){y += speed;}try {Thread.sleep(50);} catch (Exception e) {e.printStackTrace();}}break;case 3:for (int i = 0; i < 30; i++) {if(x>0 && !this.isTouchOtherEnemy()){x -= speed;}try {Thread.sleep(50);} catch (Exception e) {e.printStackTrace();}}break;}this.times++;if(times%2==0){if(isLive){if(ss.size()<5){//判斷是否需要給坦克加入新的子彈Shot s = null;//沒有子彈//添加switch(direct){case 0:s = new Shot(x + 10, y, 0);ss.add(s);break;case 1:s = new Shot(x + 30, y + 10, 1);ss.add(s);break;case 2:s = new Shot(x + 10, y + 30, 2);ss.add(s);break;case 3:s = new Shot(x, y + 10, 3);ss.add(s);break;}Thread t = new Thread(s);t.start();}}}// 讓坦克隨機產生一個新的方向this.direct = (int) (Math.random() * 4);// 判斷敵人是否死亡if (this.isLive == false) {// 讓坦克死亡后,推出線程break;}}}}// 我的坦克 class Hero extends TanK {//子彈Shot s = null;Vector<Shot> ss = new Vector<>();Hero(int x, int y) {super(x, y);}// 開火public void shotEnemy() {switch (this.direct) {case 0:s = new Shot(x + 10, y, 0);ss.add(s);break;case 1:s = new Shot(x + 30, y + 10, 1);ss.add(s);break;case 2:s = new Shot(x + 10, y + 30, 2);ss.add(s);break;case 3:s = new Shot(x, y + 10, 3);ss.add(s);break;}Thread t = new Thread(s);t.start();}// 上移public void moveUp() {y -= speed;}// 右移public void moveRight() {x += speed;}// 下移public void moveDown() {y += speed;}// 左移public void moveLeft() {x -= speed;}} MyTankeGame3.java

package com.text3;import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JPanel;import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.util.Vector;public class MyTankeGame3 extends JFrame implements ActionListener{MyPanel mp = null;MyStartPanel msp = null;JMenuBar jmb = null;JMenu jm1 = null;JMenuItem jmil = null;JMenuItem jmi2 = null;JMenuItem jmi3 = null;JMenuItem jmi4 = null;public static void main(String[] args) {MyTankeGame3 mtg = new MyTankeGame3();}MyTankeGame3() {// mp = new MyPanel();// Thread t = new Thread(mp);// t.start();// this.add(mp);// 監聽// this.addKeyListener(mp);//創建菜單及菜單選項jmb = new JMenuBar();jm1 = new JMenu("游戲(G)");jm1.setMnemonic('G');jmil = new JMenuItem("開始游戲(N)");jmi2 = new JMenuItem("退出游戲(E)");jmi3 = new JMenuItem("存盤退出游戲(C)");jmi4 = new JMenuItem("繼續上局游戲(S)");jmi4.addActionListener(this);jmi4.setActionCommand("conGame");jmi3.addActionListener(this);jmi3.setActionCommand("saveExit");jmi2.setMnemonic('E');jmil.addActionListener(this);jmil.setActionCommand("newgame");jmi2.addActionListener(this);jmi2.setActionCommand("exit");jm1.add(jmil);jm1.add(jmi2);jm1.add(jmi3);jm1.add(jmi4);jmb.add(jm1);msp = new MyStartPanel();new Thread(msp).start();this.setJMenuBar(jmb);this.add(msp);this.setSize(600, 500);this.addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {System.exit(1);}});this.setVisible(true);}@Overridepublic void actionPerformed(ActionEvent e) {if(e.getActionCommand().equals("newgame")){mp = new MyPanel("newGame");Thread t = new Thread(mp);t.start();//先刪除舊的面板this.remove(msp);this.add(mp);// 監聽this.addKeyListener(mp);//顯示this.setVisible(true);}else if(e.getActionCommand().equals("exit")){//保存擊毀敵人數量Recorder.keepRecording();//退出System.exit(0);}else if(e.getActionCommand().equals("saveExit")){Recorder recoder = new Recorder();recoder.setEts(mp.ets);recoder. keepRecAndEnemyYank();//退出System.exit(0);}else if(e.getActionCommand().equals("conGame")){//讀出數據mp = new MyPanel("con");Thread t = new Thread(mp);t.start();//先刪除舊的面板this.remove(msp);this.add(mp);// 監聽this.addKeyListener(mp);//顯示this.setVisible(true);}} }// 就是一個提示作用 class MyStartPanel extends JPanel implements Runnable {int times = 0;public void paint(Graphics g) {super.paint(g);g.fillRect(0, 0, 400, 300);// 提示信息if (times % 2 == 0) {g.setColor(Color.yellow);// 開關信息的字體Font myFont = new Font("華文新魏", Font.BOLD, 30);g.setFont(myFont);g.drawString("stage: 1", 130, 130);}}@Overridepublic void run() {while (true) {try {Thread.sleep(500);} catch (Exception e) {e.printStackTrace();}times++;this.repaint();}} }// 我的面板 class MyPanel extends JPanel implements KeyListener, Runnable {// 定義一個坦克Hero hero = null;// 定義敵人的坦克Vector<EnemyTank> ets = new Vector<>();Vector<Node> nodes = new Vector<>();Vector<Bomb> bombs = new Vector<>();// 定義炸彈集合int enSize = 3;// 第義三張圖片Image image1 = null;Image image2 = null;Image image3 = null;public MyPanel(String flag) {//恢復記錄Recorder.getRecoring();hero = new Hero(100, 100);if(flag.equals("newGame")){// 初始化敵人的坦克for (int i = 0; i < enSize; i++) {EnemyTank et = new EnemyTank((i + 1) * 50, 0);et.setColor(0);et.setDirect(2);// 將MyPanel的敵人坦克交給敵人坦克et.setEts(ets);// 啟動敵人的坦克Thread t = new Thread(et);t.start();// 給敵人添加一顆子彈Shot s = new Shot(et.x + 10, et.y + 30, 2);et.ss.add(s);new Thread(s).start();ets.add(et);}}else{nodes = new Recorder().getNodesAndEnNums();for (int i = 0; i < nodes.size(); i++) {Node node = nodes.get(i);EnemyTank et = new EnemyTank(node.x, node.y);et.setColor(0);et.setDirect(node.direct);// 將MyPanel的敵人坦克交給敵人坦克et.setEts(ets);// 啟動敵人的坦克Thread t = new Thread(et);t.start();// 給敵人添加一顆子彈Shot s = new Shot(et.x + 10, et.y + 30, 2);et.ss.add(s);new Thread(s).start();ets.add(et);}}// 初始化圖片image1 = Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/1.png"));image2 = Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/2.png"));image3 = Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/3.png"));}//提示信息public void showInfo(Graphics g){//畫出提示信息坦克,(該坦克不參與戰斗)this.drawTank(80, 330, g, 0, 1);g.setColor(Color.black);g.drawString(Recorder.getEnNum()+"", 110, 350);this.drawTank(130, 330, g, 0, 0);g.setColor(Color.black);g.drawString(Recorder.getMyLife()+"", 165, 350);//畫出玩家的總成績g.setColor(Color.black);Font f = new Font("宋體",Font.BOLD,20);g.setFont(f);g.drawString("您的總成績 ", 420, 30);this.drawTank(420, 60, g, 0, 1);g.setColor(Color.black);g.drawString(Recorder.getAllEnNum()+"", 460, 80);}public void paint(Graphics g) {super.paint(g);g.fillRect(0, 0, 400, 300);//畫出提示信息坦克,showInfo(g);// 畫出自己的坦克if (hero.isLive) {this.drawTank(hero.getX(), hero.getY(), g, this.hero.direct, 0);}// 從ss中取出每一顆子彈,并畫出for (int i = 0; i < this.hero.ss.size(); i++) {Shot myShot = hero.ss.get(i);// 畫出子彈if (myShot != null && myShot.isLive == true) {g.draw3DRect(myShot.x, myShot.y, 1, 1, false);}if (myShot.isLive == false) {// 從向量中去掉該子彈hero.ss.remove(myShot);}}// 畫出炸彈for (int i = 0; i < bombs.size(); i++) {// 取出炸彈Bomb b = bombs.get(i);if (b.life > 6) {g.drawImage(image1, b.x, b.y, 30, 30, this);} else if (b.life > 3) {g.drawImage(image2, b.x, b.y, 30, 30, this);} else {g.drawImage(image3, b.x, b.y, 30, 30, this);}// 讓b的生命值減少b.lifeDown();// 生命值為0,就把bombs向量去掉if (b.life == 0) {bombs.remove(b);}}// 畫出敵人的坦克for (int i = 0; i < ets.size(); i++) {EnemyTank e = ets.get(i);if (e.isLive) {this.drawTank(e.getX(), e.getY(), g, e.getDirect(), 1);// 再畫出敵人的子彈for (int j = 0; j < e.ss.size(); j++) {// 取出敵人的子彈Shot enemyShot = e.ss.get(j);if (enemyShot.isLive) {g.draw3DRect(enemyShot.x, enemyShot.y, 1, 1, false);} else {// 如果敵人的坦克死亡就從vector中刪除e.ss.remove(enemyShot);}}}}}// 敵人的子彈是否擊中我public void hitMe() {for (int i = 0; i < this.ets.size(); i++) {EnemyTank et = ets.get(i);// 取出每一顆子彈for (int j = 0; j < et.ss.size(); j++) {// 取出子彈Shot enemyShot = et.ss.get(j);if (hero.isLive) {this.hitTanK(enemyShot, hero);}}}}// 判斷是否擊中 敵人的坦克public void hitEnemyTank() {for (int i = 0; i < hero.ss.size(); i++) {// 取出子彈Shot myShot = hero.ss.get(i);// 判斷子彈是否有效if (myShot.isLive) {// 取出每個坦克,與它判斷for (int j = 0; j < ets.size(); j++) {// 取出坦克EnemyTank et = ets.get(j);if (et.isLive) {if(this.hitTanK(myShot, et)){//減少敵人數量Recorder.reduceEnNum();//增加我的記錄Recorder.addEnNum();}}}}}}// 寫出一個函數專門判斷子彈是否擊中敵人坦克public boolean hitTanK(Shot s, TanK et) {boolean b2 = false;// 判斷該坦克的方向switch (et.direct) {case 0:case 2:if (s.x > et.x && s.x < et.x + 20 && s.y > et.y && s.y < et.y + 30) {// 擊中// 子彈死亡s.isLive = false;// 坦克死亡et.isLive = false;b2 = true;// 創建一顆炸彈,放入vector中Bomb b = new Bomb(et.x, et.y);bombs.add(b);}break;case 1:case 3:if (s.x > et.x && s.x < et.x + 30 && s.y > et.y && s.y < et.y + 20) {// 擊中// 子彈死亡s.isLive = false;// 坦克死亡et.isLive = false;b2 = true;// 創建一顆炸彈,放入vector中Bomb b = new Bomb(et.x, et.y);bombs.add(b);}break;}return b2;}// 畫出坦克類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:// 畫出坦克// 1.畫出左邊的矩形g.fill3DRect(x, y, 5, 30, false);// 2.畫出右邊的矩形g.fill3DRect(x + 15, y, 5, 30, false);// 3.畫出中間的矩形g.fill3DRect(x + 5, y + 5, 10, 20, false);// 4.畫出圓形g.fillOval(x + 5, y + 10, 10, 10);// 5.畫出線g.drawLine(x + 10, y + 15, x + 10, y);break;case 1:// 炮筒向右// 上面矩形g.fill3DRect(x, y, 30, 5, false);// 下面矩形g.fill3DRect(x, y + 15, 30, 5, false);// 中間矩形g.fill3DRect(x + 5, y + 5, 20, 10, false);// 圓形g.fillOval(x + 10, y + 5, 10, 10);// 炮筒g.drawLine(x + 15, y + 10, x + 30, y + 10);break;case 2:// 向下// 1.畫出左邊的矩形g.fill3DRect(x, y, 5, 30, false);// 2.畫出右邊的矩形g.fill3DRect(x + 15, y, 5, 30, false);// 3.畫出中間的矩形g.fill3DRect(x + 5, y + 5, 10, 20, false);// 4.畫出圓形g.fillOval(x + 5, y + 10, 10, 10);// 5.畫出線g.drawLine(x + 10, y + 15, x + 10, y + 30);break;case 3:// 向左// 上面矩形g.fill3DRect(x, y, 30, 5, false);// 下面矩形g.fill3DRect(x, y + 15, 30, 5, false);// 中間矩形g.fill3DRect(x + 5, y + 5, 20, 10, false);// 圓形g.fillOval(x + 10, y + 5, 10, 10);// 炮筒g.drawLine(x + 15, y + 10, x, y + 10);break;}}// a左 s下 w上 d右@Overridepublic void keyTyped(KeyEvent e) {// TODO Auto-generated method stub}@Overridepublic void keyPressed(KeyEvent e) {// 設置我的坦克方向if (e.getKeyCode() == KeyEvent.VK_W) {// 上this.hero.setDirect(0);this.hero.moveUp();} else if (e.getKeyCode() == KeyEvent.VK_D) {// 右this.hero.setDirect(1);this.hero.moveRight();} else if (e.getKeyCode() == KeyEvent.VK_S) {// 下this.hero.setDirect(2);this.hero.moveDown();} else if (e.getKeyCode() == KeyEvent.VK_A) {// 左this.hero.setDirect(3);this.hero.moveLeft();}if (e.getKeyCode() == KeyEvent.VK_J) {// 判斷玩家是否按下J// 開火if (this.hero.ss.size() < 5) {this.hero.shotEnemy();}}// 重新繪制panelthis.repaint();}@Overridepublic void keyReleased(KeyEvent e) {// TODO Auto-generated method stub}@Overridepublic void run() {while (true) {try {Thread.sleep(100);} catch (Exception e) {e.printStackTrace();}this.hitEnemyTank();// 判斷敵人的子彈是否擊中我了this.hitMe();this.repaint();}} } 運行結果:




總結

以上是生活随笔為你收集整理的java 坦克大战的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。