JAVA课程设计坦克大战游戏(含代码)

合集下载

坦克大战源码

坦克大战源码

坦克大战源码根据韩顺平老师视频所作/**坦克大战4.0* 防重叠*/package com.TankGame5;import java.awt.*;import javax.imageio.ImageIO;import javax.swing.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.KeyEvent;import java.awt.event.KeyListener;import java.io.File;import java.io.IOException;import java.util.Vector;public class MyTankGame5 extends JFrame implements ActionListener{//提示面板MyStartPanel msp=null;//游戏面板MyPanel mp=null;//游戏菜单//开始游戏JMenuBar jmb=null;JMenu jm1=null;//开始游戏JMenuItem jmi1=null;//退出游戏JMenuItem jmi2=null;//存盘退出JMenuItem jmi3=null;//继续上一局JMenuItem jmi4=null;public static void main(String[] args) {// TODO Auto-generated method stubMyTankGame5 bn=new MyTankGame5(); }//构造函数public MyTankGame5(){//创建菜单栏选项jmb=new JMenuBar();jm1=new JMenu("游戏(G)");//创建快捷方式jm1.setMnemonic('G');jmi1=new JMenuItem("开始新游戏(N)");jmi1.setMnemonic('N');//注册监听jmi1jmi1.addActionListener(this);jmi1.setActionCommand("newgame");jmi2=new JMenuItem("退出该局游戏(Q)");jmi2.setMnemonic('Q');//注册监听jmi2jmi2.addActionListener(this);jmi2.setActionCommand("exit");jmi3=new JMenuItem("存盘退出游戏(C)");jmi3.setMnemonic('C');//注册监听jmi3jmi3.addActionListener(this);jmi3.setActionCommand("saveExit");jmi4=new JMenuItem("继续上一局(R)");jmi4.setMnemonic('R');//注册监听jmi4jmi4.addActionListener(this);jmi4.setActionCommand("continue");jm1.add(jmi1);jm1.add(jmi4);//添加的顺序就是菜单的顺序jm1.add(jmi3);jm1.add(jmi2);jmb.add(jm1);this.setJMenuBar(jmb);//先启动提示框msp=new MyStartPanel();this.add(msp);Thread t1=new Thread(msp);t1.start();// mp=new MyPanel();// this.add(mp);// //注册监听// this.addKeyListener(mp);//// //启动mp线程// Thread t2=new Thread(mp);// t2.start();//窗口大小this.setSize(MyPanel.bx1+230,MyPanel.by1+150);this.setTitle("坦克横行");ImageIcon icon = new ImageIcon("Images/yan.png");this.setIconImage(icon.getImage());this.setLocation(250,150);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.setVisible(true);}@Overridepublic void actionPerformed(ActionEvent arg0) {// TODO Auto-generated method stubif(arg0.getActionCommand().equals("newgame")){//System.out.println("英雄的到来");//创建战场mp=new MyPanel("newgame");this.add(mp);//注册监听this.addKeyListener(mp);//启动mp线程Thread t2=new Thread(mp);t2.start();this.remove(msp);this.setVisible(true);}//简单退出else if(arg0.getActionCommand().equals("exit")) {//用户点击退出//保存击毁的敌人Recorder.keepRecording();System.exit(0);}//存盘退出处理else if(arg0.getActionCommand().equals("saveExit")) {//System.out.print("111");//获取当前值Recorder.setEts(mp.ets);//保存击毁的敌人和敌人的坐标Recorder.keepRecAndEnemyTank();//退出System.exit(0);}//继续上一局else if(arg0.getActionCommand().equals("continue")) {//创建战场mp=new MyPanel("continue");this.add(mp);//注册监听this.addKeyListener(mp);//启动mp线程Thread t2=new Thread(mp);t2.start();this.remove(msp);this.setVisible(true);}}}//开始提示面板class MyStartPanel extends JPanel implements Runnable{int times=0;public void paint(Graphics g){super.paint(g);g.fillRect(0, 0, MyPanel.bx1, MyPanel.by1);if(times%2==0&&times<=30){//提示信息Font myFont=new Font("华文新魏",Font.BOLD,30);g.setFont(myFont);g.setColor(Color.YELLOW);g.drawString("READY? GO!", 100, 120);}}@Overridepublic void run() {// TODO Auto-generated method stubwhile(true){try {Thread.sleep(500);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}times++;//重画闪烁效果this.repaint();}}}//我的面板class MyPanel extends JPanel implements KeyListener,Runnable {static int h=300;//坦克初始位置static int z=200;//暂停开始开关static int power=2;//背景区域大小static int bx1=400;static int by1=300;//声音控制static int audio=0;//定义一个我的坦克Hero hero=null;//定义地方的坦克组Vector<EnemyTank> ets=new Vector<EnemyTank>();static int ensize=10;//敌人个数//定义炸弹集合Vector<Bomb> bombs=new Vector<Bomb>();//信息集合Vector<Node> nodes=new V ector<Node>();//定义2个图片,一起组成爆炸效果Image image1=null;Image image2=null;Image image3=null;//构造函数public MyPanel(String flag){//恢复记录Recorder.getRecording();//播放声音AePlayWave ap=new AePlayWave("D:\\CHEN\\ks.wav");ap.start();//构造我的坦克hero=new Hero(h,z);//构造初始敌人this.startEnemyTank(flag);//初始化图片//下面的方法第一个爆炸效果不明显image1=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/beng.png"));image2=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/beng2.png"));image3=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/beng3.png"));// try {// image1=ImageIO.read(new File("shanshui.jpg"));// image2=ImageIO.read(new File("beng2.png"));// image3=ImageIO.read(new File("beng3.png"));// } catch (Exception e) {// // TODO Auto-generated catch block// e.printStackTrace();// }}public void startEnemyTank(String flag){if(flag.equals("newgame")){//构造敌方坦克for(int i=0;i<ensize;i++){//创建敌方坦克敌人的初始位置EnemyTank et=new EnemyTank((i+1)*35,0);et.setColor(0); //???et.setDirect(2);//将MyPanel创建的坦克交给该敌人et.setEts(ets);//加入向量组ets.add(et);//给敌人添加子弹Shot s=new Shot(et.x+10,et.y+30,2);et.ss1.add(s);Thread t2=new Thread(s);t2.start();//启动敌人坦克Thread t=new Thread(et);t.start();}}else{nodes=new Recorder().getNodesAndEnemy();//构造敌方坦克for(int i=0;i<nodes.size();i++){//取出NodeNode node=nodes.get(i);//创建敌方坦克敌人的初始位置EnemyTank et=new EnemyTank(node.x,node.y);et.setColor(0); //???et.setDirect(node.direct);//将MyPanel创建的坦克交给该敌人et.setEts(ets);//加入向量组ets.add(et);//给敌人添加子弹Shot s=new Shot(et.x+10,et.y+30,2);et.ss1.add(s);Thread t2=new Thread(s);t2.start();//启动敌人坦克Thread t=new Thread(et);t.start();}}}//函数的重载,用于重复产生敌人(int)(Math.random()*270),(int)(Math.random()*360) public void startEnemyTank(){//构造敌方坦克//创建敌方坦克敌人的初始位置位置随机EnemyTank et=new EnemyTank((int)(Math.random()*370),(int)(Math.random()*270));et.setColor(0); //???et.setDirect(2);//将MyPanel创建的坦克交给该敌人et.setEts(ets);//加入向量组ets.add(et);//给敌人添加子弹Shot s=new Shot(et.x+10,et.y+30,2);et.ss1.add(s);Thread t2=new Thread(s);t2.start();//启动敌人坦克Thread t=new Thread(et);t.start();}//画提示信息的坦克public void showInfo(Graphics g){//提示信息this.drawTank(80, 330, g,0, 1);g.setColor(Color.black);g.drawString(Recorder.getEnlife()+"", 115, 350);this.drawTank(180, 330, g,0, 0);g.setColor(Color.black);g.drawString(Recorder.getMylife()+"", 220, 350);Font f=new Font("宋体",Font.BOLD,25);g.setFont(f);g.drawString("您的总成绩", 415, 40);this.drawTank(440, 90, g,0, 1);g.drawString("*", 470, 112);g.drawString(Recorder.getDeadenemy()+"", 500, 110);//判断结束提示消息//Hero输了if(Hero.counter==Hero.newlife){Font f1=new Font("宋体",Font.BOLD,40);g.setFont(f1);g.setColor(Color.RED);g.drawString("GAME OVER", 110, 150);for(int i=0;i<this.ets.size();i++){//取出各个坦克速度int esp0=ets.get(i).getSpeed();//设其速度为0ets.get(i).setSpeed(0);//取出各个坦克EnemyTank et=ets.get(i);//再取出每一颗子弹for(int j=0;j<et.ss1.size();j++){//取出各个子弹速度int ess0=et.ss1.get(j).getSpeed();//设其速度为0et.ss1.get(j).setSpeed(0);}}}//HERO 胜利!//没有敌人了就赢了else if(Recorder.getEnlife()==MyPanel.ensize-EnemyTank.newlife) {Font f1=new Font("宋体",Font.BOLD,40);g.setFont(f1);g.setColor(Color.RED);g.drawString("WINNER", 120, 150);for(int i=0;i<this.ets.size();i++){//取出各个坦克速度int esp0=ets.get(i).getSpeed();//设其速度为0ets.get(i).setSpeed(0);//取出各个坦克EnemyTank et=ets.get(i);//再取出每一颗子弹for(int j=0;j<et.ss1.size();j++){//取出各个子弹速度int ess0=et.ss1.get(j).getSpeed();//设其速度为0et.ss1.get(j).setSpeed(0);}}}}//重写paintpublic void paint(Graphics g){super.paint(g);g.fillRect(0, 0, bx1, by1); //填充背景颜色this.showInfo(g);if(hero.isLive&&Hero.counter!=Hero.newlife){//画我的坦克this.drawTank(hero.getX(), hero.getY(), g, this.hero.direct, 0);}else if(!hero.isLive&&Hero.counter<Hero.newlife){hero.isLive=true;Hero.counter++;//画我的坦克this.drawTank(hero.getX(), hero.getY(), g, this.hero.direct, 0);}//遍历Vector画出子弹&&Hero.counter!=Hero.newlifefor(int i=0;i<hero.ss.size();i++){Shot myshot=hero.ss.get(i);//画一颗子弹if(myshot!=null&&myshot.isLive){g.setColor(Color.yellow);g.fill3DRect(myshot.x, myshot.y, 3, 3, false);//g.fillOval(myshot.x-1, myshot.y, 5, 5);}if(myshot.isLive==false){//删除死亡的子弹hero.ss.remove(myshot);}}//画出炸弹for(int i=0;i<bombs.size();i++){//取出炸弹Bomb b=bombs.get(i);if(b.life>2){g.drawImage(image3, b.x, b.y, 30, 30, this);}else if(b.life>1){g.drawImage(image1, b.x, b.y, 30, 30, this);}else{g.drawImage(image2, b.x, b.y, 30, 30, this);}//播放爆炸声音AePlayWave ap1=new AePlayWave("D:\\CHEN\\bz.wav");ap1.start();//Hero输了if (Hero.counter == Hero.newlife ){//提示声音AePlayWave ap = new AePlayWave("D:\\CHEN\\gameover.wav");ap.start();audio++;}//HERO 胜利!//没有敌人了就赢了else if (Recorder.getEnlife() == MyPanel.ensize - EnemyTank.newlife && audio == 0){ //提示声音AePlayWave ap = new AePlayWave("D:\\CHEN\\winner.wav");ap.start();audio++;}//让b的生命值减小b.lifeDown();//减小到0就去掉if(b.life==0){bombs.remove(b);}}//画敌方坦克for(int i=0;i<ets.size();i++){EnemyTank et=ets.get(i);if(et.isLive){this.drawTank(et.getX(), et.getY(), g, et.getDirect(), 1);//画出敌人子弹for(int j=0;j<et.ss1.size();j++){//取出子弹Shot enemyshot=et.ss1.get(j);if(enemyshot.isLive){g.setColor(Color.RED);g.fill3DRect(enemyshot.x-1, enemyshot.y, 3, 3, false);}else{//如果敌人子弹死亡就把他从Vector中去掉et.ss1.remove(enemyshot);}}}//有敌人被消灭就在画一个,而且不能超过10个if(!et.isLive&&EnemyTank.counter<EnemyTank.newlife){et.ets.remove(et);//重载this.startEnemyTank();EnemyTank.counter++;}}}//判断子弹是否击中敌方坦克public void hitTank(Shot s,Tank et){//判断敌人坦克方向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){//创建炸弹Bomb b=new Bomb(et.x, et.y);//放入Vectorbombs.add(b);//击中//子弹死亡s.isLive=false;//敌人死亡et.isLive=false;if(et!=hero){//敌人数目减少Recorder.reduceEnlife();//记录我的战绩Recorder.deadenemy();}//减少我的生命else if(et==hero){Recorder.reduceMylife();}}break;case 1:case 3:if(s.x>et.x&&s.x<et.x+30&&s.y>et.y&&s.y<et.y+20){//创建炸弹Bomb b=new Bomb(et.x, et.y);//放入Vectorbombs.add(b);//击中//子弹死亡s.isLive=false;//敌人死亡et.isLive=false;if(et!=hero){//敌人数目减少Recorder.reduceEnlife();//记录我的战绩Recorder.deadenemy();}else if(et==hero){Recorder.reduceMylife();}}break;}}//判断敌人是否击中我public void hitMe(){//取出敌人的坦克for(int i=0;i<this.ets.size();i++){//取出坦克EnemyTank et=ets.get(i);//取出每一颗子弹for(int j=0;j<et.ss1.size();j++){//取出子弹Shot enemyshot=et.ss1.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){this.hitTank(myshot, et);}}}// //播放爆炸声音//// AePlayWave ap1=new AePlayWave("D:\\CHEN\\fs.wav");// ap1.start();}}//画坦克的函数public void drawTank(int x,int y,Graphics g, int direct, int type)//direct方向,type类型{switch(type){case 1:g.setColor(Color.CY AN);break;case 0:g.setColor(Color.yellow);break;}//判断方向switch(direct){//向上case 0://画上方向的坦克有五个部件构成//1.左边的矩形g.fill3DRect(x, y, 5, 30,false);//2.y右边的矩形g.fill3DRect(x+15, y, 5, 30,false);//中间矩形g.fill3DRect(x+5, y+6, 10, 19,false);//g.fillRect(x+5, y+6, 10, 19);//中间圆g.setColor(Color.GRAY);g.fillOval(x+5, y+9, 10, 10);//炮筒g.setColor(Color.DARK_GRAY);g.fill3DRect(x+10, y-4, 2, 21,false);g.setColor(Color.blue);g.fill3DRect(x+8, y-8, 5, 3,false);break;case 1://画向右的坦克g.fill3DRect(x, y, 30, 5,false);//上轮g.fill3DRect(x, y+15, 30, 5,false);//下轮g.fill3DRect(x+5, y+6, 19, 10,false);//中间g.setColor(Color.GRAY);g.fillOval(x+9, y+5, 10, 10);//中间圆g.setColor(Color.DARK_GRAY);g.fill3DRect(x+12, y+9, 21, 2,false);//炮筒g.setColor(Color.blue);g.fill3DRect(x+33, y+8, 3, 5,false);break;case 2://向下//1.左边的矩形g.fill3DRect(x, y, 5, 30,false);//hero.getX(),hero.getY()用x y换了//2.y右边的矩形g.fill3DRect(x+15, y, 5, 30,false);//中间矩形g.fill3DRect(x+5, y+4, 10, 19,false);//g.fillRect(x+5, y+6, 10, 19);//中间圆g.setColor(Color.GRAY);g.fillOval(x+5, y+9, 10, 10);//炮筒g.setColor(Color.DARK_GRAY);g.fill3DRect(x+10, y+14, 2, 20,false);g.setColor(Color.blue);g.fill3DRect(x+8, y+33, 5, 3,false);break;case 3://向左g.fill3DRect(x, y, 30, 5,false);//上轮g.fill3DRect(x, y+15, 30, 5,false);//下轮g.fill3DRect(x+7, y+6, 19, 10,false);//中间g.setColor(Color.GRAY);g.fillOval(x+9, y+5, 10, 10);//中间圆g.setColor(Color.DARK_GRAY);g.fill3DRect(x-6, y+9, 21, 2,false);//炮筒g.setColor(Color.blue);g.fill3DRect(x-7, y+8, 3, 5,false);break;}}//键按下处理//a表示向左,s向下,d向右,w向上;或者用方向键也行public void keyPressed(KeyEvent arg0) {// TODO Auto-generated method stubif(arg0.getKeyCode()==KeyEvent.VK_W||arg0.getKeyCode()==KeyEvent.VK_UP) {//System.out.println("ok");//设置我的坦克方向向上if(hero.isLive){this.hero.setDirect(0);this.hero.moveUp();}}else if (arg0.getKeyCode()==KeyEvent.VK_D||arg0.getKeyCode()==KeyEvent.VK_RIGHT){//向右if(hero.isLive){this.hero.setDirect(1);this.hero.moveRight();}}else if (arg0.getKeyCode()==KeyEvent.VK_S||arg0.getKeyCode()==KeyEvent.VK_DOWN){//向下if(hero.isLive){this.hero.setDirect(2);this.hero.moveDown();}}else if (arg0.getKeyCode()==KeyEvent.VK_A||arg0.getKeyCode()==KeyEvent.VK_LEFT){//向左if(hero.isLive){this.hero.setDirect(3);this.hero.moveLeft();}}//判断开火空格键发射if(arg0.getKeyCode()==KeyEvent.VK_SPACE){//只能连发5发子弹if(hero.ss.size()<=4&&hero.isLive){//开火this.hero.shotEnemy();}}// //暂停/继续游戏// if(arg0.getKeyCode()==KeyEvent.VK_P)// {// for(int i=0;i<this.ets.size();i++)// {// if(power%2==0)// {// //取出各个坦克速度// int esp0=ets.get(i).getSpeed();// //记住该速度// tempspeed=esp0;// //设其速度为0// ets.get(i).setSpeed(0);////// //取出各个坦克// EnemyTank et=ets.get(i);// //再取出每一颗子弹// for(int j=0;j<et.ss1.size();j++)// {// //取出各个子弹速度// int ess0=et.ss1.get(j).getSpeed(); // //记住该速度// int ess1=ess0;// //设其速度为0// et.ss1.get(j).setSpeed(0);// }//// }// else// {// ets.get(i).setSpeed(esp1);//// //et.ss1.get(j).setSpeed(0);// }//// }// power++;// }////调用repaint重画this.repaint();}@Overridepublic void keyReleased(KeyEvent arg0) {// TODO Auto-generated method stub}@Overridepublic void keyTyped(KeyEvent arg0) {// TODO Auto-generated method stub}@Overridepublic void run() {// TODO Auto-generated method stub//每100毫秒重绘while(true){try {Thread.sleep(100);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}//判断是否添加新子弹for(int i=0;i<ets.size();i++){EnemyTank et=ets.get(i);if(et.isLive){//ets.size()为敌人可以连发子弹的数目if(et.ss1.size()<2){Shot s=null;//没有子弹,添加switch(et.direct){case 0:s=new Shot(et.x+9,et.y-10,0);et.ss1.add(s);break;case 1:s=new Shot(et.x+35,et.y+9,1);et.ss1.add(s);break;case 2:s=new Shot(et.x+10,et.y+35,2);et.ss1.add(s);break;case 3:s=new Shot(et.x-9,et.y+9,3);et.ss1.add(s);break;}//创建线程对象Thread t=new Thread(s);//启动t.start();}}}this.hitenemytank();this.hitMe();//重绘this.repaint();}}}package com.TankGame5;import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.io.*;import java.util.Vector;import javax.sound.sampled.*;import javax.swing.JPanel;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 enlife=20;private static int mylife=10;private static int deadenemy=0;private static FileWriter fw=null;private static BufferedWriter bw=null;private static FileReader fr=null;private static BufferedReader br=null;private static Vector<EnemyTank> ets=new Vector<EnemyTank>();//从文件恢复记录static Vector<Node> nodes=new Vector<Node>();//完成读取public Vector<Node> getNodesAndEnemy(){try {//创建fr=new FileReader("d:\\chen\\AllRecording.txt");br=new BufferedReader(fr);String n="";//先读取第一行n=br.readLine();deadenemy=Integer.parseInt(n);//用split分割从第二行开始取while((n=br.readLine())!=null){//字符串str中从第一个字符起,//每遇到一个空格则切割为一个元素,//放入[]xyd数组中String []xyd=n.split(" ");//这里的空格数与keepRecAndEnemyTank()中//写入(String record=et.x+" "+et.y+" "+et.direct;)//!!!!!!!!!!!!!! //的空格数要对应,否则会报错!Node node1=new Node(Integer.parseInt(xyd[0]),Integer.parseInt(xyd[1]),Integer.parseInt(xyd[2]));nodes.add(node1);}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}finally{//关闭文件//谁先开,谁后关!try {br.close();fr.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}return nodes;}public static Vector<EnemyTank> getEts() {return ets;}public static void setEts(Vector<EnemyTank> ets) { Recorder.ets = ets;}//保存击毁敌人的数目和敌人坐标,存盘退出public static void keepRecAndEnemyTank(){try {//创建fw=new FileWriter("d:\\chen\\AllRecording.txt");bw=new BufferedWriter(fw);bw.write(deadenemy+"\r\n");//保存当前敌人的数目和坐标for(int i=0;i<ets.size();i++){//取出第一个坦克EnemyTank et=ets.get(i);//保存活的if(et.isLive){String record=et.x+" "+et.y+" "+et.direct;//写入bw.write(record+"\r\n");}}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}finally{//关闭文件//谁先开,谁后关!try {bw.close();fw.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}//保存击毁的敌人数目public static void keepRecording(){try {//创建fw=new FileWriter("d:\\chen\\TankRecording.txt");bw=new BufferedWriter(fw);bw.write(deadenemy+"\r\n");} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}finally{//关闭文件//谁先开,谁后关!try {bw.close();fw.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}//读取出上一局击毁的敌人数目public static void getRecording(){try {//创建fr=new FileReader("d:\\chen\\TankRecording.txt");br=new BufferedReader(fr);String n=br.readLine();deadenemy=Integer.parseInt(n);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}finally{//关闭文件//谁先开,谁后关!try {br.close();fr.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}public static int getEnlife() {return enlife;}public static void setEnlife(int enlife) {Recorder.enlife = enlife;}public static int getMylife() {return mylife;}public static void setMylife(int mylife) {Recorder.mylife = mylife;}//减少数量public static void reduceMylife() {Recorder.mylife--;}public static void reduceEnlife() {Recorder.enlife--;}public static void deadenemy() {Recorder.deadenemy++;}public static int getDeadenemy() {return deadenemy;}}class Tank{//坦克的横坐标int x=0;//纵坐标int y=0;//暂停速度int tempspeed;public int getTempspeed() {return tempspeed;}public void setTempspeed(int tempspeed) { this.tempspeed = tempspeed;}//颜色int color;boolean isLive=true;public boolean isLive() {return isLive;}public void setLive(boolean isLive) { this.isLive = isLive;}public int getColor() {return color;}public void setColor(int color) {this.color = color;}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 Tank (int x,int y){this.x=x;this.y=y;}//坦克方向//0上,1右,2下,3左int direct=0;public int getDirect() {return direct;}public void setDirect(int direct) {this.direct = direct;}//坦克的速度int speed=3;public int getSpeed() {return speed;}public void setSpeed(int speed) {this.speed = speed;}}//敌方坦克class EnemyTank extends Tank implements Runnable {//设敌人可以复活10次static int newlife=10;//计数器static int counter=0;//让坦克随机产生步数//每次走多少步int steps=(int)(Math.random()*50+10);int sleeptime=200; //睡眠时间//定义一个向量存放敌人子弹Vector<Shot> ss1=new Vector<Shot>();//在敌人创建和子弹死亡后在创建子弹public EnemyTank(int x,int y){super(x,y);}//定义一个向量,访问MyPanel的所有敌人坦克Vector<EnemyTank> ets=new Vector<EnemyTank>();//得到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>=et.x&&this.x<=et.x+30&&this.y>=et.y&&this.y<=et.y+20){return true;}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;}}}}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;}public void run() {// TODO Auto-generated method stubwhile(true){switch(this.direct){case 0://继续让他再走几步for(int i=0;i<steps;i++){if(y>0&&!isTouchotherEnemy()){y-=speed;}// //撞到墙或者队友就转弯||isTouchotherEnemy()// else if(y<=0)// {// //让坦克变向// this.direct=(direct+1)%4;// }try {Thread.sleep(sleeptime);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}break;case 1://继续让他再走几步for(int i=0;i<steps;i++){if(x<MyPanel.bx1-20&&!isTouchotherEnemy()){x+=speed;}// //撞到墙或者队友就转弯// else if(x>=MyPanel.bx1-20)// {// //让坦克变向// this.direct=(direct+1)%4;// }try {Thread.sleep(sleeptime);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}break;case 2://继续让他再走几步for(int i=0;i<steps;i++){if(y<MyPanel.by1-20&&!isTouchotherEnemy()){y+=speed;}//撞到墙或者队友就转弯// else if(y>=MyPanel.by1-20)// {// //让坦克变向// this.direct=(direct+1)%4;// }。

韩顺平java坦克大战1.0版本_源代码

韩顺平java坦克大战1.0版本_源代码

/**画坦克1。

0*/import java.awt.Color;import java.awt.Graphics;import java.awt.event。

KeyEvent;import java.awt。

event。

KeyListener;import java。

awt。

event.MouseEvent;import java。

awt。

event。

MouseListener;import java。

awt。

event.MouseMotionListener;import java.awt。

event。

WindowEvent;import java.awt。

event。

WindowListener;import javax。

swing。

JFrame;import javax.swing。

JPanel;public class MyTankGame extends JFrame{MyPanel mp=null;public static void main(String[] args){MyTankGame mtk=new MyTankGame();}public MyTankGame(){mp=new MyPanel();this.add(mp);//把面板加入窗体//注册监听this。

addMouseListener(mp);this.addKeyListener(mp);this。

addMouseMotionListener(mp);this.addWindowListener(mp);this.setTitle(”坦克大战");//窗体标题this。

setSize(600,400);//大小,宽,高(像素)this。

setLocation(300,300);//显示位置。

左边距,上边距//禁止用户改变窗口大小this。

setResizable(false);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.setVisible(true);//显示}}//我的面板class MyPanel extends JPanel implements WindowListener,MouseListener,MouseMotionListener,KeyListener{//定义一个我的坦克Hero hero=null;Diren diren=null;public MyPanel(){hero=new Hero(300,200);diren=new Diren(100,0);//diren。

JAVA课程设计 坦克大战

JAVA课程设计 坦克大战

得分显示:在游戏 界面实时显示得分 情况,方便玩家了 解游戏进度
减少内存占用:优 化数据结构,减少 不必要的内存分配
提高渲染效率: 优化渲染算法, 减少渲染时间
优化网络通信:减 少网络延迟,提高 网络通信效率
优化AI算法:提高 AI算法的效率和准 确性,提高游戏体 验
界面布局:合 理规划界面布 局,提高用户
玩家需要控制坦克,消灭敌 人,保护自己的基地
游戏支持多人在线对战,玩 家可以与朋友一起挑战
玩家控制 坦克,在 战场上与 敌人战斗
坦克可以 发射炮弹, 摧毁敌人 或障碍物
玩家需要 躲避敌人 的攻击, 保护自己 的坦克
游戏有各 种关卡, 难度逐渐 增加
玩家可以 通过升级 坦克,提 高战斗力
游戏支持 多人在线 对战,增 加游戏乐 趣
生命值耗尽:当 玩家的生命值降 至0时,游戏结束
时间耗尽:当游 戏时间耗尽时, 游戏结束
胜利条件:当玩 家达到胜利条件 时,游戏结束
失败条件:当玩 家达到失败条件 时,游戏结束
得分规则:击毁敌 方坦克得分,被敌 方坦克击毁扣分
得分方式:根据击 毁敌方坦克的数量 和难度计算得分
得分限制:得分上 限为1000分,达到 上限后不再增加得 分
,a click to unlimited possibilities
汇报人:
01
02
03
04
05
06
游戏类型:坦克大战
游戏背景:二战时期
游戏目标:摧毁敌方坦克,保 护自己的基地
游戏玩法:玩家控制坦克,通 过射击和躲避来消灭敌方坦克
游戏包含多个关卡,每个关 卡有不同的难度和挑战
设计一款坦克大战游戏
游戏界面:包括 菜单、地图、角 色、道具等元素

JAVA课程设计坦克大战含代码

JAVA课程设计坦克大战含代码

游戏结束判断
生命值耗尽:当坦克的生命值降至0时,游戏结束 游戏时间结束:当游戏时间达到预设值时,游戏结束 胜利条件达成:当一方达到预设的胜利条件时,游戏结束 玩家主动退出:当玩家主动选择退出游戏时,游戏结束
游戏得分计算
得分规则:击毁敌 方坦克、保护己方 坦克、完成特定任 务等
得分方式:根据击 毁敌方坦克的数量、 保护己方坦克的数 量、完成任务的难 度等计算得分
得分显示:在游戏 界面实时显示得分 情况,方便玩家了 解游戏进度
得分记录:游戏结 束后,记录玩家的 分情况,方便玩 家查看历史成绩
游戏优化与扩展
游戏性能优化
优化算法: 使用更高 效的算法, 如动态规 划、贪心 算法等
减少内存 占用:优 化数据结 构,减少 不必要的 内存占用
优化渲染: 使用更高 效的渲染 技术,如 OpenGL、 DirectX 等
优化网络 传输:使 用更高效 的网络传 输协议, 如TCP、 UDP等
优化AI: 使用更高 效的AI算 法,如神 经网络、 遗传算法 等
优化资源 管理:合 理分配系 统资源, 避免资源 浪费
游戏扩展功能实现
增加新的坦克类型:如重型坦克、轻 型坦克等
增加新的地图:如沙漠地图、雪地地 图等
增加新的游戏模式:如团队模式、生 存模式等
音效类型:背景音乐、战斗音效、 胜利音效等
音效处理:音量调节、音效混合、 音效剪辑等
添加标题
添加标题
添加标题
添加标题
音效来源:自行创作、购买版权、 网络下载等
音效与游戏场景的结合:根据游戏 场景选择合适的音效,增强游戏体 验
游戏实体设计
坦克类设计
坦克属性:生命值、攻击 力、防御力、速度等

java坦克大战源代码

java坦克大战源代码

package com.cwj.tankGame;import javax.sound.sampled.*;import java.io*;import java.awt.*;import java.io.IOException;import java.util.*;import javax.swing,*;import javax.imageio.ImageIO;import javax.swing.*;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; info = new (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();}}}class Bomb{int x;int y;int lifeTime = 10;boolean isLive=true;public Bomb(int x,int y){this.x=x;this.y=y;}public void lifeDown(){if(lifeTime>0){lifeTime--;}else{this.isLive=false;}}}class EnemyTank extends Tank implements Runnable{int n=1;//敌方坦克转弯n次发射一颗子弹int MaxShot = 10;int runDistance = 10;//变一次方向前进的距离//定义一个向量可以访问MyPanel上所有地方坦克Vector<EnemyTank> ets =new Vector<EnemyTank>();Vector<Shot> ss = new Vector<Shot>();public void setEts(Vector<EnemyTank> v){this.ets=v;}public int abs(int x){if(x>0)return x;elsereturn -x;}public boolean isTouchOther(){switch(this.direction){case 0://上for(int i=0;i<ets.size();i++){EnemyTank t = ets.get(i);if(t!=this)//不是自己这辆坦克{if(abs(this.x-t.x)<=40&&this.y>t.y&&this.y-t.y<=40) {return true;}}}break;case 2://下for(int i=0;i<ets.size();i++){EnemyTank t = ets.get(i);if(t!=this)//不是自己这辆坦克{if(abs(this.x-t.x)<=40&&t.y>this.y&&t.y-this.y<=40) {return true;}}}break;case 1://左for(int i=0;i<ets.size();i++){EnemyTank t = ets.get(i);if(t!=this)//不是自己这辆坦克{if(abs(this.y-t.y)<=40&&this.x>t.x&&this.x-t.x<=40) {return true;}}}break;case 3://右for(int i=0;i<ets.size();i++){EnemyTank t = ets.get(i);if(t!=this)//不是自己这辆坦克{if(abs(this.y-t.y)<=40&&this.x<t.x&&t.x-this.x<=40) {return true;}}}break;}return false;}public EnemyTank(int x,int y){super(x,y);}int time=0;public void sleep(){try{Thread.sleep(50);}catch(Exception e){e.printStackTrace();}}public void run() {while(true){switch(direction){case 0:for(int i =0;i<this.runDistance;i++){if(y>20&&!this.isTouchOther())y-=speed;this.sleep();}break; case 1:for(int i =0;i<this.runDistance;i++){if(x>20&&!this.isTouchOther())x-=speed;this.sleep();}break; case 2:for(int i =0;i<this.runDistance;i++){if(y<580&&!this.isTouchOther())y+=speed;this.sleep();}break; case 3:for(int i =0;i<this.runDistance;i++){if(x<780&&!this.isTouchOther())x+=speed;this.sleep();}break; }this.direction=(int)(Math.random()*4);if(this.isLive==false){break;}else{time++;if(time%n==0)if(ss.size()<MaxShot){Shot s = new Shot(x,y);s.setDirection(direction);ss.add(s);Thread t = new Thread(s);t.start();}}}}}class MyTank extends Tank{int MAXSHOT=20;public int getMAXSHOT() {return MAXSHOT;}public void setMAXSHOT(int mAXSHOT) { MAXSHOT = mAXSHOT;}Shot shot=null;Vector<Shot> ss = new Vector<Shot>(); public MyTank(int x,int y){super(x,y);}public void fire(){if(this.isLive==true){shot = new Shot(x,y);ss.add(shot);Thread t = new Thread(shot);t.start();shot.setDirection(this.direction);}}public void moveUp(){if(y>20)y-=speed;}public void moveLeft(){if(x>20)x-=speed;}public void moveDown(){if(y<580)y+=speed;}public void moveRight(){if(x<780)x+=speed;}class Node {int x;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;}int y;int direction;public Node(int x,int y){this.x=x;this.y=y;}}class Record {//记录每关有多少敌人private static int etNum=20;private static int sum = 0;private static FileWriter fw=null;private static BufferedWriter bw = null; private static FileReader fr = null; private static BufferedReader br = null; private static Vector<Node> nodes=null; public static Vector<Node> getNodes() { return nodes;public static void setNodes(Vector<Node> nodes) { Record.nodes = nodes;}public static Vector<EnemyTank> ets = null;public static Vector<EnemyTank> getEts() {return ets;}public static void setEts(Vector<EnemyTank> ets) { Record.ets = ets;}public static void restoreRecord(){try {nodes = new Vector<Node>();File file = new File("e:\\tankGame.txt");if(!file.isDirectory()){if(file.createNewFile())System.out.println("成功创建文件e:\\tankGame.txt"); }fr = new FileReader("e:\\tankGame.txt");br = new BufferedReader(fr);String strSum = br.readLine();if(strSum!=null)sum = Integer.parseInt(strSum);else return;String str="";while((str=br.readLine())!=null){String []xyd=str.split(" ");int x,y,direction;x = Integer.parseInt(xyd[0]);y = Integer.parseInt(xyd[1]);direction = Integer.parseInt(xyd[2]);Node node = new Node(x,y);node.setDirection(direction);nodes.add(node);}for(int i=0;i<nodes.size();i++){System.out.println(nodes.get(i).x+" "+nodes.get(i).y+" "+nodes.get(i).direction); }} catch (Exception e) {e.printStackTrace();}finally{try {if(br!=null)br.close();if(fr!=null)fr.close();} catch (IOException e) {e.printStackTrace();}}}public static void keepRecord(){try {fw = new FileWriter("e:\\tankGame.txt");bw = new BufferedWriter(fw);bw.write(sum+"\r\n");for(int i =0;i<ets.size();i++){EnemyTank et = ets.get(i);if(et.isLive==true){String record = et.x+" "+et.y+" "+et.getDirection()+"\r\n";bw.write(record);}}} catch (Exception e) {e.printStackTrace();}finally{try {if(bw!=null)bw.close();if(fw!=null)fw.close();} catch (IOException e) {e.printStackTrace();}}}public static int getSum() {return sum;}public static void setSum(int sum) { Record.sum = sum;}public static void addSum(){sum++;}public static int getEtNum() {return etNum;}public static void setEtNum(int etNum) { Record.etNum = etNum;}public static int getMyLife() {return myLife;}public static void setMyLife(int myLise) { Record.myLife = myLise;}//生命数private static int myLife=3;public static void reduceEtNum(){etNum--;}public static void reduceMyLife(){myLife--;}}class Shot implements Runnable{int x;int speed=5;int y;int direction;boolean isLive=true;public void run(){while(true){try{Thread.sleep(100);}catch(Exception e){e.printStackTrace();}switch(this.direction){case 0:y-=speed;break;case 1:x-=speed;break;case 2:y+=speed;break;case 3:x+=speed;break;}if(x<0||x>800||y<0||y>600){this.isLive=false;break;}}//while}public int getSpeed() {return speed;}public void setSpeed(int speed) { this.speed = speed;}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 Shot(int x,int y){this.x=x;this.y=y;}}class Tank{boolean isLive=true;int x=0;int y=0;int color;public int getColor() {return color;}public void setColor(int color) {this.color = color;}int speed=3;int direction=0;//0上1左2下3右public int getSpeed() {return speed;}public void setSpeed(int speed) { this.speed = speed;}public int getDirection() {return direction;}public void setDirection(int direction) { this.direction = 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 Tank(int x,int y){this.x=x;this.y=y;}}public class TankGame extends JFrame implements ActionListener{ MyPanel mp=null;MyStartPanel msp = null;JMenuBar jmb =null;JMenu jm1=null;JMenuItem jmi11 =null;JMenuItem jmi12 = null;JMenuItem jmi13 = null;JMenuItem jmi14 = null;public static void main(String[]args){TankGame t = new TankGame();}public TankGame(){/*mp=new MyPanel();this.add(mp);Thread t = new Thread(mp);t.start();this.addKeyListener(mp);*/jmb = new JMenuBar();jm1 = new JMenu("游戏(G)");jm1.setMnemonic('G');jmi11 = new JMenuItem("开始游戏(N)");jmi11.addActionListener(this);jmi11.setActionCommand("newgame");jmi11.setMnemonic('N');jmi12 = new JMenuItem("退出游戏(E)");jmi12.addActionListener(this);jmi12.setActionCommand("exitgame");jmi12.setMnemonic('E');jmi13 = new JMenuItem("退出并保存(O)");jmi13.addActionListener(this);jmi13.setActionCommand("exitandsave");jmi13.setMnemonic('O');jmi14 = new JMenuItem("继续游戏(S)");jmi14.addActionListener(this);jmi14.setActionCommand("continue");jmi14.setMnemonic('S');jm1.add(jmi11);jm1.add(jmi13);jm1.add(jmi14);jm1.add(jmi12);jmb.add(jm1);this.setJMenuBar(jmb);msp = new MyStartPanel();Thread t = new Thread(msp);t.start();this.add(msp);this.setSize(900, 700);this.setLocationRelativeTo(null);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.setTitle("坦克大战欢迎加qq1036624975交流学习编程爱好者学习交流群294787264");this.setVisible(true);}public void actionPerformed(ActionEvent e) {if(e.getActionCommand().equals("newgame")){if(mp!=null)this.remove(mp);mp = new MyPanel("newGame");Thread t = new Thread(mp);t.start();this.remove(msp);this.add(mp);this.addKeyListener(mp);this.setVisible(true);AePlayWave apw = new AePlayWave("e://tank.wav"); new Thread(apw).start();}else if(e.getActionCommand().equals("exitgame")){System.exit(0);}else if(e.getActionCommand().equals("exitandsave")) {Record.setEts(mp.et);Record.keepRecord();System.exit(0);}else if(e.getActionCommand().equals("continue")){Record.restoreRecord();if(mp!=null)this.remove(mp);mp = new MyPanel("oldGame");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 count=0;public void paint(Graphics g){super.paint(g);g.fillRect(0, 0, 800, 600);if(count%6==0)g.setColor(Color.YELLOW);else if(count%6==1)g.setColor(Color.BLUE);else if(count%6==2)g.setColor(Color.CYAN);else if(count%6==3)g.setColor(Color.GREEN);else if(count%6==4)g.setColor(Color.ORANGE);else if(count%6==5)g.setColor(Color.PINK);g.setFont(new Font("黑体",Font.PLAIN,100));g.drawString("第一关",250,300);g.setFont(new Font("黑体",Font.PLAIN,20));g.drawString("w上s下a左d右j发射子弹", 0, 20);if(count>20000)count=0;}public void run() {while(true){try {Thread.sleep(300);} catch (Exception e) {e.printStackTrace();}count++;this.repaint();}}}class MyPanel extends JPanel implements KeyListener,Runnable {Image bomb1=null;Image bomb2=null;Image bomb3=null;MyTank mt = null;//我的坦克Vector<EnemyTank>et=new Vector<EnemyTank>();Vector<Bomb>bombs = new Vector<Bomb>();Vector<Node>nodes =null;int enemyTankNum=20;public MyPanel(String ifNew){Record.restoreRecord();mt = new MyTank(300,570);mt.setSpeed(7);mt.setColor(0);//初始化敌人的坦克if(ifNew.equals("newGame")){for(int i =0;i<enemyTankNum;i++){EnemyTank tank = null;if(i<10){tank=new EnemyTank((i+1)*70,20);}else{tank = new EnemyTank(((i-9))*70,80);}tank.setDirection(2);Thread t = new Thread(tank);t.start();Shot s = new Shot(tank.x,tank.y);s.setDirection(tank.direction);new Thread(s).start();tank.ss.add(s);tank.setColor(1);et.add(tank);tank.setEts(et);}}else if(ifNew.equals("oldGame")){nodes=Record.getNodes();for(int i =0;i<nodes.size();i++){Node node = nodes.get(i);EnemyTank tank = null;tank = new EnemyTank(node.getX(),node.getY()); tank.setDirection(node.getDirection());Thread t = new Thread(tank);t.start();Shot s = new Shot(tank.x,tank.y);s.setDirection(tank.direction);new Thread(s).start();tank.ss.add(s);tank.setColor(1);et.add(tank);tank.setEts(et);}}//三张图片,组成一颗炸弹try {bomb1=ImageIO.read(new File("image/bomb_1.gif"));bomb2=ImageIO.read(new File("image/bomb_2.gif"));bomb3=ImageIO.read(new File("image/bomb_3.gif"));} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}//以下方式加载图片第一次爆炸效果不明显/*bomb1=Toolkit.getDefaultToolkit().getImage("image/bomb_1.gif"); bomb2=Toolkit.getDefaultToolkit().getImage("image/bomb_2.gif"); bomb3=Toolkit.getDefaultToolkit().getImage("image/bomb_3.gif");*/ }public void showMessage(Graphics g){this.paintTank(825, 20, g, 0, 1);this.paintTank(825, 80, g, 0, 0);g.setColor(Color.BLACK);g.drawString("x"+Record.getEtNum(),850,20);g.drawString("x"+Record.getMyLife(), 850, 80);g.setFont(new Font("华文彩云",Font.BOLD,20));g.drawString("总成绩", 2, 620);g.drawString(""+Record.getSum(), 76, 620);}public void paint(Graphics g){super.paint(g);g.fillRect(0, 0, 800, 600);this.showMessage(g);if(mt.isLive==true)paintTank(mt.getX(),mt.getY(),g,mt.getDirection(),mt.getColor());//画敌人坦克for(int i=0;i<et.size();i++){EnemyTank t = et.get(i);if(t.isLive==true){paintTank(t.getX(),t.getY(),g,t.getDirection(),t.getColor());for(int j = 0;j<t.ss.size();j++)//画子弹{if(s.isLive==true){g.setColor(Color.RED);g.fillRect(s.getX(), s.getY(), 5,5);}else{t.ss.remove(s);}}}else{et.remove(t);}}//爆炸效果for(int i=0;i<bombs.size();i++){Bomb b = bombs.get(i);if(b.lifeTime>6){g.drawImage(bomb1,b.x,b.y,40,40,this);}else if(b.lifeTime>3){g.drawImage(bomb2,b.x,b.y,40,40,this);}else{g.drawImage(bomb3,b.x,b.y,40,40,this);}b.lifeDown();if(b.lifeTime==0){bombs.remove(b);}}for(int i =0;i<mt.ss.size();i++)//我的画子弹{Shot s = mt.ss.get(i);if(s!=null&&s.isLive==true){g.setColor(Color.YELLOW);g.fillRect(s.getX(), s.getY(),5, 5);}if(s.isLive==false) //子弹清空,才能打下一发子弹{}}}//被攻击public void hitMyTank(){for(int i=0;i<et.size();i++){EnemyTank e=et.get(i);for(int j=0;j<e.ss.size();j++){Shot enemyShot = e.ss.get(j); boolean res=false;res = this.isHitTank(enemyShot, mt); if(res==true)Record.reduceMyLife();}}}//攻击敌方坦克public void hitEnemyTank(){for(int i=0;i<mt.ss.size();i++){Shot shot = mt.ss.get(i);if(shot.isLive==true){for(int j =0;j<et.size();j++){EnemyTank etank = et.get(j);if(etank.isLive==true){boolean res=false;res=this.isHitTank(shot, etank);if(res==true){Record.reduceEtNum();Record.addSum();}}}}}}//判断子弹是否击中坦克public boolean isHitTank(Shot shot,Tank etank){boolean res=false;if(shot.x>etank.x-20&&shot.x<etank.x+20&&shot.y>etank.y-20&&shot.y<etank.y+20&&et ank.isLive==true)//子弹击中{shot.isLive=false;etank.isLive=false;Bomb bomb = new Bomb(etank.getX()-20,etank.getY()-20);bombs.add(bomb);res = true;}return res;}public void paintTank(int x,int y,Graphics g,int direction,int type){switch(type)//判断坦克类型{case 0:g.setColor(Color.yellow);//自己的break;case 1:g.setColor(Color.RED);//敌人的break;}switch(direction){case 0://上g.fillRect(x-20, y-20, 40, 40);g.fill3DRect(x-5, y-20, 10, 20,false);break;case 1://左g.fillRect(x-20, y-20, 40, 40);g.fill3DRect(x-20, y-5, 20, 10,false);break;case 2://下g.fillRect(x-20, y-20, 40, 40);g.fill3DRect(x-5, y, 10, 20,false);break;case 3://右g.fillRect(x-20, y-20, 40, 40);g.fill3DRect(x, y-5, 20, 10,false);break;}}@Overridepublic void keyTyped(KeyEvent e) {// TODO Auto-generated method stub}@Overridepublic void keyPressed(KeyEvent e) {// TODO Auto-generated method stubif(e.getKeyCode()==KeyEvent.VK_J)//发射子弹{if(this.mt.ss.size()<this.mt.getMAXSHOT()) {this.mt.fire();}}if(e.getKeyCode()==KeyEvent.VK_W){mt.setDirection(0);this.mt.moveUp();}else if(e.getKeyCode()==KeyEvent.VK_A) {mt.setDirection(1);this.mt.moveLeft();}else if(e.getKeyCode()==KeyEvent.VK_S) {mt.setDirection(2);this.mt.moveDown();}else if(e.getKeyCode()==KeyEvent.VK_D) {mt.setDirection(3);this.mt.moveRight();}this.repaint();}@Overridepublic void keyReleased(KeyEvent e) {// TODO Auto-generated method stub}@Overridepublic void run() {// TODO Auto-generated method stubwhile(true){try {Thread.sleep(50);//50毫秒重绘一次} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}this.hitEnemyTank();//判断己方坦克是否击中敌方坦克this.hitMyTank();//判断敌方坦克是否击中己方坦克this.repaint();}}}。

坦克大战程序代码

坦克大战程序代码

坦克大战程序代码import java.awt.* ;import javax.swing.* ;import java.awt.event.*;import java.util.EventListener;class f extends JFrame {f(String title) {this.setTitle(title) ;this.setSize(608 , 630) ;this.setLocation(300 , 100) ;this.setBackground(Color.BLACK) ;MyTank mp = new MyTank() ;this.add(mp) ;this.addKeyListener(mp) ;new Thread(mp).start() ;}public static void main(String[] args) {f h = new f("坦克大战(版本1.0)") ;h.setVisible(true) ;}}//主战坦克class MyTank extends JPanel implements KeyListener , Runnable {int x = 280, y = 280 ;//坦克的初始位置int op = 1 ;//坦克的移动方向int color = 0 ;int tankspeed = 8 ;//坦克的速度int tankbullet = 8 ;//坦克的子弹速度int tankfbullet = 4 ;//敌军的子弹速度int shengming = 100 ;//生命int fenshu = 0 ;int nandu = 5 ; //设置游戏难度//子弹int dx = 295 , dy = 295 ;int dx1 = 295 , dy1 = -10 ;int dx2 = 600 , dy2 = 295 ;int dx3 = 295 , dy3 = 600 ;int dx4 = -10 , dy4 = 295 ;//敌军坦克int num = 10 ;//敌军坦克数量,不能修改int[] xf = new int[num] ;int[] yf = new int[num] ;int[] opf = new int[num] ;int[] dxf = new int[num] ;int[] dyf = new int[num] ;int[] dxf1 = new int[num] ;int[] dyf1 = new int[num] ;int[] dxf2 = new int[num] ;int[] dyf2 = new int[num] ;int[] dxf3 = new int[num] ;int[] dyf3 = new int[num] ;int[] dxf4 = new int[num] ;int[] dyf4 = new int[num] ;//构造函数,初始化敌军坦克的位置和状态MyTank() {for (int i = 0; i<="">xf[i] = (int) (Math.random() * 560) ; yf[i] = (int) (Math.random() * 560) ; dxf[i] = xf[i] + 15 ;dyf[i] = yf[i] + 15 ;}for (int i = 0; i<="">dxf1[i] = 295 ; dyf1[i] = -10 ;dxf2[i] = 600 ; dyf2[i] = 295 ;dxf3[i] = 295 ; dyf3[i] = 600 ;dxf4[i] = -10 ; dyf4[i] = 295 ;}}//主面版public void paint(Graphics g) { super.paint(g) ;this.setBackground(Color.YELLOW) ;g.setColor(Color.red) ;g.drawString("生命:" , 10 , 20 ) ;g.fillRect(50 , 10 , shengming * 5 , 10) ;g.drawRect(50 , 10 , 500 , 10) ;g.drawString("得分: "+ fenshu , 10 , 40) ;if(op == 1) {g.setColor(Color.red) ;g.fillRect(x , y , 40 , 40) ;switch (color % 6) {case 0: g.setColor(Color.blue) ; break; case 1: g.setColor(Color.yellow) ; break; case 2: g.setColor(Color.red) ; break;case 3: g.setColor(Color.orange) ; break; case 4: g.setColor(Color.green) ; break; case 5: g.setColor(Color.black) ; break; }g.fillOval(x - 5 , y - 5 , 10 , 10) ;g.fillOval(x - 5 , y + 5 , 10 , 10) ;g.fillOval(x - 5 , y + 15 , 10 , 10) ;g.fillOval(x - 5 , y + 25 , 10 , 10) ;g.fillOval(x - 5 , y + 35 , 10 , 10) ;g.fillOval(x + 35 , y - 5 , 10 , 10) ;g.fillOval(x + 35 , y + 5 , 10 , 10) ;g.fillOval(x + 35 , y + 15 , 10 , 10) ;g.fillOval(x + 35 , y + 25 , 10 , 10) ;g.fillOval(x + 35 , y + 35 , 10 , 10) ;g.setColor(Color.black) ;g.fillRect(x + 15 , y - 20 , 10 , 40) ;switch (color % 20) {case 0: g.setColor(Color.white) ; break; case 1: g.setColor(Color.white) ; break; case 2: g.setColor(Color.white) ; break; case 3: g.setColor(Color.white) ; break; case 4: g.setColor(Color.white) ; break; case 5: g.setColor(Color.white) ; break; case 6: g.setColor(Color.white) ; break;case 7: g.setColor(Color.white) ; break;case 8: g.setColor(Color.white) ; break;case 9: g.setColor(Color.white) ; break;case 10: g.setColor(Color.black) ; break;case 11: g.setColor(Color.black) ; break;case 12: g.setColor(Color.black) ; break;case 13: g.setColor(Color.black) ; break;case 14: g.setColor(Color.black) ; break;case 15: g.setColor(Color.black) ; break;case 16: g.setColor(Color.black) ; break;case 17: g.setColor(Color.black) ; break;case 18: g.setColor(Color.black) ; break;case 19: g.setColor(Color.black) ; break; }g.fillOval(x + 5 , y + 30 , 10 , 10) ;g.fillOval(x + 25 , y + 30 , 10 , 10) ;}if(op == 2) {g.setColor(Color.green) ;g.fillRect(x , y , 40 , 40) ;switch (color % 6) {case 0: g.setColor(Color.blue) ; break; case 1: g.setColor(Color.yellow) ; break; case 2: g.setColor(Color.red) ; break; case 3: g.setColor(Color.orange) ; break; case 4: g.setColor(Color.green) ; break; case 5: g.setColor(Color.black) ; break; }g.fillOval(x - 5 , y - 5 , 10 , 10) ;g.fillOval(x + 5 , y - 5 , 10 , 10) ;g.fillOval(x + 15 , y - 5 , 10 , 10) ;g.fillOval(x + 25 , y - 5 , 10 , 10) ;g.fillOval(x + 35 , y - 5 , 10 , 10) ;g.fillOval(x - 5 , y+35 , 10 , 10) ;g.fillOval(x + 5 , y+35 , 10 , 10) ;g.fillOval(x + 15 , y+35 , 10 , 10) ;g.fillOval(x + 25 , y+35 , 10 , 10) ;g.fillOval(x + 35 , y+35 , 10 , 10) ;g.setColor(Color.black) ;g.fillRect(x + 20 , y + 15 , 40 , 10) ; switch (color % 20) {case 0: g.setColor(Color.white) ; break; case 1: g.setColor(Color.white) ; break; case 2: g.setColor(Color.white) ; break; case 3: g.setColor(Color.white) ; break; case 4: g.setColor(Color.white) ; break; case 5: g.setColor(Color.white) ; break; case 6: g.setColor(Color.white) ; break;case 7: g.setColor(Color.white) ; break; case 8: g.setColor(Color.white) ; break; case 9: g.setColor(Color.white) ; break; case 10: g.setColor(Color.black) ; break; case 11: g.setColor(Color.black) ; break; case 12: g.setColor(Color.black) ; break; case 13: g.setColor(Color.black) ; break; case 14: g.setColor(Color.black) ; break; case 15: g.setColor(Color.black) ; break; case 16: g.setColor(Color.black) ; break; case 17: g.setColor(Color.black) ; break; case 18: g.setColor(Color.black) ; break; case 19: g.setColor(Color.black) ; break; } g.fillOval(x , y + 5 , 10 , 10) ;g.fillOval(x , y + 25 , 10 , 10) ;}if(op == 3) {g.setColor(Color.blue) ;g.fillRect(x , y , 40 , 40) ;switch (color % 6) {case 0: g.setColor(Color.blue) ; break; case 1: g.setColor(Color.yellow) ; break; case 2: g.setColor(Color.red) ; break; case 3: g.setColor(Color.orange) ; break; case 4: g.setColor(Color.green) ; break; case 5: g.setColor(Color.black) ; break; }g.fillOval(x - 5 , y - 5 , 10 , 10) ;g.fillOval(x - 5 , y + 5 , 10 , 10) ;g.fillOval(x - 5 , y + 15 , 10 , 10) ;g.fillOval(x - 5 , y + 25 , 10 , 10) ;g.fillOval(x - 5 , y + 35 , 10 , 10) ;g.fillOval(x + 35 , y - 5 , 10 , 10) ;g.fillOval(x + 35 , y + 5 , 10 , 10) ;g.fillOval(x + 35 , y + 15 , 10 , 10) ;g.fillOval(x + 35 , y + 25 , 10 , 10) ;g.fillOval(x + 35 , y + 35 , 10 , 10) ;g.setColor(Color.black) ;g.fillRect(x + 15 , y + 20 , 10 , 40) ; switch (color % 20) {case 0: g.setColor(Color.white) ; break; case 1: g.setColor(Color.white) ; break; case 2: g.setColor(Color.white) ; break; case 3: g.setColor(Color.white) ; break; case 4: g.setColor(Color.white) ; break; case 5: g.setColor(Color.white) ; break; case 6: g.setColor(Color.white) ; break; case 7: g.setColor(Color.white) ; break; case 8: g.setColor(Color.white) ; break; case 9: g.setColor(Color.white) ; break; case 10: g.setColor(Color.black) ; break; case 11: g.setColor(Color.black) ; break; case 12: g.setColor(Color.black) ; break; case 13: g.setColor(Color.black) ; break; case 14: g.setColor(Color.black) ; break; case 15: g.setColor(Color.black) ; break; case 16: g.setColor(Color.black) ; break; case 17: g.setColor(Color.black) ; break; case 18: g.setColor(Color.black) ; break; case 19: g.setColor(Color.black) ; break; }g.fillOval(x + 5 , y , 10 , 10) ;g.fillOval(x + 25 , y , 10 , 10) ;}if(op == 4) {g.setColor(Color.yellow) ;g.fillRect(x , y , 40 , 40) ;switch (color % 6) {case 0: g.setColor(Color.blue) ; break; case 1: g.setColor(Color.yellow) ; break; case 2: g.setColor(Color.red) ; break; case 3: g.setColor(Color.orange) ; break; case 4: g.setColor(Color.green) ; break; case 5: g.setColor(Color.black) ; break; }g.fillOval(x - 5 , y - 5 , 10 , 10) ;g.fillOval(x + 5 , y - 5 , 10 , 10) ;g.fillOval(x + 15 , y - 5 , 10 , 10) ;g.fillOval(x + 25 , y - 5 , 10 , 10) ;g.fillOval(x + 35 , y - 5 , 10 , 10) ;g.fillOval(x - 5 , y+35 , 10 , 10) ;g.fillOval(x + 5 , y+35 , 10 , 10) ;g.fillOval(x + 15 , y+35 , 10 , 10) ;g.fillOval(x + 25 , y+35 , 10 , 10) ;g.fillOval(x + 35 , y+35 , 10 , 10) ;g.setColor(Color.black) ;g.fillRect(x - 20 , y + 15 , 40 , 10) ; switch (color % 20) {case 0: g.setColor(Color.white) ; break; case 1: g.setColor(Color.white) ; break; case 2: g.setColor(Color.white) ; break;case 3: g.setColor(Color.white) ; break;case 4: g.setColor(Color.white) ; break;case 5: g.setColor(Color.white) ; break;case 6: g.setColor(Color.white) ; break;case 7: g.setColor(Color.white) ; break;case 8: g.setColor(Color.white) ; break;case 9: g.setColor(Color.white) ; break;case 10: g.setColor(Color.black) ; break;case 11: g.setColor(Color.black) ; break;case 12: g.setColor(Color.black) ; break;case 13: g.setColor(Color.black) ; break;case 14: g.setColor(Color.black) ; break;case 15: g.setColor(Color.black) ; break;case 16: g.setColor(Color.black) ; break;case 17: g.setColor(Color.black) ; break;case 18: g.setColor(Color.black) ; break;case 19: g.setColor(Color.black) ; break; }g.fillOval(x + 30 , y + 5 , 10 , 10) ;g.fillOval(x + 30 , y + 25 , 10 , 10) ;}g.setColor(Color.black) ;g.fillOval(dx , dy , 10 , 10) ;g.fillOval(dx1 , dy1 , 10 , 10) ;g.fillOval(dx2 , dy2 , 10 , 10) ;g.fillOval(dx3 , dy3 , 10 , 10) ;g.fillOval(dx4 , dy4 , 10 , 10) ;for (int i = 0; i<="">if(opf[i] == 1) {g.fillRect(xf[i] , yf[i] , 40 , 40) ;g.fillOval(xf[i] - 5 , yf[i] - 5 , 10 , 10) ; g.fillOval(xf[i] - 5 , yf[i] +5 , 10 , 10) ; g.fillOval(xf[i] - 5 , yf[i] + 15 , 10 , 10) ;g.fillOval(xf[i] - 5 , yf[i] + 25 , 10 , 10) ;g.fillOval(xf[i] - 5 , yf[i] + 35 , 10 , 10) ;g.fillOval(xf[i] + 35 , yf[i] - 5 , 10 , 10) ;g.fillOval(xf[i] + 35 , yf[i] + 5 , 10 , 10) ;g.fillOval(xf[i] + 35 , yf[i] + 15 , 10 , 10) ;g.fillOval(xf[i] + 35 , yf[i] + 25 , 10 , 10) ;g.fillOval(xf[i] + 35 , yf[i] + 35 , 10 , 10) ;g.fillRect(xf[i] + 15 , yf[i] - 20 , 10 , 40) ;g.fillOval(xf[i] + 5 , yf[i] + 30 , 10 , 10) ;g.fillOval(xf[i] + 25 , yf[i] + 30 , 10 , 10) ; }if(opf[i] == 2) {g.fillRect(xf[i] , yf[i] , 40 , 40) ;g.fillOval(xf[i] - 5 , yf[i] - 5 , 10 , 10) ; g.fillOval(xf[i] + 5 , yf[i] -5 , 10 , 10) ; g.fillOval(xf[i] + 15 , yf[i] - 5 , 10 , 10) ;g.fillOval(xf[i] + 25 , yf[i] - 5 , 10 , 10) ;g.fillOval(xf[i] + 35 , yf[i] - 5 , 10 , 10) ;g.fillOval(xf[i] - 5 , yf[i] + 35 , 10 , 10) ;g.fillOval(xf[i] + 5 , yf[i] + 35 , 10 , 10) ;g.fillOval(xf[i] + 15 , yf[i] + 35 , 10 , 10) ;g.fillOval(xf[i] + 35 , yf[i] + 35 , 10 , 10) ;g.fillRect(xf[i] + 20 , yf[i] + 15 , 40 , 10) ;g.fillOval(xf[i] , yf[i] + 5 , 10 , 10) ;g.fillOval(xf[i] , yf[i] + 25 , 10 , 10) ;}if(opf[i] == 3) {g.fillRect(xf[i] , yf[i] , 40 , 40) ;g.fillOval(xf[i] - 5 , yf[i] - 5 , 10 , 10) ; g.fillOval(xf[i] - 5 , yf[i] +5 , 10 , 10) ; g.fillOval(xf[i] - 5 , yf[i] + 15 , 10 , 10) ;g.fillOval(xf[i] - 5 , yf[i] + 25 , 10 , 10) ;g.fillOval(xf[i] - 5 , yf[i] + 35 , 10 , 10) ;g.fillOval(xf[i] + 35 , yf[i] - 5 , 10 , 10) ;g.fillOval(xf[i] + 35 , yf[i] + 5 , 10 , 10) ;g.fillOval(xf[i] + 35 , yf[i] + 15 , 10 , 10) ;g.fillOval(xf[i] + 35 , yf[i] + 25 , 10 , 10) ;g.fillOval(xf[i] + 35 , yf[i] + 35 , 10 , 10) ;g.fillRect(xf[i] + 15 , yf[i] + 20 , 10 , 40) ;g.fillOval(xf[i] + 5 , yf[i] , 10 , 10) ;g.fillOval(xf[i] + 25 , yf[i] , 10 , 10) ;}if(opf[i] == 4) {g.fillRect(xf[i] , yf[i] , 40 , 40) ;g.fillOval(xf[i] - 5 , yf[i] - 5 , 10 , 10) ; g.fillOval(xf[i] + 5 , yf[i] -5 , 10 , 10) ; g.fillOval(xf[i] + 15 , yf[i] - 5 , 10 , 10) ;g.fillOval(xf[i] + 25 , yf[i] - 5 , 10 , 10) ;g.fillOval(xf[i] + 35 , yf[i] - 5 , 10 , 10) ;g.fillOval(xf[i] - 5 , yf[i] + 35 , 10 , 10) ;g.fillOval(xf[i] + 5 , yf[i] + 35 , 10 , 10) ;g.fillOval(xf[i] + 25 , yf[i] + 35 , 10 , 10) ;g.fillOval(xf[i] + 35 , yf[i] + 35 , 10 , 10) ;g.fillRect(xf[i] - 20 , yf[i] + 15 , 40 , 10) ;g.fillOval(xf[i] + 30 , yf[i] + 5 , 10 , 10) ;g.fillOval(xf[i] + 30 , yf[i] + 25 , 10 , 10) ; }g.fillOval(dxf1[i] , dyf1[i] , 10 , 10 ) ;g.fillOval(dxf2[i] , dyf2[i] , 10 , 10 ) ;g.fillOval(dxf3[i] , dyf3[i] , 10 , 10 ) ;g.fillOval(dxf4[i] , dyf4[i] , 10 , 10 ) ;}}public void keyTyped(KeyEvent e) {//键盘控制坦克的移动,发弹public void keyPressed(KeyEvent e) {color ++ ;if(e.getKeyCode() == KeyEvent.VK_UP) {op = 1 ;y = y - tankspeed ;dy = dy - tankspeed ;if(y <= 0) {y = y + tankspeed ;dy = dy + tankspeed ;}}if(e.getKeyCode() == KeyEvent.VK_RIGHT) { op = 2 ;x = x + tankspeed ;dx = dx + tankspeed ;if(x >= 560) {x = x - tankspeed ;dx = dx - tankspeed ;}}if(e.getKeyCode() == KeyEvent.VK_DOWN) { op = 3 ;y = y + tankspeed ;dy = dy + tankspeed ;if(y >= 560) {y = y - tankspeed ;dy = dy - tankspeed ;}if(e.getKeyCode() == KeyEvent.VK_LEFT) { op = 4 ;x = x - tankspeed ;dx = dx - tankspeed ;if(x <= 0) {x = x + tankspeed ;dx = dx + tankspeed ;}}if(e.getKeyCode() == KeyEvent.VK_SPACE) { if(op == 1) { dx1 = dx ; dy1 = dy ;}if(op == 2) {dx2 = dx ; dy2 = dy ;}if(op == 3) {dx3 = dx ; dy3 = dy ;}if(op == 4) {dx4 = dx ; dy4 = dy ;}}this.repaint() ;}public void keyReleased(KeyEvent e) {}public void run() {for (int a = 0; a<60000; a++) {dy1 = dy1 - tankbullet ;dx2 = dx2 + tankbullet ;dy3 = dy3 + tankbullet ;dx4 = dx4 - tankbullet ;for (int i = 0; i<="">dyf1[i] = dyf1[i] - tankfbullet ;dxf2[i] = dxf2[i] + tankfbullet ;dyf3[i] = dyf3[i] + tankfbullet ;dxf4[i] = dxf4[i] - tankfbullet ;}//判断是否被击中for (int i = 0; i<="">if(dyf1[i]y +8 && dxf1[i]-x>-10 && dxf1[i]-x<40) { System.out.println ("被1击中") ;dxf1[i] = dxf[i] ; dyf1[i] = dyf[i] ;shengming = shengming - nandu ;}if(dxf2[i]>x+2 &&dxf2[i]-10 && dyf2[i] - y <40 ) { System.out.println ("被2击中") ;dxf2[i] = dxf[i] ; dyf2[i] = dyf[i] ;shengming = shengming - nandu ;}if(dyf3[i]>y+2 && dyf3[i]< y+32 && dxf3[i]-x >-10&& dxf3[i]-x<40) { System.out.println ("被3击中") ;dxf3[i] = dxf[i] ; dyf3[i] = dyf[i] ;shengming = shengming - nandu ;}if(dxf4[i]>x+8 &&dxf4[i]-10 && dyf4[i] - y <40 ) { System.out.println ("被4击中") ;dxf4[i] = dxf[i] ; dyf4[i] = dyf[i] ;shengming = shengming - nandu ;}}//判断是否击中敌军for (int i = 0; i<="">if(dy1yf[i] +8 && dx1-xf[i]>-10 && dx1-xf[i]<40) { System.out.println ("1击中") ;fenshu = fenshu + 100 ;xf[i] = (int)(Math.random() * 560 );yf[i] = (int)(Math.random() * 560 );}if(dx2>xf[i]+2 &&dx2-10 && dy2 - yf[i] <40 ) { System.out.println ("2击中") ;fenshu = fenshu + 100 ;xf[i] = (int)(Math.random() * 560 );yf[i] = (int)(Math.random() * 560 );}if(dy3>yf[i]+2 && dy3< yf[i]+32 && dx3-xf[i] >-10&& dx3-xf[i]<40) { System.out.println ("3击中") ;fenshu = fenshu + 100 ;xf[i] = (int)(Math.random() * 560 );yf[i] = (int)(Math.random() * 560 );}if(dx4>xf[i]+8 &&dx4-10 && dy4 - yf[i] <40 ) { System.out.println ("4击中") ;fenshu = fenshu + 100 ;xf[i] = (int)(Math.random() * 560 );yf[i] = (int)(Math.random() * 560 );}dxf[i] = xf[i] + 15 ;dyf[i] = yf[i] + 15 ;}//坦克的移动for (int i = 0; i<=""> switch (opf[i]) {case 1:{yf[i]-- ;dyf[i] -- ;for (int s = 0; s<=""> if(yf[i] <= 0) {yf[i] ++ ;dyf[i] ++ ;}}break;}case 2:{xf[i]++ ;dxf[i]++ ;for (int s = 0; s= 560){ xf[i] -- ;dxf[i] -- ;}}break;}case 3:{yf[i]++ ;dyf[i]++ ;for (int s = 0; s= 560){ yf[i] -- ;dyf[i] -- ;}}break;}case 4:{xf[i]-- ;dxf[i]-- ;for (int s = 0; s<="0){</p" if(xf[i]="" s++)="" {=""> xf[i] ++ ;dxf[i] ++ ;}}break;}}}try{Thread.sleep(20) ;}catch(Exception e) {e.printStackTrace() ;}//坦克的开火if(a % 50 == 5) {if(Math.random()>0.5){for (int i = 0; i<2; i++) {if(opf[i] == 1) {dxf1[i] = dxf[i] ; dyf1[i] = dyf[i] ; }if(opf[i] == 2) {dxf2[i] = dxf[i] ; dyf2[i] = dyf[i] ; }if(opf[i] == 3) {if(opf[i] == 4) {dxf4[i] = dxf[i] ; dyf4[i] = dyf[i] ; } }}}if(a % 50 == 15) {if(Math.random()>0.5) {for (int i = 2; i<4; i++) {if(opf[i] == 1) {dxf1[i] = dxf[i] ; dyf1[i] = dyf[i] ; } if(opf[i] == 2) {dxf2[i] = dxf[i] ; dyf2[i] = dyf[i] ; } if(opf[i] == 3) {dxf3[i] = dxf[i] ; dyf3[i] = dyf[i] ; } if(opf[i] == 4) {dxf4[i] = dxf[i] ; dyf4[i] = dyf[i] ; } }}}if(a % 50 == 25) {if(Math.random()>0.5){for (int i = 4; i<6; i++) {if(opf[i] == 1) {dxf1[i] = dxf[i] ; dyf1[i] = dyf[i] ; } if(opf[i] == 2) {dxf2[i] = dxf[i] ; dyf2[i] = dyf[i] ; } if(opf[i] == 3) {dxf3[i] = dxf[i] ; dyf3[i] = dyf[i] ; } if(opf[i] == 4) {}}}if(a % 50 == 35) {if(Math.random()>0.5){for (int i = 6; i<8; i++) {if(opf[i] == 1) {dxf1[i] = dxf[i] ; dyf1[i] = dyf[i] ; } if(opf[i] == 2) {dxf2[i] = dxf[i] ; dyf2[i] = dyf[i] ; } if(opf[i] == 3) {dxf3[i] = dxf[i] ; dyf3[i] = dyf[i] ; } if(opf[i] == 4) {dxf4[i] = dxf[i] ; dyf4[i] = dyf[i] ; } }}}if(a % 50 == 45) {if(Math.random()>0.5) {for (int i = 8; i<10; i++) {if(opf[i] == 1) {dxf1[i] = dxf[i] ; dyf1[i] = dyf[i] ; } if(opf[i] == 2) {dxf2[i] = dxf[i] ; dyf2[i] = dyf[i] ; } if(opf[i] == 3) {dxf3[i] = dxf[i] ; dyf3[i] = dyf[i] ; } if(opf[i] == 4) {dxf4[i] = dxf[i] ; dyf4[i] = dyf[i] ; } }}}//坦克的随机移动if(a % 50 == 1 ) {for (int i = 0; i<2; i++) {if( Math.random() > 0.5 ) {if(Math.random() > 0.5){opf[i] = 1 ;}else{opf[i] = 2 ;}}else{if(Math.random() > 0.5){opf[i] = 3 ;}else{opf[i] = 4 ;}}}}if(a % 50 == 11 ) {//坦克的随机移动for (int i = 2; i<4; i++) {if( Math.random() > 0.5 ) {if(Math.random() > 0.5){opf[i] = 1 ;}else{}}else{if(Math.random() > 0.5){ opf[i] = 3 ;opf[i] = 4 ;}}}}if(a % 50 == 21 ) {//坦克的随机移动for (int i = 4; i<6; i++) { if( Math.random() > 0.5 ) { if(Math.random() > 0.5){ opf[i] = 1 ;}else{opf[i] = 2 ;}}else{if(Math.random() > 0.5){ opf[i] = 3 ;}else{opf[i] = 4 ;}}}}if(a % 50 == 31 ) {//坦克的随机移动for (int i = 6; i<8; i++) { if( Math.random() > 0.5 ) { if(Math.random() > 0.5){ opf[i] = 1 ;}else{opf[i] = 2 ;}}else{if(Math.random() > 0.5){ opf[i] = 3 ;}}}}if(a % 50 == 41 ) {//坦克的随机移动for (int i = 8; i<10; i++) {if( Math.random() > 0.5 ) {if(Math.random() > 0.5){opf[i] = 1 ;}else{opf[i] = 2 ;}}else{if(Math.random() > 0.5){opf[i] = 3 ;}else{opf[i] = 4 ;}}}}//重画if(shengming<=0){//弹出player1胜利对话框JOptionPane.showMessageDialog(null,"你结束了","Game Over !", JOptionPane.ERROR_MESSAGE); //结束游戏System.exit(0) ;}this.repaint() ; }}}。

JAVA课程设计坦克大战游戏(含代码)

JAVA课程设计坦克大战游戏(含代码)

Java课程设计任务书简单电子游戏坦克大战的设计1、主要内容:设计一个简单的坦克大战电子游戏,可以允许多位玩家在局域网中同时对战2、系统要求:游戏具有图形游戏界面,能让用户看到游戏所给出的反馈。

有人机交互功能,使用户操作指定的游戏元素,并且坦克具有生命值,能攻击敌方,无法攻击友方,而且坦克的攻击具有视觉效果!3、具体要求(包括技术要求等):1.需要有图形游戏界面,让用户能看到游戏给出的反馈2.有人机交互功能,使用户能操作指定的游戏元素3.不同队伍的坦克,须显示不同外观,已分辨敌我4.坦克能够开火,攻击敌方,但不能攻击队友5需要有不可被子弹穿透的墙6.坦克有生命值,并非被击中一次就会爆炸7游戏结束后可重新开始学习并掌握以下技术:Java、JavaBean 等熟练使用以下开发工具:Myeclipse 等实现系统上述的功能。

4、进度安排:12月28日~ 12月29日:课程设计选题,查找参考资料12月30日~ 1月1日:完成系统设计和数据库设计1月2日~ 1月4日:完成程序代码的编写1月4日~ 1月5日:系统测试与完善1月5日~ 1月6日:完成课程设计报告,准备答辩分工:随着计算机的普及以及对电子游戏的认识,电子游戏已被越来越多的人选作放松、娱乐的休闲方式;电子游戏既不需要专门购买游戏器材,也不需要宽阔的游戏场地,只需要一台能独立完成任务的计算机即可,它可以是人们工作、学习时用的计算机,并不需要另行配置,这比起传统休闲游戏即省钱又省事。

局域网游戏更是可以将现实空间中零散的计算机,组织起来,使其在逻辑空间中集中起来,使游戏的组织、开展变得轻松。

如此轻松而又安逸的休闲方式,使得越来越多的人尝试,甚至已经将电子游戏作为主要休闲方式,既然有如此多的人使用,那其中必然存在巨大的商机,即使人们不愿意为一个小小的休闲游戏花费金钱,但在游戏中添加广告、游戏相关服务也包藏了巨大的财富;当然电子游戏的制作如今已是空前的火爆,大大小小的游戏公司横空出世,都想在电子游戏制作这个行业里占据一席之地,而一款成功的电子游戏需要精心的策划、分析、设计,只有这样才能获得游戏中包藏的财富,以及做出一款真正能够让玩家娱乐、放松的游戏,而不是骗取玩家钱财的工具。

JAVA实现经典游戏坦克大战的示例代码

JAVA实现经典游戏坦克大战的示例代码

JAVA实现经典游戏坦克⼤战的⽰例代码⽬录前⾔主要设计功能截图代码实现总结前⾔⼩时候⼤家都玩过坦克⼤战吧,熟悉的旋律和丰富的关卡陪伴了我们⼀整个寒暑假,还记得传说中的经典坦克⼤战吗?那些怀旧的记忆,伴随着我们⼀起⾛过来的经典坦克⼤战,刚开始那战战兢兢,屡屡被敌⼈坦克击毁的情景历历在⽬。

现在好了,再也不⽤担⼼敌⼈坦克了,可以横冲直撞,横扫敌⼈坦克了。

快哉《坦克⼤战》游戏以坦克战⽃为主题,⽤java语⾔实现,采⽤了swing技术进⾏了界⾯化处理,设计思路⽤了⾯向对象思想。

主要需求可以⽣成不同的地图,消灭地图上的所有坦克为胜利;可以设置关卡地图,不断增加难度。

主要设计1、要有难度关卡:第⼀关,第⼆关,第三关,第四关,第五关;第⼀关地图最简单,第五关地图最难;2、坦克要有⾎条,打多次才会死3、地图要我有我⽅坦克四辆(相当于4条命)和多辆敌⽅坦克4、我⽅坦克的炮弹数量是固定的,设置为5005、地图右边显⽰基本信息6、地图上要在砖块,铁块,河流功能截图游戏开始页⾯代码实现窗⼝布局public class GameFrame extends JFrame {/*** serialVersionUID*/private static final long serialVersionUID = -1176914786963603304L;public GameFrame() {super();this.setSize(800, 700);this.setTitle("坦克⼤战");this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);this.setResizable(false);// 显⽰器屏幕⼤⼩Dimension screenSizeInfo = Toolkit.getDefaultToolkit().getScreenSize();int leftTopX = ((int) screenSizeInfo.getWidth() - this.getWidth()) / 2;int leftTopY = ((int) screenSizeInfo.getHeight() - this.getHeight()) / 2;// 设置显⽰的位置在屏幕中间this.setLocation(leftTopX, leftTopY);}}地图渲染核⼼算法@Servicepublic class PaintService {@Autowiredprivate GameContext context;private Brick rightBrick = new Brick(700, 50);private Iron rightIron = new Iron(700, 50);private Water rightWater = new Water(700, 50);/*** 画出东西(包括坦克、障碍物。

JAVA实现坦克大战1.0版本

JAVA实现坦克大战1.0版本

JAVA实现坦克⼤战1.0版本 1package tankGame;2import java.awt.*;3import javax.swing.*;4import java.awt.event.*;5import java.util.*;6/**7 * 功能:我⽅坦克可以发⼦弹8 *9 * */10public class MyTankGame1 extends JFrame {1112public static void main(String[] args) {13// TODO Auto-generated method stub14 MyTankGame1 mtg =new MyTankGame1();15 }16//构造函数17public MyTankGame1(){18 MyPanel mp=new MyPanel();1920//线程启动21 Thread t=new Thread(mp);22 t.start();2324this.add(mp);25this.addKeyListener(mp);//注册监听26this.setSize(400,300);27this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);28this.setVisible(true);29 }3031 }3233//我的⾯板34class MyPanel extends JPanel implements KeyListener,Runnable{35 Hero hero=null;//定义我的坦克36 Vector<Enermy> enermy=new Vector<Enermy>() ;//定义敌⼈的坦克组37int enSize=3;38//构造函数39public MyPanel(){40 hero=new Hero(100,100);4142for(int i=0;i<enSize;i++){43//创建⼀辆敌⼈的坦克对象44 Enermy en=new Enermy((i+1)*50, 0);45 en.setColor(0);46 en.setDerect(3);47//加⼊48 enermy.add(en);49 }5051 }52public void paint(Graphics g){//重新paint53super.paint(g);54 g.fillRect(0, 0, 400, 300);55//画出我的坦克56this.drawTank(hero.getX(), hero.getY(), g,this.hero.derect, 1);57//画出⼦弹58if(hero.s!=null&&hero.s.isLive==true){59 g.fillOval(hero.s.x ,hero.s.y, 2, 2);60 }6162//画出敌⼈的坦克63for(int i=0;i<enermy.size();i++){64this.drawTank(enermy.get(i).getX(), enermy.get(i).getY(), g, enermy.get(i).derect, 0);65//System.out.println(enermy.get(i).derect);//默认值为066 }67 }68public void drawTank(int x,int y,Graphics g,int direct,int type){69//判断是什么类型的坦克,敌⼈的还是我⽅的70switch(type){71case 0:72 g.setColor(Color.CYAN);73break;74case 1:75 g.setColor(Color.yellow);76break;77 }78//判断⽅向79switch(direct){80//坦克头向上81case 0:82//画出我的坦克,到时再封装为⼀个函数 83//画出左边的矩形84 g.fill3DRect(x, y, 5, 30,false);85//画出有右边的矩形86 g.fill3DRect(x+15, y, 5, 30,false);87//画出中间的矩形88 g.fill3DRect(x+5, y+5, 10, 20,false);89//画出圆形90 g.fillOval(x+5, y+10, 10, 10);91//画炮头92 g.drawLine(x+10, y-5, x+10, y+15);93break;9495//坦克头向右96case 1:9798//画出上边的矩形99 g.fill3DRect(x, y, 30, 5,false);100//画出下边的矩形101 g.fill3DRect(x, y+15, 30, 5,false);102//画出中间的矩形103 g.fill3DRect(x+5, y+5, 20, 10,false);104//画出圆形105 g.fillOval(x+10, y+5, 10, 10);106//画炮头107 g.drawLine(x+15, y+10, x+35, y+10); 108break;109110//坦克头向下111case 2:112113 g.fill3DRect(x, y, 5, 30,false);114//画出有右边的矩形115 g.fill3DRect(x+15, y, 5, 30,false);116//画出中间的矩形117 g.fill3DRect(x+5, y+5, 10, 20,false);118//画出圆形119 g.fillOval(x+5, y+10, 10, 10);120//画炮头121 g.drawLine(x+10, y+15,x+10, y+35); 122break;123124//坦克头向左125case 3:126127//画出上边的矩形128 g.fill3DRect(x, y, 30, 5,false);129//画出下边的矩形130 g.fill3DRect(x, y+15, 30, 5,false);131//画出中间的矩形132 g.fill3DRect(x+5, y+5, 20, 10,false);133//画出圆形134 g.fillOval(x+10, y+5, 10, 10);135//画炮头136 g.drawLine( x-5, y+10,x+15, y+10);137break;138 }139140141 }142 @Override143public void keyPressed(KeyEvent e) {144// TODO Auto-generated method stub145if(e.getKeyCode()==KeyEvent.VK_W){146//设置我的坦克⽅向147this.hero.setDerect(0);148this.hero.moveUp();149 }else if (e.getKeyCode()==KeyEvent.VK_D){ 150this.hero.setDerect(1);151this.hero.moveRight();152 }else if (e.getKeyCode()==KeyEvent.VK_S){ 153this.hero.setDerect(2);154this.hero.moveDown();155 }else if (e.getKeyCode()==KeyEvent.VK_A){ 156this.hero.setDerect(3);157this.hero.moveLeft();158 }159this.repaint();160//判断玩家是否按下j161if(e.getKeyCode()==KeyEvent.VK_J){162//开⽕,调⽤shotEnermy163this.hero.shotEnermy();164 }165166 }167 @Override168public void keyReleased(KeyEvent e) { 169// TODO Auto-generated method stub 170171 }172 @Override173public void keyTyped(KeyEvent e) {174// TODO Auto-generated method stub 175176 }177 @Override178public void run() {//实现每隔100ms去重绘179// TODO Auto-generated method stub 180while(true){181try {182 Thread.sleep(100);183 } catch (InterruptedException e) {184// TODO Auto-generated catch block 185 e.printStackTrace();186 }187this.repaint();188 }189 }190 }成员类1package tankGame;2//⼦弹类3class Shot implements Runnable{4int x,y,direct;5int speed=1;6boolean isLive=true;7public Shot(int x,int y,int direct){8this.x=x;9this.y=y;10this.direct=direct;11 }12 @Override13public void run() {14// TODO Auto-generated method stub15while(true){16try {17 Thread.sleep(50);18 } catch (InterruptedException e) {19// TODO Auto-generated catch block20 e.printStackTrace();21 }22switch(direct){23case 0:24 y-=speed;25break;26case 1:27 x+=speed;28break;29case 2:30 y+=speed;31break;32case 3:33 x-=speed;34break;35 }36 System.out.println("X"+x+"Y"+y);37if (x<0||x>400||y<0||y>300){38this.isLive=false;39break;40 }41 }42 }43 }44//坦克类45class Tank46 {47int x=0;//坦克的横坐标48int y=0;//坦克的纵坐标49int derect;//0上 1右 2下 3左50int speed=1;//设置坦克的速度51int color;//设置坦克颜⾊52public int getColor() {53return color;54 }55public void setColor(int color) {56this.color = color;57 }58public int getDerect() {59return derect;60 }61public void setDerect(int derect) {62this.derect = derect;63 }64public int getX() {65return x;66 }67public void setX(int x) {68this.x = x;69 }70public int getY() {71return y;72 }73public void setY(int y) {74this.y = y;75 }7677public Tank(int x,int y){78this.x=x;79this.y=y;80 }81 }82class Hero extends Tank{83 Shot s=null;//⼦弹是和坦克关联的84public Hero (int x,int y){85super(x,y);86 }87public void shotEnermy(){//⼦弹和坦克⽅向相关 8889switch(this.derect){90case 0:91 s=new Shot(x+10,y-9,0);92break;93case 1:94 s=new Shot(x+38,y+9,1);95break;96case 2:97 s=new Shot(x+10,y+37,2);98break;99100case 3:101 s=new Shot(x-9,y+9,3);102break;103 }104 Thread t=new Thread(s);105 t.start();106 }107//坦克向上移动108public void moveUp(){109 y-=speed;110 }111//坦克向右移动112public void moveRight(){113 x+=speed;114 }//坦克向下移动115public void moveDown(){116 y+=speed;117 }118//坦克向左移动119public void moveLeft(){120 x-=speed;121 }122123124 }125class Enermy extends Tank{126public Enermy (int x,int y){127super(x,y);128 }129 }效果如下:。

坦克大战游戏编程实现

坦克大战游戏编程实现

坦克大战游戏编程实现游戏编程实现坦克大战坦克大战是一款经典的电子游戏,在游戏中,玩家将控制一个坦克,通过操作坦克的移动和攻击,与其他玩家或电脑进行战斗。

本文将介绍如何使用编程语言实现坦克大战游戏。

设计思路在实现坦克大战游戏之前,首先需要明确游戏的基本要素和规则。

玩家将操作一个坦克,通过键盘或操纵杆控制坦克的移动和攻击。

游戏画面由地图、坦克、子弹等元素构成。

坦克可以向前、向后、向左、向右移动,可以发射子弹进行攻击。

玩家需要躲避敌方坦克的攻击,同时尽可能击败敌方坦克。

编程实现坦克的移动和攻击可以通过编程语言来实现。

以下是使用Java语言来编写坦克大战游戏的示例代码:```javapublic class TankGame extends JFrame {private Tank tank; // 玩家坦克private List<Tank> enemyTanks; // 敌方坦克列表private List<Bullet> bullets; // 子弹列表public TankGame() {// 初始化游戏窗口this.setSize(800, 600);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true);// 初始化玩家坦克tank = new Tank(400, 500);// 初始化敌方坦克列表enemyTanks = new ArrayList<>();enemyTanks.add(new Tank(100, 100));enemyTanks.add(new Tank(300, 200));// 初始化子弹列表bullets = new ArrayList<>();// 添加键盘监听器,控制坦克移动和攻击this.addKeyListener(new KeyListener() {@Overridepublic void keyPressed(KeyEvent e) {int keycode = e.getKeyCode();switch (keycode) {case KeyEvent.VK_UP:tank.moveUp();break;case KeyEvent.VK_DOWN: tank.moveDown();break;case KeyEvent.VK_LEFT: tank.moveLeft();break;case KeyEvent.VK_RIGHT: tank.moveRight();break;case KeyEvent.VK_SPACE: bullets.add(tank.fire());break;default:break;}// 重新绘制游戏画面repaint();}@Overridepublic void keyReleased(KeyEvent e) { }@Overridepublic void keyTyped(KeyEvent e) { }});}// 绘制游戏画面public void paint(Graphics g) {super.paint(g);// 绘制玩家坦克tank.draw(g);// 绘制敌方坦克for (Tank enemyTank : enemyTanks) { enemyTank.draw(g);}// 绘制子弹for (Bullet bullet : bullets) {bullet.draw(g);}}public static void main(String[] args) {new TankGame();}}```在上述示例代码中,我们创建了一个继承自JFrame的主窗口,并在窗口中添加了一个玩家坦克、敌方坦克和子弹的列表。

TAVA课程设计 坦克大战

TAVA课程设计 坦克大战

《Java语言程序设计》课程设计报告题目:坦克大战专业:学号:姓名:指导教师:成绩:2010年 12 月28日1.课程设计研究背景及意义开发一个基于J2SE的游戏,坦克大战2.课程设计题目描述和要求坦克游戏要求:i.需要有图形游戏界面,让用户能看到游戏给出的反馈ii.有人机交互功能,使用户能操作指定的游戏元素iii.不同队伍的坦克,须显示不同外观,已分辨敌我iv.坦克能够开火,攻击敌方,但不能攻击队友v.需要有不可被子弹穿透的墙,且墙有可摧毁和不可摧毁两种vi.坦克有生命值,并非被击中一次就会爆炸vii.坦克爆炸后将产生道具,拾到道具的坦克可加满生命值3.课程设计报告内容3.1 题目求解的理论依据及算法解题原理:1)游戏基本元素:坦克,炮管,子弹,墙壁,地雷2)按住w,s,a,d或上,下,左,右箭头键,坦克向上下左右移动3)按鼠标左键,坦克开火,产生子弹,子弹与另一个坦克相碰,子弹3.2 数据结构:窗口:主窗口TankClient游戏元素:子弹 shot,坦克tank,墙壁wall,血条HitPoint,炸弹Bomb,涨炸弹的道具ShotsItem,涨血的道具 HitPointItem3.3 主要事件处理:1、按下鼠标左键发射普通子弹。

2、按下鼠标右键发射散弹。

3、子弹爆炸的效果,普通子弹和散弹的效果。

3.4 简要的设计流程:键盘监听器3.5、源代码:package cn.hnist.Joshua; import java.awt.*; /*** 抽象子弹类* @author bebebird@ */abstract class Shot { int shotSpeed; //子弹移动速度 int shotRadius; //子弹大小(半径) int shotPower; //子弹威力int ox, oy, sx, sy; //o 表示Tank 的中心坐标,s 表示炮弹坐标(初始时为炮筒端点) int lengthX, lengthY; //子弹每次移动的步长 boolean isLive;boolean isBomb; //死时是否产生爆炸 TankClient tc=null; Tank tk=null;ShotBomb shotBomb=null;public static final Toolkit TLK=Toolkit.getDefaultToolkit();public Shot(int ox,int oy,int sx,int sy,Tank tk){this.ox=ox;this.oy=oy;this.sx=sx;this.sy=sy;this.tc=tk.tc;=tk;this.isLive=true;}public Shot(Tank tk){this.ox=tk.x;this.oy=tk.y;this.sx=tk.turretDirx;this.sy=tk.turretDiry;this.tc=tk.tc;=tk;this.isLive=true;}abstract void draw(Graphics g);abstract void move();abstract void dead();public boolean isOutOfWindow() //检查子弹是否跃出边界{if(sx>TankClient.WIN_WIDTH||sx<0||sy>TankClient.WIN_HEIGHT||sy<0) {this.isBomb=false;return true;}else { return false; }}public Rectangle getRect() //碰撞检测时用于判断{return newRectangle(sx-shotRadius,sy-shotRadius,shotRadius*2,shotRadius*2;}}/*** 散弹类* @author bebebird@*/class HydraShot extends Shot{static final Image HYDRASHOT=TLK.getImage(Shot.class.getClassLoader().getResource("Image/Sh ot/SUPER.png"));public HydraShot(int ox,int oy,int sx,int sy,Tank tk){super(ox,oy,sx,sy,tk);this.shotPower=1;//子弹大小(半径)设置为6this.shotRadius=6;//炸弹速度设置为3this.shotSpeed=13;this.lengthX=shotSpeed*(sx-ox)/(int)Math.hypot(sx-ox,sy-oy);this.lengthY=shotSpeed*(sy-oy)/(int)Math.hypot(sx-ox,sy-oy);}public void draw(Graphics g){if(isLive){g.drawImage(HYDRASHOT,sx-shotRadius,sy-shotRadius,null);}else{if(isBomb&&shotBomb!=null) { shotBomb.draw(g); } }}public boolean isHitWall(){Wall w=null;for(int i=0;i<tc.wallList.size();i++){w=tc.wallList.get(i);if(w.isHits(this)){this.isBomb=true;return true; //散弹不可穿墙}}return false;}public boolean isHitTank() //检查炮弹是否击中对方Tank{Tank tempTk=null;for(int i=0;i<tc.tanksList.size();i++){tempTk=tc.tanksList.get(i);if(tempTk.isLive&&getRect().intersects(tempTk.getRect())&&tempTk .camp!=tk.camp){tempTk.tankHitPoint.cutsHitPoint(shotPower,this); //减少一些血this.isBomb=true;return true;}}return false; //未打中任何Tank}public void dead(){if(isLive){this.isLive=false;if(isBomb){ shotBomb=new ShotBomb(sx-32,sy-32,this); } //当撞到墙或Tank时子弹才爆炸else{tc.shotsList.remove(this);}}}public void move(){if(isLive){sx+=lengthX;sy+=lengthY;if(isOutOfWindow()||isHitWall()||isHitTank()){this.dead();}}}}/*** 普通炮弹类* @author bebebird@*/class NormalShot extends Shot //普通炮弹{static final Image[] NORSHOT={T LK.getImage(Shot.class.getClassLoader().getResource("Image/Shot/ NOR1.png")),TLK.getImage(Shot.class.getClassLoader().getResource("Image/Sh ot/NOR2.png"))};public NormalShot(Tank tk){super(tk);this.shotPower=1;this.shotRadius=6;this.shotSpeed=12;this.lengthX=shotSpeed*(sx-ox)/(int)Math.hypot(sx-ox,sy-oy);this.lengthY=shotSpeed*(sy-oy)/(int)Math.hypot(sx-ox,sy-oy); }public void draw(Graphics g){if(isLive){if(tk.camp){ g.drawImage(NORSHOT[0],sx-shotRadius,sy-shotRadius,null); } else{ g.drawImage(NORSHOT[1],sx-shotRadius,sy-shotRadius,null); } }else{if(isBomb&&shotBomb!=null) { shotBomb.draw(g); } }}public boolean isHitWall(){Wall w=null;for(int i=0;i<tc.wallList.size();i++){w=tc.wallList.get(i);if(w.isHits(this)){this.isBomb=true;return true; //普通子弹不可穿墙}}return false;}public boolean isHitTank() //检查炮弹是否击中对方Tank{Tank tempTk=null;for(int i=0;i<tc.tanksList.size();i++){tempTk=tc.tanksList.get(i);i f(tempTk.isLive&&getRect().intersects(tempTk.getRect())&&temp Tk.camp!=tk.camp){tempTk.tankHitPoint.cutsHitPoint(shotPower,this); //减少一些血this.isBomb=true;return true;}}return false; //未打中任何Tank}public void dead(){if(isLive){this.isLive=false;tk.shotsCount--; //将Tank已发射的子弹数减1if(isBomb){ shotBomb=new ShotBomb(sx-32,sy-32,this); } //当撞到墙或Tank时子弹才爆炸else{tc.shotsList.remove(this);}}}public void move(){if(isLive){sx+=lengthX;sy+=lengthY;if(isOutOfWindow()||isHitWall()||isHitTank()){this.dead();}}}}/*** 增强的炮弹* @author bebebird@*/class SpecialShot extends Shot{int hitCount; //子弹可以攻击的次数static final Image SPESHOT=TLK.getImage(Shot.class.getClassLoader().getResource("Image/Shot/SPE.png"));public SpecialShot(Tank tk){super(tk);this.hitCount=2;this.shotPower=2;this.shotRadius=6;this.shotSpeed=10;this.lengthX=shotSpeed*(sx-ox)/(int)Math.hypot(sx-ox,sy-oy);this.lengthY=shotSpeed*(sy-oy)/(int)Math.hypot(sx-ox,sy-oy); }public boolean isHitTank() //检查炮弹是否击中Tank{Tank tempTk=null;for(int i=0;i<tc.tanksList.size();i++){tempTk=tc.tanksList.get(i);if(getRect().intersects(tempTk.getRect())&tempTk.camp!=tk.camp)/ /自己发射的子弹不打自己人{if(tempTk.isLive){tempTk.tankHitPoint.cutsHitPoint(shotPower,this); //减少一些血this.hitCount--;if(0==hitCount) { this.isBomb=true; return true; } }}}return false; //未打中任何Tank}public void dead(){if(isLive){this.isLive=false;if(isBomb){ shotBomb=new ShotBomb(sx-32,sy-32,this); } //当撞到墙或Tank时子弹才爆炸else{this.tc.shotsList.remove(this); //将子弹从List中移除}}}void move(){if(isLive){sx+=lengthX;sy+=lengthY;if(isOutOfWindow()||isHitTank()){this.dead();}}}void draw(Graphics g){if(isLive){g.drawImage(SPESHOT,sx-shotRadius,sy-shotRadius,null);}else{if(isBomb&&shotBomb!=null) { shotBomb.draw(g); } }}}class SuperShot extends Shot //超级炮弹{int oldx,oldy; //起始坐标static final int MOVERANGE=150; //发射后移动此距离后爆炸static final ImageSUPERSHOT=TLK.getImage(Shot.class.getClassLoader().getResource("Image/Shot/SUPER.png"));public SuperShot(Tank tk){super(tk);this.shotPower=5;this.shotRadius=4;this.shotSpeed=8;this.oldx=sx;this.oldy=sy;this.lengthX=shotSpeed*(sx-ox)/(int)Math.hypot(sx-ox,sy-oy);this.lengthY=shotSpeed*(sy-oy)/(int)Math.hypot(sx-ox,sy-oy);}public void dead(){if(isLive){this.isLive=false;if(isBomb) { shotBomb=new SuperShotBomb(sx,sy,this); }else { this.tc.shotsList.remove(this); }}}void move(){if(isLive){sx+=lengthX;sy+=lengthY;if(isOutOfWindow()) { this.dead(); }if((int)Math.hypot(sx-oldx,sy-oldy)>MOVERANGE) //移动一定距离后爆炸{this.isBomb=true;this.dead();}}}/*** 画发射炮弹*/void draw(Graphics g){if(isLive){g.drawImage(SUPERSHOT,sx-shotRadius,sy-shotRadius,null);}else{if(isBomb&&shotBomb!=null) { shotBomb.draw(g); } }}}3.6 程序调试出错信息及解决方法程序在调试过程中碰到很多的错误,譬如说事件监听器与事件源没有关联、除数为零、数组下标越界等等。

JAVA课程设计坦克大战(含代码)

JAVA课程设计坦克大战(含代码)

Java程序课程设计任务书项目名称:坦克大战游戏的设计与开发英文名:Tank Battle1、主要内容:1、基于java的游戏开发与设计的分析;2、坦克大战游戏的架构搭建与设计实现;3、游戏可以通过用户可以注册新用户,修改自己的密码、个人资料。

2、具体要求1、系统的功能要求:(一)实现玩家试玩游戏功能,屏蔽用户注册和登陆功能(空功能)(二)玩家具备一个或者两个备选坦克战车(三)玩家可以选择一个到两个关卡进行作战(四)玩家可以选择两个敌对阵营中的一个加入,与其他AI战车坦克并肩作战(五)胜利判定条件为:时间制、全杀制(可选)(六)至少提供两个可以自由切换的视角(七)至少提供一种炮弹类型(八)假定项目:如果用户注册,登陆功能能够顺利做好,则提供一个玩家分数上传和排行榜功能。

2、学习并掌握以下技术:数据库的JDBC连接,JA V A编程语言,MySQL数据库的应用;JSP的开发与运用3、熟练使用以下开发工具:JCreator,Myeclipse ,MySQL ,PowerDesigner 等3、进度安排:12月28日~ 12 月29 日:查阅资料,完成文献综述,任务书;12月29 日~ 12月31日:进行系统的需求分析与设计;1月1日~ 1月3日:根据分析进行各个模块程序的设计与创建;1月4日~ 1 月6日:完成各个模块的程序编写;1月7 日~ 1 月8 日:完成全部程序的编写及系统测试;1月9日~ 1 月10日:完成课程设计报告的编写,答辩;摘要随着Java语言的不断发展和壮大,现在的Java已经广泛的应用于各个领域,包括医药,汽车工业,手机行业,游戏,等等地方。

Java游戏的开发为满足人们娱乐所需而设计。

本游戏为坦克大战游戏,是基于Java的图形用户界面而开发的,可以放松心情的小游戏。

游戏从系统操作简便、界面友好、灵活、上手即会的基本要求出发,完成整款游戏的开发。

游戏更设置了暂停、计分、音乐、速度,用户信息保存等功能,可以根据自己的爱好,挑战更高难度,为用户带来愉悦的体验。

java课程设计--坦克大战游戏(带源码)

java课程设计--坦克大战游戏(带源码)
g.setColor(Color.RED);
g.drawRect(x,y-5, WIDTH,5);
int w=WIDTH*life/100;
g.fillRect(x, y-5, w, 5);
g.setColor(c);
}
}
private class BloodBar_B{
public void draw(Graphics g){
}
Graphics gOffScreen=offScreenImage.getGraphics();
Color c=gOffScreen.getColor();
gOffScreen.setColor(Color.GRAY);
gOffScreen.fillRect(0, 0,GAME_WIDTH,GAME_HEIGHT);
g.drawString("击中个数:"+explodes.size(),10,70);
g.drawString("坦克数量:"+tanks.size(),10,90);
g.drawString("生命值:"+myTank.getLife(),10,110);
if(tanks.size()<=0){
public static final int HEIGHT = 30;
private boolean live = true;
private BloodBar_G bb_G=new BloodBar_G();
private BloodBar_B bb_B=new BloodBar_B();
private int life =100;
Color c=g.getColor();

Java课程设计——坦克大战

Java课程设计——坦克大战

Java课程设计——坦克⼤战坦克⼤战——坦克类⼀. 团队课程设计博客链接⼆.个⼈负责模块和任务说明模块:坦克类(玩家坦克类+电脑坦克类),代码整合三.代码的提交记录截图四.负责模块和任务详细说明玩家坦克继承VisibleImage类,电脑坦克类继承⾃玩家坦克类,UML如下:1.玩家坦克类构造⽅法:设置坐标位置(坦克出⽣的位置),坦克的图⽚,坦克的类型(玩家还是电脑),⾯板(可将坦克放置于当前⾯板中),代码截图如下:移动⽅向:(上下左右)左移思路:若当前⽅向不是左移,则将图⽚更改为左移图⽚,并且更新⽅向为左。

若经过碰撞检测发现不会产⽣碰撞,则改变坐标,并且要判断坐标是否在边界。

其他⽅向同理,代码截图如下:碰撞检测:(墙与电脑坦克)思路:获取当前坐标周围⼀定范围内的矩形边框,同时获取当前⾯板内的所有墙体对象,将其存放于数组中。

将获得的矩形范围与所有墙体互相匹配,若符合则说明会产⽣碰撞。

注意草地例外。

坦克碰撞检测同理,注意要将⾃⼰除外,并且要查看当前坦克是否存活,代码截图如下:获得⼦弹:根据上下左右的⽅向判断坦克头的位置,即⼦弹发射的⽅向的预设,以保证之后⼦弹朝预设⽅向移动(⼦弹的移动在⼦弹类⾥)攻击⽅法:获得⼦弹,将⼦弹添加⾄⾯板(因为⼦弹有四个⽅向),启动攻击冷却线程。

触碰边界⽅法:根据屏幕与主窗体之间的⼤⼩关系,进⽽判断坦克是否移动到边界。

冷却线程:使⽤sleep()⽅法,经过休眠之后,要注意改变线程的状态,将其改为可攻击。

其余setter,getter⽅法则不进⾏详细描述。

2.电脑坦克类构造⽅法:继承⾃⽗类玩家坦克类,设置好初始⽅向,攻击冷却时间移动⽅向:在⽗类的基础上,改变了⽗类的⼿动产⽣新⽅向,⽽是随机产⽣新⽅向,并且在该⽅向的移动时间是设置好的,检测是否达到边界同理:碰撞检测,攻击⽅法的思路都与玩家坦克类相似,不同之处在于,玩家坦克类的⽅向是⼈为改动的,⽽电脑坦克类的⽅向是随机产⽣的,故要重写⽗类的这两个⽅法。

坦克大战Java代码

坦克大战Java代码

import java.awt.*;//血块类public class Blood {int x, y, w, h;//定义血块坐标变量,宽度、高度变量TankClient tc; //生命坦克客户端变量int step = 0;private boolean live = true;//初始生命为true//定义5个血块数组private int[][] pos = {{350,300},{360,300},{375,275},{400,200},{360,270},{365,};290}, {340, 280}//血块构造函数public Blood() {}//画出血块public void draw(Graphics g) {}private void move() {}//看是否和子弹相碰撞public Rectangle getRect() {return new Rectangle(x, y, w , h);step ++;if(step == pos.length){}x = pos[step][0];y = pos[step][1];step = 0;if(!live) return;Color c = g.getColor();//对象c获取当前颜色g.setColor(Color.MAGENTA);//设定血块颜色为洋红色g.fillRect(x, y, w, h);//用洋红色填充矩形g.setColor(c);move();//调用move方法x = pos[0][0];y = pos[0][1];w = h = 15;//血块移动方法}}public boolean isLive() {}public void setLive(boolean live) { }this.live = live;return live;//返回生存状态//判断生存状态//设定生死状态import java.awt.*;//爆炸类public class Explode {int x, y; //定义爆炸坐标变量private boolean live = true;//初始化生命为true//引用坦克客户端对象private TankClient tc ;//定义并初始化半径数组int[] diameter = {4, 7, 12, 18, 26, 32, 49, 30, 14, 6};int step = 0;//根据碰撞位置创建爆炸public Explode(int x, int y, TankClient tc) {}//用一个圆来表示模拟爆炸public void draw(Graphics g) {if(!live) {}if(step == diameter.length) {}Color c = g.getColor();//对象c用来获取颜色live = false;step = 0;return;tc.explodes.remove(this);return;this.x = x;this.y = y;this.tc = tc;}}g.setColor(Color.ORANGE);//设定爆炸颜色为桔黄色g.fillOval(x, y, diameter[step], diameter[step]);//用桔黄色填充圆g.setColor(c);step ++;import java.awt.*;import java.util.List;//子弹类public class Missile {public static final int XSPEED = 10; //子弹水平速度public static final int YSPEED = 10; //子弹垂直速度public static final int WIDTH = 10; //子弹宽度变量public static final int HEIGHT = 10;//子弹高度变量int x, y;//子弹坐标Tank.Direction dir;//子弹方向//子弹生死状态变量private boolean good;//设定敌我双方判断标志private boolean live = true;//判断是否存活//坦克客户对象private TankClient tc;//子弹构造函数public Missile(int x, int y, Tank.Direction dir) {}//重写构造函数public Missile(int x, int y, boolean good, Tank.Direction dir, TankClient tc) {} //在窗体上画出子弹public void draw(Graphics g) {if(!live) {tc.missiles.remove(this);return;this(x, y, dir);this.good = good;this.tc = tc;this.x = x;this.y = y;this.dir = dir;}}//如果子弹死了,则不画出Color c = g.getColor();//获取颜色g.setColor(Color.BLACK);//设置子弹颜色为黑色g.fillOval(x, y, WIDTH, HEIGHT);//用黑色填充圆g.setColor(c);move();//子弹移动方法//子弹移动函数private void move() {//根据子弹的方向确定下一步的移动switch(dir) {case L:x -= XSPEED;break;x -= XSPEED;y -= YSPEED;break;y -= YSPEED; break;x += XSPEED; y -= YSPEED; break;x += XSPEED; break;x += XSPEED; y += YSPEED; break;y += YSPEED; break;x -= XSPEED; y += YSPEED; break; break; case LU: case U: case RU: case R: case RD:case D:case LD:case STOP:{}}//判断子弹是否出界,若出则去掉if(x < 0 || y < 0 || x > TankClient.GAME_WIDTH || y >TankClient.GAME_HEIGHT)}live = false;//判断子弹生存状态public boolean isLive() {}//获取子弹外围坐标public Rectangle getRect() {}//打坦克函数public boolean hitTank(Tank t) {}//依次判断所有敌方坦克是否被子弹击中public boolean hitTanks(List<Tank> tanks) {}//判断子弹是否击中墙public boolean hitWall(Wall w) {for(int i=0; i<tanks.size(); i++) {}return false;if(hitTank(tanks.get(i))) {}return true;if(this.live && this.getRect().intersects(t.getRect()) && t.isLive() &&}return false;if(t.isGood()) {}this.live = false;Explode e = new Explode(x, y, tc);//创建一个爆炸e对象tc.explodes.add(e);//添加到爆炸容器中return true;t.setLife(t.getLife()-20);if(t.getLife() <= 0) t.setLive(false);//坦克没血了则没生命t.setLive(false);return new Rectangle(x, y, WIDTH, HEIGHT);return live;//返回子弹生存状态this.good != t.isGood()) { //每中一次弹生命值减少20} else {}}if(this.live && this.getRect().intersects(w.getRect())) {}return false;this.live = false;return true;import java.awt.*;import java.awt.event.*;import java.util.*;//定义坦克类public class Tank {public static final int XSPEED = 5; //坦克水平速度public static final int YSPEED = 5; //坦克垂直速度public static final int WIDTH = 30; //坦克宽度public static final int HEIGHT = 30; //坦克高度private boolean live = true; //初始化生命为trueprivate BloodBar bb = new BloodBar();//声明血块变量private int life = 100; //初始化生命值为100TankClient tc;//生命坦克客户端变量private boolean good;//设置区分敌我两方标志private int x, y; //声明两个整型私有变量x,y坐标private int oldX, oldY;//记录上一步的坐标private static Random r = new Random(); //创建一个随机数r对象//声明方向变量private boolean bL=false, bU=false, bR=false, bD = false;enum Direction {L, LU, U, RU, R, RD, D, LD, STOP};/*坦克的八个方向和一个stop状private Direction dir = Direction.STOP;private Direction ptDir = Direction.D;private int step = r.nextInt(12) + 3;//整数step在[3,14]间随机取值态*///构造方法public Tank(int x, int y, boolean good) {}//重写构造方法public Tank(int x, int y, boolean good, Direction dir, TankClient tc) {}//画出坦克public void draw(Graphics g) {if(!live) {}Color c = g.getColor();//获取颜色if(good) g.setColor(Color.RED);//我方坦克颜色设置为红色else g.setColor(Color.BLUE);g.fillOval(x, y, WIDTH, HEIGHT);g.setColor(c);//画出子弹if(good) bb.draw(g);switch(ptDir) {case L:g.drawLine(x + Tank.WIDTH/2, y + Tank.HEIGHT/2, x, y + Tank.HEIGHT/2);break;g.drawLine(x + Tank.WIDTH/2, y + Tank.HEIGHT/2, x, y);break;g.drawLine(x + Tank.WIDTH/2, y + Tank.HEIGHT/2, x + Tank.WIDTH/2, y);break;g.drawLine(x + Tank.WIDTH/2, y + Tank.HEIGHT/2, x + Tank.WIDTH, y);break;if(!good) {}return;tc.tanks.remove(this);this(x, y, good);this.dir = dir;this.tc = tc;this.x = x;this.y = y;this.oldX = x;this.oldY = y;this.good = good;case LU:case U:case RU:case R:}}g.drawLine(x + Tank.WIDTH/2, y + Tank.HEIGHT/2, x + Tank.WIDTH, y +break;g.drawLine(x + Tank.WIDTH/2, y + Tank.HEIGHT/2, x + Tank.WIDTH, y +break;g.drawLine(x + Tank.WIDTH/2, y + Tank.HEIGHT/2, x + Tank.WIDTH/2, y +break;g.drawLine(x + Tank.WIDTH/2, y + Tank.HEIGHT/2, x, y + Tank.HEIGHT);break; Tank.HEIGHT/2);case RD:Tank.HEIGHT);case D:Tank.HEIGHT);case LD:move();//移动方法void move() {//记录上一次坐标this.oldX = x;this.oldY = y;switch(dir) {case L:x -= XSPEED;break;x -= XSPEED;y -= YSPEED; break;y -= YSPEED; break;x += XSPEED; y -= YSPEED; break;x += XSPEED; break;x += XSPEED; case LU: case U:case RU: case R:case RD:}}y += YSPEED; break;y += YSPEED; break;x -= XSPEED; y += YSPEED;break;break;case D:case LD:case STOP:if(this.dir != Direction.STOP) {}//控制坦克不出界if(x < 0) x = 0;if(y < 30) y = 30;if(x + Tank.WIDTH > TankClient.GAME_WIDTH) x = TankClient.GAME_WIDTH -if(y + Tank.HEIGHT > TankClient.GAME_HEIGHT) y = TankClient.GAME_HEIGHT -if(!good) {}Direction[] dirs = Direction.values();if(step == 0) {}if(r.nextInt(40) > 38) this.fire();step = r.nextInt(12) + 3;int rn = r.nextInt(dirs.length);//改变方向dir = dirs[rn];this.ptDir = this.dir;Tank.WIDTH;Tank.HEIGHT;step --;private void stay() {}//键按下的消息处理public void keyPressed(KeyEvent e) { int key = e.getKeyCode();x = oldX;y = oldY;}switch(key) {case KeyEvent.VK_Q :}locateDirection();if(!this.live) {}break; bL = true;break;bU = true;break;bR = true;break;bD = true;break;this.live = true;this.life = 100;case KeyEvent.VK_LEFT :case KeyEvent.VK_UP :case KeyEvent.VK_RIGHT :case KeyEvent.VK_DOWN ://设定方向void locateDirection() {}public void keyReleased(KeyEvent e) { int key = e.getKeyCode();switch(key) {case KeyEvent.VK_CONTROL:fire();break;bL =true;break;if(bL && !bU && !bR && !bD) dir = Direction.L;else if(bL && bU && !bR && !bD) dir = Direction.LU;else if(!bL && bU && !bR && !bD) dir = Direction.U;else if(!bL && bU && bR && !bD) dir = Direction.RU;else if(!bL && !bU && bR && !bD) dir = Direction.R;else if(!bL && !bU && bR && bD) dir = Direction.RD;else if(!bL && !bU && !bR && bD) dir = Direction.D;else if(bL && !bU && !bR && bD) dir = Direction.LD;else if(!bL && !bU && !bR && !bD) dir = Direction.STOP;//键抬起的消息处理case KeyEvent.VK_LEFT :}case KeyEvent.VK_UP :}locateDirection();bU = true;break;bR = true;break;bD = true;break;superFire();break;case KeyEvent.VK_RIGHT :case KeyEvent.VK_DOWN :case KeyEvent.VK_A ://按下A开火//开火发射方法public Missile fire() {}public Missile fire(Direction dir) {}//看坦克是否与子弹碰撞public Rectangle getRect() {}//判断坦克是否还活着}public void setLive(boolean live) {return live;return new Rectangle(x, y, WIDTH, HEIGHT);if(!live) return null;int x = this.x + Tank.WIDTH/2 - Missile.WIDTH/2;int y = this.y + Tank.HEIGHT/2 - Missile.HEIGHT/2;Missile m = new Missile(x, y, good, dir, this.tc);tc.missiles.add(m);if(!live) return null;int x = this.x + Tank.WIDTH/2 - Missile.WIDTH/2;int y = this.y + Tank.HEIGHT/2 - Missile.HEIGHT/2;Missile m = new Missile(x, y, good, ptDir, this.tc);tc.missiles.add(m);return m;public boolean isLive() {//设定坦克的生死状态{}this.live = live;//判断坦克状态是否良好public boolean isGood() {}//坦克与墙相撞public boolean collidesWithWall(Wall w) {}//坦克与坦克相撞public boolean collidesWithTanks(java.util.List<Tank> tanks) {}//发射超级子弹private void superFire() {}public int getLife() {}public void setLife(int life) {}this.life = life;return life;Direction[] dirs = Direction.values();for(int i=0; i<8; i++) {}fire(dirs[i]);for(int i=0; i<tanks.size(); i++) {}return false;Tank t = tanks.get(i);}if(this.live&&t.isLive()&&this.getRect().intersects(t.getRect()))}this.stay(); t.stay();return true;if(this.live && this.getRect().intersects(w.getRect())) {}return false;this.stay(); return true;return good;//返回坦克的生命值//设置坦克的生命值}//创建生命值private class BloodBar {}//判断坦克是否吃到东西public boolean eat(Blood b) {}if(this.live && b.isLive() && this.getRect().intersects(b.getRect())) {}return false;this.life = 100;b.setLive(false);return true;public void draw(Graphics g) {}Color c = g.getColor();g.setColor(Color.RED);g.drawRect(x, y-10, WIDTH, 10);int w = WIDTH * life/100 ;g.fillRect(x, y-10, w, 10);g.setColor(c);//在坦克上方画出生命条import java.awt.*;import java.awt.event.*;import java.util.List;import java.util.ArrayList;//坦克游戏的窗体类public class TankClient extends Frame {//定义窗口宽高public static final int GAME_WIDTH = 800;public static final int GAME_HEIGHT = 600;//声明一个自己坦克的对象Tank myTank = new Tank(50, 50, true, Tank.Direction.STOP, this);//声明两个墙变量Wallw1=newWall(100,200,20,150,this),w2=newWall(300,100,300,20,this);List<E xplode> explodes = new ArrayList<Explode>();//创建一个存放爆炸的容器List<Missile> missiles = new ArrayList<Missile>();//创建一个存放子弹的容器List<Tank> tanks = new ArrayList<Tank>();//创建一个存放坦克的容器Image offScreenImage = null;Blood b = new Blood();//创建一个血块对象//画方法public void paint(Graphics g) {//左上角显示的有关游戏的相关信息g.drawString("missiles count:" + missiles.size(), 10, 50);//子弹数g.drawString("explodes count:" + explodes.size(), 10, 70);//爆炸数g.drawString("tanks count:" + tanks.size(), 10, 90);//坦克数g.drawString("tanks life:" + myTank.getLife(), 10, 110);//坦克生命//画出爆炸if(tanks.size() <= 0) {}//画出子弹for(int i=0; i<missiles.size(); i++) {}for(int i=0; i<explodes.size(); i++) {}for(int i=0; i<tanks.size(); i++) {}myTank.draw(g);//画出坦克myTank.eat(b);w1."draw(g);//画出墙Tank t = tanks.get(i);t.collidesWithWall(w1);t.collidesWithWall(w2);//坦克撞到墙t.collidesWithTanks(tanks);//坦克相撞t.draw(g);Explode e = explodes.get(i);e.draw(g);Missile m = missiles.get(i);m.hitTanks(tanks);//打敌人m.hitTank(myTank);//被敌人打m.hitWall(w1);//撞墙m.hitWall(w2);m.draw(g);//if(!m.isLive()) missiles.remove(m);//else m.draw(g);for(int i=0; i<5; i++) {}tanks.add(new Tank(50 + 40*(i+1), 50, false, Tank.Direction.D,this));}w2."draw(g);b.draw(g);//双缓存消除闪烁public void update(Graphics g) {}//启动窗口public void lauchFrame() {}public static void main(String[] args) {//画出坦克for(int i=0; i<10; i++) {}//this.setLocation(400, 300);this.setSize(GAME_WIDTH, GAME_HEIGHT);this.setTitle("TankWar");this.addWindowListener(new WindowAdapter() //处理窗口的关闭});this.setResizable(false);//设置窗口大小固定this.setBackground(Color.GREEN);//窗口背景颜色为绿色this.addKeyListener(new KeyMonitor());setVisible(true);new Thread(new PaintThread()).start();public void windowClosing(WindowEvent e) {}System.exit(0);tanks.add(new Tank(50 + 40*(i+1), 50, false, Tank.Direction.D,this));if(offScreenImage == null) {}Graphics gOffScreen =offScreenImage.getGraphics();Color c = gOffScreen.getColor();gOffScreen.setColor(Color.GREEN);gOffScreen.fillRect(0, 0, GAME_WIDTH, GAME_HEIGHT);gOffScreen.setColor(c);paint(gOffScreen);g.drawImage(offScreenImage, 0, 0, null);offScreenImage =this.createImage(GAME_WIDTH, GAME_HEIGHT);{}}TankClient tc = new TankClient();//创建一个窗体uchFrame();//内部类新起一线程控制坦克移动private class PaintThread implements Runnable {}//增加键盘监听private class KeyMonitor extends KeyAdapter {}public void keyReleased(KeyEvent e) {}public void keyPressed(KeyEvent e) {}myTank.keyPressed(e);myTank.keyReleased(e);public void run() {}while(true) {}repaint();try {}Thread.sleep(50);//每隔50ms,坦克移动一下(重画一下)e.printStackTrace(); } catch (InterruptedException e) {//键盘抬起//键盘按下import java.awt.*;//墙类public class Wall {int x, y, w, h;//坐标,长,宽TankClient tc ;//坦克客户对象//根据墙左上角坐标,宽度,高度创建墙public Wall(int x, int y, int w, int h, TankClient tc) {this.x = x;this.y = y;}}this.w = w;this.h = h;this.tc = tc;//在窗体中画出墙public void draw(Graphics g) {}//返回墙的矩形碰撞区域public Rectangle getRect() {}return new Rectangle(x, y, w, h);g.fillRect(x, y, w, h);。

JAVA坦克大战源码

JAVA坦克大战源码
子弹 package Tank;
import java.awt.Color; import java.awt.Graphics;
public class Bullet { Tank t = new Tank(null); int x = -20; int y = -20; int width = 10; int height = 10; int speed = 15; int dir = 3; Color bColor = new Color(0, 0, 0);
} }
public void AI() { long l = System.currentTimeMillis(); if (l - AiTime >= 2000 || x - barrelHeight <= 0 || y - barrelHeight <= 30 || x + width + barrelHeight >= 800 || y + height + barrelHeight >= 600) { int i = r.nextInt() % 5 + 4; switch (i) { case LEFT: bareelDir = LEFT; dir = LEFT; AiTime = System.currentTimeMillis(); break; case UP: bareelDir = UP; dir = UP; AiTime = System.currentTimeMillis(); break; case RIGHT: bareelDir = RIGHT; dir = RIGHT; AiTime = System.currentTimeMillis(); break; case DOWN: bareelDir = DOWN; dir = DOWN; AiTime = System.currentTimeMillis(); break; } }
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Java课程设计任务书简单电子游戏坦克大战的设计1、主要内容:设计一个简单的坦克大战电子游戏,可以允许多位玩家在局域网中同时对战2、系统要求:游戏具有图形游戏界面,能让用户看到游戏所给出的反馈。

有人机交互功能,使用户操作指定的游戏元素,并且坦克具有生命值,能攻击敌方,无法攻击友方,而且坦克的攻击具有视觉效果!3、具体要求(包括技术要求等):1.需要有图形游戏界面,让用户能看到游戏给出的反馈2.有人机交互功能,使用户能操作指定的游戏元素3.不同队伍的坦克,须显示不同外观,已分辨敌我4.坦克能够开火,攻击敌方,但不能攻击队友5需要有不可被子弹穿透的墙6.坦克有生命值,并非被击中一次就会爆炸7游戏结束后可重新开始学习并掌握以下技术:Java、JavaBean 等熟练使用以下开发工具:Myeclipse 等实现系统上述的功能。

4、进度安排:12月28日~ 12月29日:课程设计选题,查找参考资料12月30日~ 1月1日:完成系统设计和数据库设计1月2日~ 1月4日:完成程序代码的编写1月4日~ 1月5日:系统测试与完善1月5日~ 1月6日:完成课程设计报告,准备答辩分工:随着计算机的普及以及对电子游戏的认识,电子游戏已被越来越多的人选作放松、娱乐的休闲方式;电子游戏既不需要专门购买游戏器材,也不需要宽阔的游戏场地,只需要一台能独立完成任务的计算机即可,它可以是人们工作、学习时用的计算机,并不需要另行配置,这比起传统休闲游戏即省钱又省事。

局域网游戏更是可以将现实空间中零散的计算机,组织起来,使其在逻辑空间中集中起来,使游戏的组织、开展变得轻松。

如此轻松而又安逸的休闲方式,使得越来越多的人尝试,甚至已经将电子游戏作为主要休闲方式,既然有如此多的人使用,那其中必然存在巨大的商机,即使人们不愿意为一个小小的休闲游戏花费金钱,但在游戏中添加广告、游戏相关服务也包藏了巨大的财富;当然电子游戏的制作如今已是空前的火爆,大大小小的游戏公司横空出世,都想在电子游戏制作这个行业里占据一席之地,而一款成功的电子游戏需要精心的策划、分析、设计,只有这样才能获得游戏中包藏的财富,以及做出一款真正能够让玩家娱乐、放松的游戏,而不是骗取玩家钱财的工具。

关键字:电子游戏;坦克大战;一、系统分析............................................................................................................................ - 1 -可行性分析.......................................................................................................................... - 1 - 需求分析.............................................................................................................................. - 1 - 二、概要设计............................................................................................................................ - 2 -工作流程图.......................................................................................................................... - 2 - 项目规划.............................................................................................................................. - 3 - 开发及运行环境.................................................................................................................. - 3 - 三、详细设计与算法实现........................................................................................................ - 4 -游戏主窗口.......................................................................................................................... - 4 - 游戏元素.................................................................................................... 错误!未定义书签。

四、测试.......................................................................................................... 错误!未定义书签。

测试环境............................................................................................................................ - 17 - 测试结果............................................................................................................................ - 17 -五、软件截图.......................................................................................................................... - 18 -六、总结.................................................................................................................................. - 21 -七、参考文献.................................................................................................. 错误!未定义书签。

一、系统分析可行性分析技术可行性软件使用swing、GUI、Socket、面向对象设计等技术实现,这些技术均已是非常成熟的技术,之前已有相当多使用这些技术的成功案例,故现使用这些技术是可行的。

经济可行性本软件为免费软件,将免费提供软件的下载、运行和维护服务,软件暂无收入,待公布之后随着使用者越来越多,将添加相应的广告、服务,从而增加收入,若使用者寥寥无几,将再次分析是否重新策划软件或者放弃开发,以减少损失。

需求分析通过反复研究以及市场调查,得知游戏须具有以下功能:❑需要有图形游戏界面,让用户能看到游戏给出的反馈❑不同队伍的坦克,须显示不同外观,已分辨敌我❑坦克能够开火,攻击敌方❑坦克有生命值❑游戏结束时须判断哪一队胜利❑游戏结束后可重新开始❑游戏的操作、进度等须提供相应说明,以告知玩家二、概要设计工作流程图项目规划本游戏是一个典型的电子小游戏,应具有如下结构:❑游戏主窗口游戏的一切效果、进度、消息等都将由游戏主窗口展示❑封装的游戏元素游戏元素包括:坦克、子弹、等游戏必须的元素开发及运行环境开发时硬件环境❑CPU:Inter P7350❑显卡:NVIDIA GeForce 105M❑内存:金士顿2G/DDR2-667❑显示器:三星液晶14寸/分辨率:1280X800开发时软件环境❑操作系统:Windows7❑JDK:1.5.0❑IDE:Eclipse3.4.0运行时硬件环境❑CPU:Inter P7350❑显卡:NVIDIA GeForce 105M❑内存:金士顿2G/DDR2-667运行时软件环境❑操作系统:Windows 7❑JRE:1.6.0❑显示器:三星液晶14寸/分辨率:1280X800❑三、详细设计与算法实现游戏主窗口游戏主窗口是人机交互的窗口,对玩家而言,他们只和游戏主窗口打交道,并不关心游戏内部是如何实现的,所以游戏主窗口部分最重要的便是游戏数据的输入、输出。

在程序中须创建一个类TankClient,继承自Frame来创建一个窗口。

游戏数据的输入游戏中坦克需要能往上、下、左、右四个方向运动,故须设立4个按键,使其能操作坦克,另须设一个键控制坦克开火。

为方便操作,本游戏设置方向键分别表示上下左右,空格表示开火。

具体实现为在TankClient类中添加内部的适配器类代码如下:/*** 方向键被按下后标记被按下的键* @param e 键盘事件*/public void keyPressed(KeyEvent e) {int keyCode = e.getKeyCode();switch (keyCode) {case KeyEvent.VK_LEFT:bL = true;break;case KeyEvent.VK_UP:bU = true;break;case KeyEvent.VK_RIGHT:bR = true;break;case KeyEvent.VK_DOWN:bD = true;break;case KeyEvent.VK_CONTROL:if (!this.hasMyMissile())fire();break;case KeyEvent.VK_A:superFire();break;case KeyEvent.VK_F2:tc = null;new TankClient("TankClient", 50, 10, 3);break;}locateDirection();}/*** 方向键被松开后标记被松开的键* @param e 键盘事件*/public void keyReleased(KeyEvent e) { int keyCode = e.getKeyCode();switch (keyCode) {case KeyEvent.VK_LEFT:bL = false;break;case KeyEvent.VK_UP:bU = false;break;case KeyEvent.VK_RIGHT:bR = false;break;case KeyEvent.VK_DOWN:bD = false;break;}locateDirection();}/*** 根据按下的键定位方向*/public void locateDirection() {if (bL && !bU && !bR && !bD)dir = Direction.L;if (bL && bU && !bR && !bD)dir = Direction.LU;if (!bL && bU && !bR && !bD)dir = Direction.U;if (!bL && bU && bR && !bD)dir = Direction.RU;if (!bL && !bU && bR && !bD)dir = Direction.R;if (!bL && !bU && bR && bD)dir = Direction.RD;if (!bL && !bU && !bR && bD)dir = Direction.D;if (bL && !bU && !bR && bD)dir = Direction.LD;if (!bL && !bU && !bR && !bD) dir = Direction.STOP;}/*** 根据方向移动坦克*/public void move() {lastX = x;lastY = y;switch (dir) {case L:x -= SPEED;break;case LU:x -= XYSPEED;y -= XYSPEED;break;case U:y -= SPEED;break;case RU:x += XYSPEED;y -= XYSPEED;break;case R:x += SPEED;break;case RD:x += XYSPEED;y += XYSPEED;break;case D:y += SPEED;break;case LD:x -= XYSPEED;y += XYSPEED;break;case STOP:break;}if (dir != Direction.STOP)ptDir = dir;//控制坦克不出界if (x < 0)x = 0;if (y < 30)y = 30;if (x > TankClient.WINDOW_WIDTH - this.RADIUS * 2) x = TankClient.WINDOW_WIDTH - this.RADIUS * 2;if (y > TankClient.WINDOW_HEIGHT - this.RADIUS * 2) y = TankClient.WINDOW_HEIGHT - this.RADIUS * 2;}/*** 根据坦克的位置和炮筒的方向发射炮弹*/public void fire() {if (!this.live)return;int x = this.x + Tank.RADIUS - Missile.RADIUS;int y = this.y + Tank.RADIUS - Missile.RADIUS;Missile m = new Missile(x, y, this.good, ptDir, this, tc);tc.missiles.add(m);}/*** 画炮筒* @param g Graphics对象*/public void drawPT(Graphics g) {int x1 = this.x + Tank.RADIUS;int y1 = this.y + Tank.RADIUS;int x2 = this.x + Tank.RADIUS;int y2 = this.y + Tank.RADIUS;switch (ptDir) {case L:x2 = x1 - PT_LENGTH;break;case LU:x2 = x1 - PT_XY;y2 = y1 - PT_XY;break;case U:y2 = y1 - PT_LENGTH;break;case RU:x2 = x1 + PT_XY;y2 = y1 - PT_XY;break;case R:x2 = x1 + PT_LENGTH;break;case RD:x2 = x1 + PT_XY;y2 = y1 + PT_XY;break;case D:y2 = y1 + PT_LENGTH;break;case LD:x2 = x1 - PT_XY;y2 = y1 + PT_XY;break;}g.drawLine(x1, y1, x2, y2);}游戏数据的输出玩家需要从游戏输出数据中获得游戏信息,如坦克在往上行驶、坦克发了颗子弹、坦克爆炸等,这些均需要通过游戏数据的输出来告知玩家。

相关文档
最新文档