java坦克大战最终代码
package tanke.game;import javax.swing.*;
import java.util.Vector;public class enemytank extends tank implements Runnable {//敌人坦克Vector<shot> shots = new Vector<>();//在敌人坦克类,使用vector保存多个shot//增加成员,enemytank可以得到敌人坦克的vectorVector<enemytank> enemytanks = new Vector<>();boolean islive = true;public enemytank(int x, int y) {super(x, y);}public Vector<enemytank> getEnemytanks() {return enemytanks;}//提供方法可以将mypanel里的属性enemytank成员设置到我们的enemytank里的属性public void setEnemytanks(Vector<enemytank> enemytanks) {this.enemytanks = enemytanks;}//编写方法,判断当前这个坦克是否和enemeytank中的其他坦克重叠public boolean istouchenemytank() {//判断当前敌方坦克的方向switch (this.getDirect()) {case 0://上for(int i=0;i<enemytanks.size();i++){enemytank enemytank = enemytanks.get(i);//让当前坦克和其他坦克比较if (enemytank != this) {//不和自己比,如果敌方坦克是上下//如果是敌方坦克x范围是x,敌方x+40.y范围y,敌方y+60//当前坦克左上角坐标我方x,我方y。//当前坦克右上角坐标是我方x+40,y。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.getY() + 40&&this.getY()<=enemytank.getX()+60&&this.getY()>=enemytank.getY()) {return true;}}//敌方坦克是右/左//敌方x范围x,x+60//敌方y范围有,y+40if (enemytank.getDirect() == 1 || enemytank.getDirect() == 3) {//当前坦克左上角坐标我方x,我方y。if (this.getX() >= enemytank.getX()&& this.getX() <= enemytank.getX() + 60&& this.getY() >= enemytank.getY()&& this.getY() >= enemytank.getY() + 40) {return true;}//当前坦克右上角坐标是我方x+40,y。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) {//不和自己比,如果敌方坦克是上下//如果是敌方坦克x范围是x,敌方x+40.y范围y,敌方y+60//当前坦克右下角坐标我方x+60,我方y+40。//当前坦克右上角坐标是我方x+60,y。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() + 60&&this.getY()+40>=enemytank.getY()) {return true;}}//敌方坦克是右/左//敌方x范围x,x+60//敌方y范围有,y+40if (enemytank.getDirect() == 1 || enemytank.getDirect() == 3) {//当前坦克右上角坐标我方x+60,我方y。if (this.getX() +60>= enemytank.getX()&& this.getX()+60 <= enemytank.getX() + 60&& this.getY() >= enemytank.getY()&& this.getY() >= enemytank.getY() + 40) {return true;}//当前坦克右下角坐标是我方x+60,y+40。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) {//不和自己比,如果敌方坦克是上下//如果是敌方坦克x范围是x,敌方x+40.y范围y,敌方y+60//当前坦克左下角坐标我方x,我方y+60。//当前坦克右下角坐标是我方x+40,y+60。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() + 60&&this.getY()+60>=enemytank.getY()) {return true;}}//敌方坦克是右/左//敌方x范围x,x+60//敌方y范围有,y+40if (enemytank.getDirect() == 1 || enemytank.getDirect() == 3) {//当前坦克左下角坐标我方x,我方y+60。if (this.getX() >= enemytank.getX()&& this.getX() <= enemytank.getX() + 60&& this.getY()+60 >= enemytank.getY()&& this.getY() +60>= enemytank.getY() + 40) {return true;}//当前坦克右下角坐标是我方x+60,y+40。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) {//不和自己比,如果敌方坦克是上下//如果是敌方坦克x范围是x,敌方x+40.y范围y,敌方y+60//当前坦克左上角角坐标我方x,我方y。//当前坦克左下角坐标是我方x,y+40。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() + 60&&this.getY()+40>=enemytank.getY()) {return true;}}//敌方坦克是右/左//敌方x范围x,x+60//敌方y范围有,y+40if (enemytank.getDirect() == 1 || enemytank.getDirect() == 3) {//当前坦克右上角坐标我方x,我方y。if (this.getX() >= enemytank.getX()&& this.getX() <= enemytank.getX() + 60&& this.getY() >= enemytank.getY()&& this.getY() >= enemytank.getY() + 40) {return true;}//当前坦克右下角坐标是我方x,y+40。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;}@Overridepublic void run() {while (true) {//我们判断如果shots size()=0,创建一颗子弹放入列if (islive && shots.size() < 1) {//shots集合启动shot s = null;switch (getDirect()) {//判断坦克的方向,创建对应子弹case 0:s = new shot(getX() + 20, getY(), 0);break;case 1:s = new shot(getX() + 60, getY() + 20, 1);break;case 2:s = new shot(getX() + 20, getY() + 60, 2);break;case 3:s = new shot(getX(), getY() + 20, 3);break;}shots.add(s);new Thread(s).start();}//根据坦克的方向继续推动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;}setDirect((int) (Math.random() * 4));//随机改变坦克方向0-3//写并发程序一定要考虑清楚线程什么时候结束if (!islive) {break;//islive为假,退出线程}}}
}
package tanke.game;import java.util.Vector;public class mytanke extends tank{//d定义一个shot对象,表示射击行为shot shot=null;//可以发射多颗子弹Vector<shot> shots=new Vector<>();public mytanke(int x, int y) {super(x, y);}//射击public void shotenemytank(){//创建shot对象,根据当前mytank的位置和方向创建shot//控制面板上最多五颗子弹if(shots.size()==5){return;}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;}//把新创建的shot放入到shotsshots.add(shot);new Thread(shot).start();}
}
package tanke.game;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;//把记录文件保存在src下private static String recordfile = "src\\myrecord.txt";private static Vector<enemytank> enemytanks = null;//定义一个node的vector,用于保存敌人的信息nodeprivate static Vector<node> nodes=new Vector<>();public static void setEnemytanks(Vector<enemytank> enemytanks) {recorder.enemytanks = enemytanks;}
//返回文件的目录public static String getRecordfile() {return recordfile;}//增加一个方法,用于读取recordfile,恢复相关信息//该方法在继续上局游戏的时候调用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[] xyd = line.split(" ");node node = new node(Integer.parseInt(xyd[0]), Integer.parseInt(xyd[1]),Integer.parseInt(xyd[1]));nodes.add(node);}} catch(IOException e) {e.printStackTrace();} finally {if(br!=null){try {br.close();} catch (IOException e) {e.printStackTrace();}}}return nodes;}public static void keeprecord() {//保存敌人坦克的坐标方向try {bw = new BufferedWriter(new FileWriter(recordfile));bw.write(allenemytanknum + "\r\n");
//遍历敌方坦克的vector,然后根据情况保存即可//oop,定义一个属性然后通过方法得到敌人坦克的vectorfor (int i = 0; i < enemytanks.size(); i++) {enemytank enemytank = enemytanks.get(i);if (enemytank.islive) {//建议判断//保存enemy信息String record = enemytank.getX() + " " + enemytank.getY()+ "" + enemytank.getDirect();//写入到文件bw.write(record + "\r\n");}}} catch (IOException e) {e.printStackTrace();} finally {if (bw != null) {try {bw.close();} catch (IOException e) {e.printStackTrace();}}}}public static int getAllenemytanknum() {return allenemytanknum;}public static void setAllenemytanknum(int allenemytanknum) {recorder.allenemytanknum = allenemytanknum;}//当我方坦克击中敌方坦克,加坦克数量public static void addallenemytanknum() {recorder.allenemytanknum++;}
}
package tanke.game;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;}}
}
package tanke.game;public class shot implements Runnable{int x;//子弹x的坐标int y;//子弹y的坐标int direct=0;//子弹方向int speed=2;//子弹的速度boolean islve=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 (InterruptedException e) {e.printStackTrace();}//根据方向改变x,y坐标switch (direct){case 0://上y-=speed;break;case 1://右x+=speed;break;case 2://下y+=speed;break;case 3://左x-=speed;break;}//测试,输出x,y坐标System.out.println(x+"\t"+y);//当子弹移动到面板的边界就应该销魂if(!(x>=0&&x<=1000 &&y>=0&&y<=750&&islve)){System.out.println("子线程退出");islve=false;break;}}}
}
package tanke.game;import com.sun.deploy.security.SelectableSecurityManager;
//
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.File;
import java.util.Vector;//为了监听键盘事件,实现keylistener
//为了让panel不停的重绘子弹,需要将mypannel实现runnable,当做一个线程使用
public class mypanel extends JPanel implements KeyListener, Runnable {mytanke mytanke = null;//定义敌人坦克放入到vector集合中Vector<enemytank> enemytanks = new Vector<>();//定义一个存放node对象的vector恢复敌方坦克的坐标和方向Vector<node> nodes=new Vector<>();//定义一个vector,用于存放炸弹,当子弹击中坦克,加入bomb对象到bombsVector<bomb> bombs = new Vector<>();//定义三张炸弹图片,用于显示炸弹效果Image image1 = null;Image image2 = null;Image image3 = null;int enemytanksize = 3;public mypanel(String key) {//将mypanel对象的enemytanks设置给recorder的enemytank//判断记录的文件是否存在,存在就正常执行。文件不存在提示只能开启游戏File file=new File(recorder.getRecordfile());if(file.exists()){nodes=recorder.getnodesandEnemytankrec();}else {System.out.println("文件不存在只能开启游戏");key="1";}recorder.setEnemytanks(enemytanks);mytanke = new mytanke(500, 100);switch (key){case "1"://开始游戏for (int i = 0; i < enemytanksize; i++) {enemytank enemytank = new enemytank(100 * (i + 1), 0);//将enemytanks设置给enemeytankenemytank.setEnemytanks(enemytanks);enemytank.setSpeed(2);enemytank.setDirect(2);//设置方向//启动敌方的坦克线程,让他动起来new Thread(enemytank).start();//给敌方坦克加入一颗子弹shot shot = new shot(enemytank.getX() + 20, enemytank.getY() + 60, enemytank.getDirect());//加入敌方坦克vector保存多个shotenemytank.shots.add(shot);new Thread(shot).start();//启动坦克enemytanks.add(enemytank);}break;case "2"://继续上局游戏for (int i = 0; i < nodes.size(); i++) {node node=nodes.get(i);enemytank enemytank = new enemytank(node.getX(), node.getY());//将enemytanks设置给enemeytankenemytank.setEnemytanks(enemytanks);enemytank.setSpeed(2);enemytank.setDirect(node.getDirect());//设置方向//启动敌方的坦克线程,让他动起来new Thread(enemytank).start();//给敌方坦克加入一颗子弹shot shot = new shot(enemytank.getX() + 20, enemytank.getY() + 60, enemytank.getDirect());//加入敌方坦克vector保存多个shotenemytank.shots.add(shot);new Thread(shot).start();//启动坦克enemytanks.add(enemytank);}break;default:System.out.println("你的输出有误");}//c初始化敌人坦克//初始化图片对象image1 = Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/bomb_1.gif"));image2 = Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/bomb_2.gif"));image3 = Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/bomb_3.gif"));mytanke.setSpeed(2);//这里播放指定的音乐new AePlayWave("src\\111.wav").start();}//编写方法显示我方击中敌方坦克的信息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(recorder.getAllenemytanknum()+"",1080,100);}@Overridepublic void paint(Graphics g) {super.paint(g);g.fillRect(0, 0, 1000, 750);//填充矩形默认是黑色showinfo(g);//画出坦克-方封装方法if (mytanke != null && mytanke.islive) {drawtank(mytanke.getX(), mytanke.getY(), g, mytanke.getDirect(), 1);}//画出mytank射出的子弹
// if(mytanke.shot!=null&&mytanke.shot.islve!=false){g.fill3DRect(mytanke.shot.x,mytanke.shot.y,1,1,false);
// g.draw3DRect(mytanke.shot.x,mytanke.shot.y,2,2,false);
// }//将坦克子弹遍历取出for (int i = 0; i < mytanke.shots.size(); i++) {shot shot = mytanke.shots.get(i);if (shot != null && shot.islve != false) {g.fill3DRect(shot.x, shot.y, 1, 1, false);
// g.draw3DRect(mytanke.shot.x,mytanke.shot.y,2,2,false);} else {//如果该shot对象已经无效就从集合中拿掉mytanke.shots.remove(shot);}}//如果bombs集合中有对象就画出for (int i = 0; i < bombs.size(); i++) {//取出炸弹根据当前bomb对象的life值去画出对应的图片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);}//让这个炸弹生命值减少bomb.lifedown();//如果bomb life为0,就从bombs集合删除if (bomb.life == 0) {bombs.remove(bomb);}}//画出敌人坦克,遍历vectorfor (int i = 0; i < enemytanks.size(); i++) {//取出坦克enemytank enemytank = enemytanks.get(i);//判断坦克是否存活if (enemytank.islive) {//当敌方坦克是活的才画出坦克drawtank(enemytank.getX(), enemytank.getY(),g, enemytank.getDirect(), 0);//画出敌方坦克所有子弹for (int j = 0; j < enemytank.shots.size(); j++) {//取出子弹shot shot = enemytank.shots.get(j);if (shot.islve) {//子弹存活g.draw3DRect(shot.x, shot.y, 1, 1, false);} else {enemytank.shots.remove(shot);}}}}}//x坦克坐标左上角,g是画笔,direct坦克方向,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;}//接下来根据坦克方向绘制坦克//direct表示方向(0;向上,1;向右 2;向下 3;向左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 + 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;default:System.out.println("暂时没有处理");}}//如果坦克发射多颗子弹那么判断就需要取出子弹集合,与敌方坦克集合进行判断//编写方法,判断我方的子弹是否击中敌人坦克//s什么时候判断我方的子弹击中敌方坦克run方法public void hitenemytank() {//遍历我们的子弹for (int j = 0; j < mytanke.shots.size(); j++) {shot shot = mytanke.shots.get(j);if (shot != null && shot.islve == true) {//我的子弹是否活着//遍历敌人所有的坦克for (int i = 0; i < enemytanks.size(); i++) {enemytank enemytank = enemytanks.get(i);hittank(mytanke.shot, enemytank);}}}}public void hitmytank() {//编写方法,判断敌人是否击中我的坦克//遍历敌方坦克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);//判断shot是否击中我的坦克if (mytanke.islive && shot.islve) {hittank(shot, mytanke);}}}}public void hittank(shot s, tank enemytank) {//判断s击中坦克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.islve = false;enemytank.islive = false;//当我的子弹击中敌方坦克,将enemytank从vector拿掉enemytanks.remove(enemytank);//当击中坦克就加一个坦克数因为坦克有敌方和我方//所以我们进行类型判断if(enemytank instanceof enemytank){recorder.addallenemytanknum();}//创建bomb对象,加入到bomb集合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.islve = false;enemytank.islive = false;//子弹击中后拿到该坦克enemytanks.remove(enemytank);if(enemytank instanceof enemytank){recorder.addallenemytanknum();}bomb bomb = new bomb(enemytank.getX(), enemytank.getY());bombs.add(bomb);}break;}}@Overridepublic void keyTyped(KeyEvent e) {}@Overridepublic void keyPressed(KeyEvent e) {if (e.getKeyCode() == KeyEvent.VK_W) {mytanke.setDirect(0);if (mytanke.getY() > 0) {mytanke.moveup();}} else if (e.getKeyCode() == KeyEvent.VK_D) {mytanke.setDirect(1);if (mytanke.getX() + 60 < 1000) {mytanke.moveright();}} else if (e.getKeyCode() == KeyEvent.VK_A) {mytanke.setDirect(3);if (mytanke.getX() > 0) {mytanke.moveleft();}} else if (e.getKeyCode() == KeyEvent.VK_S) {mytanke.setDirect(2);if (mytanke.getY() + 60 < 750)mytanke.movedown();}
// if(e.getKeyCode()==KeyEvent.VK_J){//如果按下j子弹发射
// //判断当前坦克的子弹是否消亡,发射一颗子弹的情况
// if(mytanke.shot==null||!mytanke.shot.islve){
// mytanke.shotenemytank();}
// }if (e.getKeyCode() == KeyEvent.VK_J) {mytanke.shotenemytank();}this.repaint();//让画版重新绘制}@Overridepublic void keyReleased(KeyEvent e) {}@Overridepublic void run() {//每隔100毫秒,重绘区域,刷新绘图区域,子弹就移动while (true) {try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}//判断是否击中了敌方坦克
// if(mytanke.shot!=null &&mytanke.shot.islve==true){//我的子弹是否活着
// //遍历敌人所有的坦克
// for(int i=0;i<enemytanks.size();i++){
// enemytank enemytank=enemytanks.get(i);
// hittank(mytanke.shot,enemytank);
// }
// }hitmytank();hitenemytank();this.repaint();}}
}
package tanke.game;import javax.swing.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Scanner;public class tankgame extends JFrame {mypanel mp=null;static Scanner scanner = new Scanner(System.in);public static void main(String[] args) {tankgame tankgame = new tankgame();}public tankgame(){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);//在jfram中增加相关关闭窗口的处理this.addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {System.out.println("监听到关闭窗口");recorder.keeprecord();System.exit(0);}});}
}
package tanke.game;import javax.sound.sampled.*;
import java.io.File;
import java.io.IOException;/*** @author 韩顺平* @version 1.0*/
public class AePlayWave extends Thread {private String filename;public AePlayWave(String wavfile) { //构造器 , 指定文件filename = wavfile;}public void run() {File soundFile = new File(filename);AudioInputStream audioInputStream = null;try {audioInputStream = AudioSystem.getAudioInputStream(soundFile);} catch (Exception e1) {e1.printStackTrace();return;}AudioFormat format = audioInputStream.getFormat();SourceDataLine auline = null;DataLine.Info info = new DataLine.Info(SourceDataLine.class, format);try {auline = (SourceDataLine) AudioSystem.getLine(info);auline.open(format);} catch (Exception e) {e.printStackTrace();return;}auline.start();int nBytesRead = 0;//这是缓冲byte[] abData = new byte[512];try {while (nBytesRead != -1) {nBytesRead = audioInputStream.read(abData, 0, abData.length);if (nBytesRead >= 0)auline.write(abData, 0, nBytesRead);}} catch (IOException e) {e.printStackTrace();return;} finally {auline.drain();auline.close();}}
}
package tanke.game;
//表示敌人坦克的信息
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;}
}
java坦克大战最终代码相关推荐
- Java坦克大战(四)
这是我的坦克游戏大战的最后一版,里面添加很多新的功能.这个坦克大战的有很多不足之处,但是对于初学者来说依然是一个很好的练习项目,从中我们可以学习Java基础知识,将知识与项目结合,学习面向对象编程思想 ...
- java 坦克大战_java课程设计之坦克大战
本文实例为大家分享了java坦克大战的具体代码,供大家参考,具体内容如下 环境要求: 操作系统:Windows 10 JAVA虚拟机:JDK1.8以上 开发环境:Eclipse(4.5以上) 功能提示 ...
- java坦克大战课设报告_java课程设计之坦克大战
本文实例为大家分享了java坦克大战的具体代码,供大家参考,具体内容如下 环境要求: 操作系统:Windows 10 JAVA虚拟机:JDK1.8以上 开发环境:Eclipse(4.5以上) 功能提示 ...
- C#坦克大战网络版代码
简单C#坦克大战网络版代码 写完单机版 [url=http://blog.csdn.net/xiaoxiao108/archive/2010/12/18/6084473.aspx]http://blo ...
- java坦克大战总体功能设计_Java坦克大战设计报告.doc
Java坦克大战设计报告.doc <语言设计> 设计报告 信息工程学院专业班级:::指导老师:2011年7月22日 目录 目录2 题目一 坦克大战4 1.1题目简介4 1.2设计的内容.要 ...
- Java坦克大战,基于Swing编写很哇塞的小游戏,可以做课程设计毕业设计
Java坦克大战,基于Swing编写很哇塞的小游戏,可以做课程设计毕业设计 有图有真相 操作方法:ASDW控制移动,鼠标控制炮筒旋转,鼠标左键开枪,空格发射炮弹, 开发思路是标准的游戏开发思路,单线程 ...
- Java坦克大战游戏源码(java坦克大战)
Java坦克大战游戏源码(java坦克大战) public Swingtest002() {// 设置标题setTitle("请登陆");// 绝对布局setLayout(null ...
- 100行JS代码实现❤坦克大战js小游戏源码 HTML5坦克大战游戏代码(HTML+CSS+JavaScript )
坦克大战js小游戏源码 HTML5坦克大战游戏代码(HTML+CSS+JavaScript ) HTML5坦克大战网页小游戏,完美还原小霸王学习机效果,以坦克战斗及保卫基地为主题,属于策略型类游戏. ...
- [ java ] 坦克大战 5.0 ~ 最终完整版
坦克大战5.0 新增功能内容:(加入IO流内容) 防止敌坦克间重叠 击杀数显示 保存上局游戏进度–>两种开局方式 加入开局音乐 修复记录文件丢失后的异常 5.0版本为最终版 提示:爆炸图片需自行 ...
最新文章
- Android架构分析之Android消息处理机制(一)
- Arduino--超声波
- function checkBrowser()//判断浏览器
- PyPA Installing Packages
- 为什么都反对XML而支持使用json呢?
- 路由协议管理距离汇总
- 苹果手机扩容对手机好不好?
- 《高频交易》读书笔记
- 进阶之路(基础篇) - 020 放弃Arduino IDE,拥抱Sublime Text 3
- SQL:postgresql中,将geometry转换为geojson数据
- visio 2013安装失败正在回滚
- MapReduce----并行支持向量机(PSVM)第二部分之原始对偶内点法
- 微信小程序开发(1)—— 微信开发者工具
- CallBack函数调用
- 文字识别模型MNIST
- 安防监控流媒体服务器对接宇视摄像机配置OCX插件安装时出现Failed to register ocx, error code 14001错误问题分析
- 给大家讲个笑话,拿了个offer,因为体检查出脂肪肝,公司把我拒绝了!
- 利用gdal给影像添加金字塔
- Python读写超大文件
- idea2019之后版本 插件库打不开解决办法