java写的坦克大战简易版
java写的坦克大战简易版 1 / 26 MyTankGame2.java
package test; import javax.swing.*; import java.awt.*; import java.awt.event.*; //import java.io.*; import java.util.*;
class MyTankGame2 extends JFrame implements ActionListener { MyPanel mp=null; //定义一个开始的面板 MyStartPanel msp=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) { //System.out.println("Hello World!"); MyTankGame2 mtg=new MyTankGame2();
} //构造方法 public MyTankGame2() { //创建菜单及菜单选项 jmb=new JMenuBar(); jm1=new JMenu("游戏(G)"); //设置助记符 jm1.setMnemonic('G'); jmi1=new JMenuItem("开始新游戏(N)"); jmi2=new JMenuItem("退出游戏(E)"); jmi3=new JMenuItem("存盘退出游戏"); jmi4=new JMenuItem("继续上局游戏");
jmi4.addActionListener(this); java写的坦克大战简易版 2 / 26 jmi4.setActionCommand("continueGame"); jmi3.addActionListener(this); jmi3.setActionCommand("saveExit");
jmi2.setMnemonic('E'); //对jmi1进行响应 jmi1.addActionListener(this); jmi1.setActionCommand("newGame"); jmi2.addActionListener(this); jmi2.setActionCommand("exit"); jm1.add(jmi1); jm1.add(jmi2); jm1.add(jmi3); jm1.add(jmi4); jmb.add(jm1);
msp=new MyStartPanel(); Thread t=new Thread(msp); t.start(); this.setJMenuBar(jmb); this.add(msp); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setSize(600,450); this.setVisible(true);
} @Override public void actionPerformed(ActionEvent e) { //对用户不同的点击进行不同的处理 if(e.getActionCommand().equals("newGame")) { mp=new MyPanel("newGame"); Thread t=new Thread(mp); t.start(); //先删除旧的面板 this.remove(msp); this.add(mp); //注册监听 this.addKeyListener(mp); //显示 this.setVisible(true); } else if(e.getActionCommand().equals("exit")) {//保存击毁敌人的数量 Recorder.keepRecording(); System.exit(0); } //对存盘退出做处理 else if(e.getActionCommand().equals("saveExit")) { //工作 Recorder re=new Recorder(); re.setEts(mp.ets); //保存击毁敌人的数量和敌人的坐标 java写的坦克大战简易版 3 / 26 re.keepRecAndEnemyTank(); //退出 System.exit(0); } else if(e.getActionCommand().equals("continueGame")) { // mp=new MyPanel("con"); //mp.flag=; Thread t=new Thread(mp); t.start(); //先删除旧的面板 this.remove(msp); this.add(mp); //注册监听 this.addKeyListener(mp); //显示 this.setVisible(true);
}
} }
class MyStartPanel extends JPanel implements Runnable { int times=0; public void paint(Graphics g) { super.paint(g);
g.fillRect(0, 0, 400, 300); //提示信息 if(times%2==0) { g.setColor(Color.yellow); //开关信息的字体 Font myFont=new Font("华文新魏",Font.BOLD,30); g.setFont(myFont); g.drawString("stage:1", 150, 140); } }
@Override public void run() { // TODO Auto-generated method stub while(true) { //休眠 try { Thread.sleep(100); } catch (Exception e) { // TODO: handle exception } java写的坦克大战简易版 4 / 26 times++; //重画 this.repaint();
} } } //我的面板 class MyPanel extends JPanel implements KeyListener,Runnable { //定义我的坦克 Hero hero=null; //判断继续上局还是新游戏 //定义敌人的坦克组 Vector ets=new Vector(); Vector nodes=new Vector(); //定义炸弹集合 Vector bombs=new Vector();
int enSize=5; //定义三张图片 Image image1=null; Image image2=null; Image image3=null;
//构造方法 public MyPanel(String flag) { //恢复记录 Recorder.getRecording(); hero=new Hero(30,231);
if(flag.equals("newGame")) { //初始化敌人的坦克 for(int i=0;i{//创建一辆敌人的坦克对象 EnemyTank et=new EnemyTank((i+1)*50,0); et.setColor(0); et.setDirect(2); //将MyPanel的敌人坦克向量交给该敌人坦克 et.setEts(ets); //启动敌人的坦克 Thread t=new Thread(et); t.start(); //给敌人的坦克添加一颗子弹 Shot s=new Shot(et.x+10, et.y+30, 2,1); et.ss.add(s); new Thread(s).start(); ets.add(et);//加入 } } else { java写的坦克大战简易版 5 / 26 nodes=new Recorder().getNodesAndEnNums(); //初始化敌人的坦克 for(int i=0;i{
Node node=nodes.get(i); //创建一辆敌人的坦克对象 EnemyTank et=new EnemyTank(node.x,node.y); et.setColor(0); et.setDirect(node.direct); //将MyPanel的敌人坦克向量交给该敌人坦克 et.setEts(ets); //启动敌人的坦克 Thread t=new Thread(et); t.start(); //给敌人的坦克添加一颗子弹 Shot s=new Shot(et.x+10, et.y+30, 2,1); et.ss.add(s); new Thread(s).start(); ets.add(et);//加入 } } /*try { image1=ImageIO.read(new File("/bomb_1.gif")); image2=ImageIO.read(new File("/bomb_2.gif")); image3=ImageIO.read(new File("/bomb_3.gif"));
} catch (Exception e) { e.printStackTrace(); // TODO: handle exception }*/ //播放开战声音 AePlayWave apw=new AePlayWave("F:\\myjava\\day9\\坦克大战\\TankGamae13\\src\\111.wav"); apw.start(); //初始化图片
image1=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/bomb_1.gif"));
image2=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/bomb_2.gif"));
image3=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/bomb_3.gif")); }
【java版坦克大战--事件处理】坦克动起来了
【java版坦克⼤战--事件处理】坦克动起来了折腾了这么久,坦克总算能动了。
只贴代码编辑不给上⾸页,花了半个⼩时的时间写了n多注释。
再顺便把绘图的原理发在这⾥:绘图原理Component类提供了两个和绘图有关的重要⽅法:① paint(Graphics g)绘制组件的外观.② repaint()刷新组件的外观当组件第⼀次在屏幕显⽰的时候,程序会⾃动调⽤paint()⽅法绘制组件.类 Paneljava.awt.Panel在上⼀节种public MyPanel extends Panel{public void paint(Graphics g){super.paint(g);g.drawRect();…}}现在可以为什么MyPanel继承了Panel就会有paint⽅法,可以画图了.在以下情况下paint()⽅法将会被调⽤.1.窗⼝最⼩化,再最⼤化.2.窗⼝⼤⼩发⽣变化.3.repaint函数被调⽤.事件监听的步骤:⼀个类实现监听的步骤:1. 实现相应的接⼝(KeyListener,MouseListener,ActionListener,WindowListener)2. 实现对事件的处理⽅法3. 在事件源上注册监听MyTankGame21/**2 * 坦克游戏的2.0版3 * 1.画出坦克4 * 2.我的坦克可以上下左右移动5*/6package com.test5;78import java.awt.*;9import java.awt.event.*;10import javax.swing.*;1112public class MyTankGame2 extends JFrame {1314 MyPanel mp = null;15public static void main(String[] args) {16 MyTankGame2 myTankGame2 = new MyTankGame2();17 }18//构造函数19public MyTankGame2(){20 mp = new MyPanel();21this.add(mp);22//c)在事件源上注册监听,mp为监听器23this.addKeyListener(mp);2425this.setSize(400,300);26this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);27this.setVisible(true);28 }29 }30/*31 * 我的⾯板,不清楚为什么MyPanel继承Panel监听没有效果。
韩顺平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编程坦克大战源程序如下:图片自己添加,音乐为wav格式的:import javax.swing.*;import java.util.EventListener;import java.awt.*;import java.awt.event.*;import java.util.Vector;public class Tank1 extends JFrame implements ActionListener{MyPanel mb;passPanel pass;JMenuItem item1,item2;JMenu menu;JMenuBar bar;public static void main(String[] args){Tank1 tank=new Tank1();}public Tank1(){bar=new JMenuBar();menu=new JMenu("游戏(G)");menu.setMnemonic('G');//按Alt+F可以实现鼠标点击文件一样的功能item1=new JMenuItem("开始(N)");item2=new JMenuItem("退出(T)");item1.setMnemonic('N');item2.setMnemonic('T');item1.addActionListener(this);item1.setActionCommand("NEW");item2.addActionListener(this);item2.setActionCommand("OVER");menu.add(item1);menu.add(item2);bar.add(menu);pass=new passPanel();this.add(pass);Thread pa=new Thread(pass);pa.start();//起动关卡面板字体闪烁this.setJMenuBar(bar);this.setTitle("坦克游戏");this.setIconImage((new ImageIcon("tank.jpg")).getImage());this.setSize(700,700);this.setLocation(320,10);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.setVisible(true);}public void actionPerformed(ActionEvent e) {if(e.getActionCommand().equals("NEW")){mb=new MyPanel();this.remove(pass);//删除旧面板,也就是关卡面板this.add(mb);this.addKeyListener(mb);//监听Thread t1=new Thread(mb);t1.start();//运行MyPanel类中的run方法this.setVisible(true);//显示游戏面板}if(e.getActionCommand().equals("OVER")){System.exit(0);}}}class passPanel extends JPanel implements Runnable{//关卡面板int time=0;//关卡面板闪烁时间public void paint(Graphics g){super.paint(g);g.fillRect(0,0,685,635);if(time%2==0){g.setColor(Color.green);Font myFont=new Font("华文行楷",Font.BOLD,60);g.setFont(myFont);g.drawString("坦克大战",220,300);}}public void run() {//闪烁功能while(true){try{Thread.sleep(500);}catch(Exception e){}time++;this.repaint();}}}class MyPanel extends JPanel implements KeyListener,Runnable{//自己定义的面板Vector<youTank> ytj=new Vector<youTank>();//定义敌方坦克,泛型,后面不用强制转换Vector<Burst> burst=new Vector<Burst>();//定义爆炸的集合Vector< MyTank> mytank=new Vector< MyTank>();MyTank mt=null;//定义一个我方坦克,Image tp1=null;//爆炸的图片Image tp2=null;Image tp3=null;Image tp4=null;Image tp5=null;Image tp6=null;int ytNum=3;//敌方坦克数量public MyPanel(){mt=new MyTank(310,500);//我方坦克出现位置mytank.add(mt);//添加集合mytank中for(int i=0;i<ytNum;i++){//敌方坦克youTank yt=new youTank((i)*300+10,50);yt.setDirect(1);yt.YT(ytj);//使得集合ytj一样Thread t3=new Thread(yt);t3.start();//启动敌方坦克线程Bullet yb=new Bullet(yt.x+27,yt.y+40,1);//定义敌方子弹yt.ybt.add(yb);Thread t4=new Thread(yb);t4.start();//子弹线程ytj.add(yt);//添加到敌方坦克集合中}//定义三张爆炸图片tp1=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/bz.jpg"));tp2=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/bz1.jpg"));tp3=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/bz2.jpg"));tp4=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/boss.jpg"));tp5=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/boss1.jpg"));tp6=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/boss2.jpg"));music sta=new music("./tank.wav");//音乐线程sta.start();}public void numbers(Graphics g){//显示敌我两方的坦克信息if(ytj.size()==0){//闯过关卡g.setColor(Color.green);Font myFont1=new Font("华文行楷",Font.BOLD,60);g.setFont(myFont1);g.drawString("闯关成功",220,300);}if(number.getMy()==-1||number.getBossCount()==-1){//我方被攻击完,或者boss灭亡g.setColor(Color.green);Font myFont1=new Font("华文行楷",Font.BOLD,100);g.setFont(myFont1);g.drawString("game over",180,300);}Font myFont=new Font("楷体",Font.BOLD,20);g.setFont(myFont);g.setColor(Color.red);//把血量设置为红色g.drawString("生命:",10,25);if(number.getMy()==-1){int J=number.getMy()+1;g.drawString(J+"",70, 25);}else{g.drawString(number.getMy()+"",70, 25);}g.fillRect(90,10,number.getMyCount()*60,15);g.drawRect(90,10,300,15);g.setColor(Color.green);g.drawString("得分: "+number.getScore(),10, 50); //击中敌方坦克数量g.setColor(Color.blue);g.drawString(":生命",630,25);g.drawString(number.getYou()+"",610,25);g.drawString(1+"",410,25);g.drawString(2+"",410,45);g.drawString(3+"",410,65);g.drawRect(430,30,170,15);g.drawRect(430,10,170,15);g.drawRect(430,50,170,15);try{g.fillRect(430,10,ytj.get(0).youCount*85,15);g.fillRect(430,30,ytj.get(1).youCount*85,15);g.fillRect(430,50,ytj.get(2).youCount*85,15);}catch(Exception e){}}public void paint(Graphics g){super.paint(g);g.fillRect(0,0,685,635);//对面板也就是画布进行填充黑色if(number.getBossCount()==3){g.drawImage(tp4,280,560,140,80,this);//添加boss}if(number.getBossCount()==2){g.drawImage(tp5,300,580,120,60,this);//添加boss}if(number.getBossCount()==1){g.drawImage(tp6,320,600,100,40,this);//添加boss}this.numbers(g);//启动numbers方法if(number.getMy()>=0){this.myDrawTank(mytank.get(0).getX(),mytank.get(0).getY(),g,mytank.get(0).direct,0);//对坦克进行制作}//g后面第一个代表方向,第二个代表我方和敌方坦克for(int i=0;i<ytj.size();i++){//敌方坦克youTank yt1=ytj.get(i);if(yt1.youCount!=0){//可以不带truethis.myDrawTank(yt1.getX(),yt1.getY(),g,yt1.direct,1);for(int j=0;j<yt1.ybt.size();j++){Bullet yb=yt1.ybt.get(j);//取集合类中的子弹if(yb!=null&&yb.limit==true){//使得子弹不能连接成一条线,limit控制子弹走到面板边界g.setColor(Color.blue);g.fillOval(yb.x,yb.y,10,10);}if(yb.limit==false){//如子弹到达边界时,则把这个子弹从集合类中删去yt1.ybt.remove(yb);}}}}for(int i=0;i<mytank.get(0).a.size();i++){Bullet bt1=mytank.get(0).a.get(i);//取集合类中的子弹if(bt1!=null&&bt1.limit==true){//使得子弹不能连接成一条线,limit控制子弹走到面板边界g.setColor(Color.red);g.fillOval(bt1.x,bt1.y,10,10);}if(bt1.limit==false){//如子弹到达边界时,则把这个子弹从集合类中删去mytank.get(0).a.remove(bt1);}}for(int i=0;i<burst.size();i++){//绘画出爆炸的效果Burst bt=burst.get(i);if(bt.time>6){g.drawImage(tp1,bt.x,bt.y,50,45,this);}else if(bt.time>3){g.drawImage(tp2,bt.x,bt.y,30,25,this);}else {g.drawImage(tp3,bt.x,bt.y,10,5,this);}bt.reduce();if(bt.time==0){burst.remove(bt);}}}public void hit(Bullet bt,Tank tk){//子弹击中坦克判断方法switch(tk.direct){//敌方坦克方向,如果子弹在坦克长宽大小范围内,则同时消失case 0:case 1:if(bt.x>tk.x&&bt.x<tk.x+65&&bt.y>tk.y&&bt.y<tk.y+50){tk.life=false;bt.limit=false;}break;case 2:case 3:if(bt.x>tk.x&&bt.x<tk.x+50&&bt.y>tk.y&&bt.y<tk.y+65){tk.life=false;bt.limit=false;}break;}}public void Life(int a){//坦克死亡和添加if(a==0){if(number.getYou()>0){ //如果敌方坦克还未出来的number.youNum();//坦克减少youTank yt=new youTank(number.getYou()*70,50);yt.setDirect(1);//设置坦克方向ytj.add(yt);yt.YT(ytj);//使得集合ytj一样Thread t6=new Thread(yt);t6.start();//启动敌方坦克线程}}if(a==1){if(number.getMyCount()==0){//如果被敌方击中5次Burst by1=new Burst(mytank.get(0).x,mytank.get(0).y);//添加爆炸burst.add(by1);if(number.getMy()>=0){number.myNum();//我方减少}if(number.getMy()>=0){mytank.remove(0);MyTank mt1=new MyTank(310,500);//我方坦克出现位置mytank.add(mt1);//添加集合mytank中number.setMyCount(5);}}}}public void myDrawTank(int x,int y,Graphics g,int direct,int form){//direct 意思是坦克的左右上下方向//form 意思是敌方和我方的坦克不一样,0代表我方,1代表敌方switch(form){case 0:g.setColor(Color.red);break;case 1:g.setColor(Color.blue);break;}switch(direct){case 0://代表坦克朝上g.fill3DRect(x,y,20,50,false);//矩形,前两个坐标,后长宽g.fill3DRect(x+20,y+10,24,30,false);//矩形,前两个坐标,后长宽g.fill3DRect(x+44,y,20,50,false);//矩形,前两个坐标,后长宽g.fill3DRect(x+27,y-20,10,30,false);g.fillOval(x+22,y+16,18,18);//画个圆break;case 1://代表朝下,改变直线位置g.fill3DRect(x,y,20,50,false);g.fill3DRect(x+20,y+10,24,30,false);g.fill3DRect(x+44,y,20,50,false);g.fill3DRect(x+27,y+40,10,30,false);g.fillOval(x+22,y+16,18,18);break;case 2://朝右g.fill3DRect(x,y,50,20,false);g.fill3DRect(x+10,y+20,30,24,false);g.fill3DRect(x,y+44,50,20,false);g.fill3DRect(x-20,y+27,30,10,false);g.fillOval(x+16,y+22,18,18);break;case 3://朝左g.fill3DRect(x,y,50,20,false);g.fill3DRect(x+10,y+20,30,24,false);g.fill3DRect(x,y+44,50,20,false);g.fill3DRect(x+40,y+27,30,10,false);g.fillOval(x+16,y+22,18,18);break;}}@Overridepublic void keyTyped(KeyEvent e) {}public void keyReleased(KeyEvent e) {}public void keyPressed(KeyEvent e) {if(e.getKeyCode()==KeyEvent.VK_W){this.mytank.get(0).setDirect(0);this.mytank.get(0).north();}else if(e.getKeyCode()==KeyEvent.VK_S){this.mytank.get(0).setDirect(1);this.mytank.get(0).south();}else if(e.getKeyCode()==KeyEvent.VK_A){this.mytank.get(0).setDirect(2);this.mytank.get(0).right();}else if(e.getKeyCode()==KeyEvent.VK_D){this.mytank.get(0).setDirect(3);this.mytank.get(0).left();}if(e.getKeyCode()==KeyEvent.VK_SPACE){//空格键控制子弹if(this.mytank.get(0).a.size()<10){//当子弹集合类中子弹数达到10个时,则不再发射子弹this.mytank.get(0).send();}}this.repaint();}@Overridepublic void run(){//让睡眠之后再重新绘制画面,就是为了让子弹自己运动while(true) {try{Thread.sleep(100);}catch(Exception e){}for(int i=0;i<ytj.size();i++){//boss被击中youTank yt2=ytj.get(i);for(int j=0;j<yt2.ybt.size();j++){Bullet by=yt2.ybt.get(j);if(number.getBossCount()==3){if(by.x>280&&by.x<420&&by.y>560){by.limit=false;number.BossCount();}}if(number.getBossCount()==2){if(by.x>300&&by.x<400&&by.y>580){by.limit=false;number.BossCount();}}if(number.getBossCount()==1){if(by.x>320&&by.x<400&&by.y>600){by.limit=false;number.BossCount();}}if(number.getBossCount()==0){number.BossCount();Burst by2=new Burst(340,600);//添加爆炸burst.add(by2);}}}for(int i=0;i<mytank.get(0).a.size();i++){//敌方,每个子弹都和每个敌方坦克比较Bullet bt2=mytank.get(0).a.get(i);//取出子弹if(bt2.limit){//如果子弹limit为truefor(int j=0;j<ytj.size();j++){youTank yt1=ytj.get(j);//取出敌方坦克if(yt1.life){this.hit(bt2,yt1);if(yt1.life==false){yt1.youCount--;yt1.life=true;if(yt1.youCount==0){ytj.remove(j);//如果死亡则删除number.scoreNum();//得分Burst by=new Burst(yt1.x,yt1.y);//添加爆炸burst.add(by);this.Life(0);}}}}}}for(int i=0;i<ytj.size();i++){//我方坦克是否被击中youTank yt2=ytj.get(i);for(int j=0;j<yt2.ybt.size();j++){Bullet by=yt2.ybt.get(j);this.hit(by,mytank.get(0));if(mytank.get(0).life==false){//我方坦克被击中number.myCountNum();//被击中mytank.get(0).life=true;//复活this.Life(1);}}}this.repaint();//在for外面,不然敌方坦克不能动}}}import java.io.File;import java.util.Vector;import javax.sound.sampled.AudioFormat;import javax.sound.sampled.AudioInputStream;import javax.sound.sampled.AudioSystem;import javax.sound.sampled.DataLine;import javax.sound.sampled.SourceDataLine;class Tank{int x=0,y=0;int direct=0;//坦克方向0代表向上,1代表向下,2代表向右,3代表向左int speed=10;//坦克速度boolean life=true;//定义坦克的生命死亡public int getDirect() {return direct;}public void setDirect(int direct) {this.direct = direct;}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 Tank(int x,int y){//构造函数this.x=x;this.y=y;}}class MyTank extends Tank{//我方坦克,继承坦克类,子弹跟着坦克走Vector<Bullet> a=new Vector<Bullet>();//把子弹放到一个集合类中Bullet bt=null;//定义子弹public MyTank(int x,int y){super(x,y);}public void send(){//发射子弹方法switch(this.direct){//我方子弹方向和坦克方向一样,this.direct为Tank中的case 0:bt=new Bullet(x+27,y,0);//最后的0为子弹方向a.add(bt);//添加子弹break;case 1:bt=new Bullet(x+27,y+40,1);a.add(bt);break;case 2:bt=new Bullet(x,y+27,2);a.add(bt);break;case 3:bt=new Bullet(x+44,y+27,3);a.add(bt);break;}Thread t2=new Thread(bt);t2.start();//子弹的run方法,Bullet类中的}public void north(){//向上运动if(y>50){y-=speed;}}public void south(){if(y<570){y+=speed;}}public void right(){if(x>0){x-=speed;}}public void left(){if(x<620){x+=speed;}}}class youTank extends Tank implements Runnable{//敌方坦克,继承坦克类int speed=2;//可以继承坦克类的速度,也可以自己再定义int time=0;//时间int youCount=2;//敌方被击中次数Vector<Bullet> ybt=new Vector<Bullet>();//定义敌方坦克子弹集合Vector<youTank> ytj=new Vector<youTank>();public youTank(int x,int y){super(x,y);}public void YT(Vector<youTank> ytjh){this.ytj=ytjh;}public boolean crash(){boolean b=false;switch(this.direct){case 0:for(int i=0;i<ytj.size();i++){youTank yt=ytj.get(i);if(yt!=this){if(yt.direct==0||yt.direct==1){if(this.x>=yt.x && this.x<=yt.x+65 && this.y>=yt.y && this.y<=yt.y+50){return true;}if(this.x+65>=yt.x && this.x+65<=yt.x+65 && this.y>=yt.y && this.y<=yt.y+50){return true;}}if(yt.direct==3||yt.direct==2){if(this.x>=yt.x && this.x<=yt.x+50 && this.y>=yt.y && this.y<=yt.y+65){return true;}if(this.x+65>=yt.x && this.x+65<=yt.x+50 && this.y>=yt.y && this.y<=yt.y+65){return true;}}}}break;case 1:for(int i=0;i<ytj.size();i++){youTank yt=ytj.get(i);if(yt!=this){if(yt.direct==0||yt.direct==1){if(this.x>=yt.x&&this.x<=yt.x+65&&this.y>=yt.y&&this.y<=yt.y+50){return true;}if(this.x>=yt.x&&this.x<=yt.x+65&&this.y+65>=yt.y&&this.y+65<=yt.y+50){return true;}}if(yt.direct==3||yt.direct==2){if(this.x>=yt.x&&this.x<=yt.x+50&&this.y>=yt.y&&this.y<=yt.y+65){return true;}if(this.x>=yt.x&&this.x<=yt.x+50&&this.y+65>=yt.y&&this.y+65<=yt.y+65){return true;}}}}break;case 2:for(int i=0;i<ytj.size();i++){youTank yt=ytj.get(i);if(yt!=this){if(yt.direct==0||yt.direct==1){if(this.x>=yt.x&&this.x<=yt.x+65&&this.y+50>=yt.y&&this.y+50<=yt.y+50){return true;}if(this.x+65>=yt.x&&this.x+65<=yt.x+65&&this.y+50>=yt.y&&this.y+50<=yt.y+50){return true;}}if(yt.direct==3||yt.direct==2){if(this.x>=yt.x&&this.x<=yt.x+50&&this.y+50>=yt.y&&this.y+50<=yt.y+65){return true;}if(this.x+65>=yt.x&&this.x+65<=yt.x+50&&this.y+50>=yt.y&&this.y+50<=yt.y+65){return true;}}}}break;case 3:for(int i=0;i<ytj.size();i++){youTank yt=ytj.get(i);if(yt!=this){if(yt.direct==0||yt.direct==1){if(this.x+50>=yt.x && this.x+50<=yt.x+65 && this.y>=yt.y && this.y<=yt.y+50){return true;}if(this.x+50>=yt.x && this.x+50<=yt.x+65 && this.y+65>=yt.y && this.y+65<=yt.y+50){return true;}}if(yt.direct==3||yt.direct==2){if(this.x+50>=yt.x && this.x+50<=yt.x+50 && this.y>=yt.y && this.y<=yt.y+65){return true;}if(this.x+50>=yt.x && this.x+50<=yt.x+50 && this.y+65>=yt.y && this.y+65<=yt.y+65){return true;}}}}break;}return b;}public void run() {while(true){//坦克要一直活动,直到死亡switch(this.direct){case 0:for(int i=0;i<25;i++){if(y>50&&crash()==false){y-=speed;}try{Thread.sleep(50);}catch(Exception e){}}break;case 1:for(int i=0;i<25;i++){if(y<570&&crash()==false){y+=speed;}try{Thread.sleep(50);}catch(Exception e){}}break;case 2:for(int i=0;i<25;i++){if(x>0&&crash()==false){x-=speed;}try{Thread.sleep(50);}catch(Exception e){}}break;case 3:for(int i=0;i<25;i++){if(x<620&&crash()==false){x+=speed;}try{Thread.sleep(50);}catch(Exception e){}}break;}this.direct=(int)(Math.random()*4);//0到3之间的数字if(this.youCount==0){//如果坦克死亡break;}this.time++;if(time%2==0){//可以加,也可以不加if(this.youCount!=0){//没有死亡if(ybt.size()<6){//敌方坦克可以发射的子弹数Bullet yb=null;switch(direct){//坦克方向case 0:yb=new Bullet(x+27,y,0);//最后的0为子弹方向ybt.add(yb);break;case 1:yb=new Bullet(x+27,y+40,1);ybt.add(yb);break;case 2:yb=new Bullet(x,y+27,2);ybt.add(yb);break;case 3:yb=new Bullet(x+44,y+27,3);ybt.add(yb);break;}Thread t5=new Thread(yb);//子弹线程t5.start();}}}}}}class Bullet implements Runnable{//创建子弹类,实现线程接口int x;int y;int direct;//子弹方向int speed=5;//子弹速度boolean limit=true;//控制子弹走到面板边界public Bullet(int x,int y,int direct){this.x=x;this.y=y;this.direct=direct;}public void run() {while(true){//凡是线程下死循环就要有个睡眠try{Thread.sleep(50);}catch(Exception e){}switch(this.direct){//this.direct为本类中的case 0:y-=speed;break;case 1:y+=speed;break;case 2:x-=speed;break;case 3:x+=speed;break;}if(x<0||x>680||y<0||y>630){//控制子弹走到面板边界this.limit=false;break;}}}}class Burst{//定义爆炸类int x,y;int time=9;//生存时间boolean life=true;public Burst(int x,int y){this.x=x;this.y=y;}public void reduce(){if(time>0){time--;}else{this.life=false;}}}class number{//记录敌我两方的坦克数量private static int my=2;//我方还剩余人数private static int you=7;//还剩余人数private static int score=0;//得分private static int myCount=5;//我方被击中次数private static int bossCount=3;//boss只能被攻击三次public static int getBossCount() {return bossCount;}public static void setBossCount(int bossCount) {number.bossCount = bossCount;}public static int getScore() {return score;}public static void setScore(int score) {number.score = score;}public static int getMyCount() {return myCount;}public static void setMyCount(int myCount) {number.myCount = myCount;}public static int getMy() {return my;}public static void setMy(int my) {number.my = my;}public static int getYou() {return you;}public static void setYou(int you) {number.you = you;}public static void youNum(){//敌方减少you--;}public static void myNum(){//我方减少my--;}public static void myCountNum(){//被击中myCount--;}public static void scoreNum(){//得分score++;}public static void BossCount(){bossCount--;}}class music extends Thread {//插入音乐private String mus;public music(String musi){mus=musi;}public void run() {File file = new File(mus);AudioInputStream input = null;try {input = AudioSystem.getAudioInputStream(file);} catch (Exception e){}AudioFormat format = input.getFormat();SourceDataLine data = null; info = new (SourceDataLine.class, format);try {data = (SourceDataLine) AudioSystem.getLine(info);data.open(format);} catch (Exception e){}data.start();int str = 0;byte[] byt = new byte[1024];try {while (str != -1) {str = input.read(byt, 0, byt.length);if (str >= 0)data.write(byt, 0, str );}} catch (Exception e){}finally {data.drain();//将残留部分处理干净data.close();}}}。
JAVA课程设计 坦克大战
得分显示:在游戏 界面实时显示得分 情况,方便玩家了 解游戏进度
减少内存占用:优 化数据结构,减少 不必要的内存分配
提高渲染效率: 优化渲染算法, 减少渲染时间
优化网络通信:减 少网络延迟,提高 网络通信效率
优化AI算法:提高 AI算法的效率和准 确性,提高游戏体 验
界面布局:合 理规划界面布 局,提高用户
玩家需要控制坦克,消灭敌 人,保护自己的基地
游戏支持多人在线对战,玩 家可以与朋友一起挑战
玩家控制 坦克,在 战场上与 敌人战斗
坦克可以 发射炮弹, 摧毁敌人 或障碍物
玩家需要 躲避敌人 的攻击, 保护自己 的坦克
游戏有各 种关卡, 难度逐渐 增加
玩家可以 通过升级 坦克,提 高战斗力
游戏支持 多人在线 对战,增 加游戏乐 趣
生命值耗尽:当 玩家的生命值降 至0时,游戏结束
时间耗尽:当游 戏时间耗尽时, 游戏结束
胜利条件:当玩 家达到胜利条件 时,游戏结束
失败条件:当玩 家达到失败条件 时,游戏结束
得分规则:击毁敌 方坦克得分,被敌 方坦克击毁扣分
得分方式:根据击 毁敌方坦克的数量 和难度计算得分
得分限制:得分上 限为1000分,达到 上限后不再增加得 分
,a click to unlimited possibilities
汇报人:
01
02
03
04
05
06
游戏类型:坦克大战
游戏背景:二战时期
游戏目标:摧毁敌方坦克,保 护自己的基地
游戏玩法:玩家控制坦克,通 过射击和躲避来消灭敌方坦克
游戏包含多个关卡,每个关 卡有不同的难度和挑战
设计一款坦克大战游戏
游戏界面:包括 菜单、地图、角 色、道具等元素
Java坦克大战项目
Java坦克大战项目创建一个完整的Java坦克大战项目是一个庞大的任务,无法在一个简短的回答中完成。
不过,我可以为你提供一个项目的基本框架和一些关键概念,以帮助你入门。
你可以根据这些提示逐步构建项目。
游戏引擎选择:首先,你需要选择一个Java游戏引擎或库,用于处理游戏的图形渲染、事件处理和物理模拟。
一些常见的选择包括LibGDX、JavaFX、Slick2D等。
根据你的经验和需求选择一个适合的引擎。
游戏窗口:创建一个游戏窗口,用于显示游戏画面。
这个窗口将包含游戏中的所有元素。
坦克和地图设计:设计坦克和游戏地图的图形。
你可以使用图像编辑工具创建坦克、障碍物和地图背景。
确保这些图像在游戏中能够被加载和渲染。
坦克控制:实现玩家和敌方坦克的控制。
你需要编写代码来处理玩家输入,例如上、下、左、右键来移动坦克,并且能够射击。
碰撞检测:编写碰撞检测逻辑,以便坦克能够检测到障碍物和敌方坦克,以及子弹能够击中目标。
当两个物体相撞时,需要处理相应的行为,如坦克的爆炸效果。
游戏逻辑:实现游戏规则,包括分数、关卡切换、游戏结束等。
考虑添加一些额外的元素,如道具、敌方AI等,以增加游戏的趣味性。
音效和音乐:为游戏添加音效和背景音乐,增强游戏体验。
用户界面:创建游戏的用户界面,包括开始菜单、游戏界面和游戏结束画面。
游戏循环:实现游戏循环,确保游戏画面能够以恒定的帧率更新,通常是30或60帧每秒。
测试和调试:在开发过程中进行测试和调试,确保游戏运行稳定并且没有严重的bug。
发布:一旦你的游戏完成,你可以将其打包为可执行文件或部署到Web上,以供其他人玩。
创建一个完整的Java坦克大战项目需要大量的代码和资源,不可能在这里提供所有的代码,但我可以为你提供一个简单的示例,涵盖了一些基本的概念,你可以基于这个示例来扩展你的项目。
首先,你需要创建一个Java类,来表示坦克:import java.awt.Color;import java.awt.Graphics;public class Tank {private int x, y; // 坦克的坐标private int speed; // 坦克的移动速度public Tank(int x, int y) {this.x = x;this.y = y;this.speed = 5;}public void move(String direction) {if (direction.equals("UP")) {y -= speed;} else if (direction.equals("DOWN")) {y += speed;} else if (direction.equals("LEFT")) {x -= speed;} else if (direction.equals("RIGHT")) {x += speed;}}public void draw(Graphics g) {g.setColor(Color.RED);g.fillRect(x, y, 30, 30); // 画一个红色的坦克}}接下来,你需要创建一个Java主类,用于处理游戏循环和用户输入:import javax.swing.*;import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.KeyAdapter;import java.awt.event.KeyEvent;public class TankGame extends JPanel implements ActionListener { private Tank playerTank;public TankGame() {playerTank = new Tank(100, 100);// 添加键盘事件监听器addKeyListener(new KeyAdapter() {@Overridepublic void keyPressed(KeyEvent e) {int key = e.getKeyCode();if (key == KeyEvent.VK_W) {playerTank.move("UP");} else if (key == KeyEvent.VK_S) {playerTank.move("DOWN");} else if (key == KeyEvent.VK_A) {playerTank.move("LEFT");} else if (key == KeyEvent.VK_D) {playerTank.move("RIGHT");}}});setFocusable(true);Timer timer = new Timer(100, this); // 创建一个定时器timer.start();}@Overridepublic void actionPerformed(ActionEvent e) {repaint();}@Overrideprotected void paintComponent(Graphics g) {super.paintComponent(g);playerTank.draw(g);}public static void main(String[] args) {JFrame frame = new JFrame("Tank Game");TankGame tankGame = new TankGame();frame.add(tankGame);frame.setSize(800, 600);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setVisible(true);}}这只是一个简单的开始,你可以在此基础上继续扩展和改进你的坦克大战项目。
基于java的游戏坦克大战论文
目录摘要 (I)ABSTRACT (II)第一章绪论 (1)1.1课题研究的背景 (1)1.2课题研究的任务 (1)第二章系统分析 (2)2.1课题的可行性分析 (2)2.2需求分析 (2)第三章系统总体设计 (3)3.1游戏总体流程设计 (3)3.2游戏界面设计 (4)第四章游戏详细设计 (6)4.1各个类的实现 (6)4.2程序的详细设计 (7)第五章测试 (9)5.1软件测试说明 (9)5.1.1 软件测试的目标 (9)5.1.2 软件测试的原则 (9)5.2测试计划 (10)5.2.1 进行通过测试 (10)5.2.2 进行有效类测试 (10)5.3测试用例 (10)总结 (10)参考文献 (11)致 (12)附录一坦克大战中的类 (15)附录二坦克大战程序 (31)毕业设计(论文)原创性声明和使用授权说明原创性声明本人重承诺:所呈交的毕业设计(论文),是我个人在指导教师的指导下进行的研究工作及取得的成果。
尽我所知,除文中特别加以标注和致的地方外,不包含其他人或组织已经发表或公布过的研究成果,也不包含我为获得及其它教育机构的学位或学历而使用过的材料。
对本研究提供过帮助和做出过贡献的个人或集体,均已在文中作了明确的说明并表示了意。
作者签名:日期:指导教师签名:日期:使用授权说明本人完全了解大学关于收集、保存、使用毕业设计(论文)的规定,即:按照学校要求提交毕业设计(论文)的印刷本和电子版本;学校有权保存毕业设计(论文)的印刷本和电子版,并提供目录检索与阅览服务;学校可以采用影印、缩印、数字化或其它复制手段保存论文;在不以赢利为目的前提下,学校可以公布论文的部分或全部容。
作者签名:日期:学位论文原创性声明本人重声明:所呈交的论文是本人在导师的指导下独立进行研究所取得的研究成果。
除了文中特别加以标注引用的容外,本论文不包含任何其他个人或集体已经发表或撰写的成果作品。
对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式标明。
坦克大战设计
湖北大学J A V A课程设计论文题目坦克大战游戏姓名张诚学号 ****************姓名柳谦学号 ****************专业年级计算机科学与技术1401 指导教师王雷春职称副教授2016年 5月目录绪论 (4)1背景 (4)2课程设计目标及目的 (5)2.1课程设计的目标 (5)2.2课程设计的目的 (5)2.3可行性分析 (5)2.3.1技术可行性 (5)2.3.2经济可行性分析 (6)3概要设计 (6)4详细设计 (7)4.1项目与类的结构图 (7)4.2 各类实现的功能概要 (7)4.2.1 barrier包 (7)4.2.2 lightButton包 (7)4.2.3 Tankwar包 (7)4.2.4 mapediter包 (8)4.3 主要类的的UML图及主要成员变量和函数说明 (8)4.3.1 Barrier类 (8)4.3.2 LightButton类 (11)4.3.3 Mapediter类 (13)4.3.4 Main类 (15)4.3.5 Boom类 (18)4.3.6 Item类 (18)4.3.7 Missle类 (21)4.3.8 PanelShow类 (25)4.3.9 Tank类 (26)4.3.10 TankWar 类 (33)5运行结果 (40)6总结 (47)7参考文献 (47)8附录 (48)坦克大战摘要坦克大战是一款最初由日本南梦宫Namco游戏公司1985年在任天堂FC平台上,推出的一款多方位平面射击游戏。
一经推出,人气十分高涨,然后又陆续推出了GB,PC等版本,玩法也大大扩充,由最初的单人2D过关演变到如今的多人3D联网对战游戏,我们小时候应该都体验过,之前C#课程中已经了解过有关信息,如今就想同样以Java为载体编写一款坦克大战。
本课题展示了如何使用Java编写出能够实际运行的单人版坦克大战游戏。
课题介绍了项目的功能、类的设计和逻辑难点等重要点。
坦克大战第一节——画出自己的坦克(新手篇)
坦克⼤战第⼀节——画出⾃⼰的坦克(新⼿篇)刚刚开始学习Java,对Java不是很熟悉,但是⾃⼰的兴趣挺喜欢Java。
现在⾃⼰在⾃学Java做⼀个⼩游戏,坦克⼤战。
⾃⼰现在完成了画出⾃⼰的坦克和坦克的移动⽅向。
希望各位⼤神指导⼀下我这个刚刚学Java的新⼿⼩⽩。
我会每完成⼀个阶段,就更新⼀下博客,跟进⼀下⾃⼰的学习进度。
在做这个坦克⼤战的时候,不知道从哪⾥开始做起,再来⾃⼰就觉得先画出⾃⼰的坦克吧。
下⾯是创建坦克类(⽅便以后能创建更加多的坦克),再创建⾃⼰的坦克继承坦克类。
package tankgames;import java.awt.*;//创建坦克类public class Tank {int x,y,w,h;int speed;int direct;Color c1,c2,c3;public Tank(){x=230;y=300;w=5;h=60;speed=10;direct=0;}public Tank(int x, int y, int w, int h, int speed, int direct) {super();this.x = x;this.y = y;this.w = w;this.h = h;this.speed = speed;this.direct = direct;}}//创建我的坦克⼦类class MyTank extends Tank{//创建颜⾊对象,并设置颜⾊public MyTank(){this.c1 = new Color(128,128,128);this.c2 = new Color(0,255,0);this.c3 = new Color(0,0,255);}public MyTank(int x, int y, int w, int h, int speed, int direct) {super(x, y, w, h, speed, direct);this.c1 = new Color(128,128,128);this.c2 = new Color(0,255,0);this.c3 = new Color(0,0,255);}}创建完⾃⼰的坦克,要写个主函数来画出⾃⼰的坦克,以下是画出⾃⼰的坦克:package tankgames;import java.awt.*;import java.awt.event.KeyEvent;import java.awt.event.KeyListener;import javax.swing.*;public class TankGame extends JFrame{private static final long serialVersionUID = 1L;MyPanel mp;public static void main(String[] args) {new TankGame().setVisible(true);}public TankGame(){this.setTitle("坦克⼤战");this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.setResizable(false);this.setBounds(100, 100, 600, 500);//创建我的⾯板对象,并添加到我的窗体⾥⾯mp = new MyPanel();this.getContentPane().add(mp);//注册键盘事件监听this.addKeyListener(mp);}}//创建我的⾯板⼦类class MyPanel extends JPanel implements KeyListener{MyTank myTank;private static final long serialVersionUID = 1L;public MyPanel(){this.setLayout(null);myTank = new MyTank();}//⾯板容器的设置和组件在⾯板容器⾥显⽰public void paint(Graphics g){super.paint(g);g.setColor(new Color(255,255,221));g.fill3DRect(0, 0, 500, 400, false);drawTank(myTank,g);}//画坦克public void drawTank(Tank t,Graphics g){int x = t.x, y = t.y, w = t.w, h = t.h;//画出向上的坦克if(t.direct == 0){Graphics2D g2d = (Graphics2D)g;g.setColor(t.c1);g.fill3DRect(x, y, w, h, false);g.fill3DRect(x+7*w, y, w, h, false);g.setColor(t.c2);g.fill3DRect(x+w, y+2*w, 6*w, 8*w, false);g.fillOval(x+2*w, y+4*w, 4*w, 4*w);g2d.setColor(t.c3);g2d.setStroke(new BasicStroke(5.0f));g2d.drawLine(x+4*w, y, x+4*w, y+6*w);}//画出向下的坦克else if(t.direct == 2){Graphics2D g2d = (Graphics2D)g;g.setColor(t.c1);g.fill3DRect(x, y, w, h, false);g.fill3DRect(x+7*w, y, w, h, false);g.setColor(t.c2);g.fill3DRect(x+w, y+2*w, 6*w, 8*w, false);g.fillOval(x+2*w, y+4*w, 4*w, 4*w);g2d.setColor(t.c3);g2d.setStroke(new BasicStroke(5.0f));g2d.drawLine(x+4*w, y+6*w, x+4*w, y+12*w);}//画出向左的坦克else if(t.direct == 3){Graphics2D g2d = (Graphics2D)g;g.setColor(t.c1);g.fill3DRect(x, y, h, w, false);g.fill3DRect(x, y+7*w, h, w, false);g.setColor(t.c2);g.fill3DRect(x+2*w, y+w, 8*w, 6*w, false);g.fillOval(x+4*w, y+2*w, 4*w, 4*w);g2d.setColor(t.c3);g2d.setStroke(new BasicStroke(5.0f));g2d.drawLine(x, y+4*w, x+6*w, y+4*w);}//画出向右的坦克else if(t.direct ==1){Graphics2D g2d = (Graphics2D)g;g.setColor(t.c1);g.fill3DRect(x, y, h, w, false);g.fill3DRect(x, y+7*w, h, w, false);g.setColor(t.c2);g.fill3DRect(x+2*w, y+w, 8*w, 6*w, false);g.fillOval(x+4*w, y+2*w, 4*w, 4*w);g2d.setColor(t.c3);g2d.setStroke(new BasicStroke(5.0f));g2d.drawLine(x+6*w, y+4*w, x+12*w, y+4*w);}}@Overridepublic void keyTyped(KeyEvent e) {}//我的坦克移动@Overridepublic void keyPressed(KeyEvent e) {//向左移动if(e.getKeyCode() == KeyEvent.VK_LEFT || e.getKeyCode() == KeyEvent.VK_A){myTank.x -= myTank.speed;myTank.direct = 3;}//向右移动else if(e.getKeyCode() == KeyEvent.VK_RIGHT || e.getKeyCode() == KeyEvent.VK_D){myTank.x += myTank.speed;myTank.direct = 1;}//向上移动else if(e.getKeyCode() == KeyEvent.VK_UP || e.getKeyCode() == KeyEvent.VK_W){myTank.y -= myTank.speed;myTank.direct =0;}//向下移动else if(e.getKeyCode() == KeyEvent.VK_DOWN || e.getKeyCode() == KeyEvent.VK_S){myTank.y += myTank.speed;myTank.direct = 2;}//关闭游戏else if(e.getKeyCode() == KeyEvent.VK_ESCAPE){System.exit(0);}//刷新图形this.repaint();}@Overridepublic void keyReleased(KeyEvent e) {}}我画⾃⼰的坦克只是计算好位置,画出图形。
坦克大战实验报告
坦克大战实验报告班级:1205 姓名:许广龙学号:121010182一、系统简介使用JAVA编写一个人机游戏,有开始启动面板(Stage 1),并有闪烁效果。
在开始面板中有游戏(G)和帮助(H)两个菜单。
其中游戏(G)菜单中有开始游戏(N)、退出游戏(E)、保存游戏(S)、继续游戏(C)选项;帮助(H)菜单中有关于坦克如何操作的提示信息。
玩家有1辆坦克(有3条命),电脑有6辆坦克,我的坦克可以通过键盘控制进行移动和发射子弹,敌人坦克可自由运动并自动发射子弹。
敌人坦克相互之间不能重叠,敌人坦克与我的坦克不能重叠,我的坦克与敌人坦克不能重叠。
当子弹击中坦克时坦克死亡,并显示爆炸效果。
当我的坦克生命为0时游戏结束(显示GAMEOVER),当敌方的所有坦克死亡时游戏结束(显示VICTORY)。
二、需求分析设计一个图形用户界面,将所有游戏的元素都能在此用于界面上表现出来,界面能够接受用户的操作,具有人机交互功能。
用户可以选择开始游戏(N),退出游戏(E),保存游戏(S),继续游戏(C),游戏帮助(H)。
界面中包含我的坦克和敌人坦克以及坦克发出的子弹和爆炸后的效果。
坦克:坦克分为两种,敌人坦克和我的坦克。
我的坦克和敌人坦克均可以发射子弹,可以改变路径行走,且在行走过程中碰到边界或碰到其它坦克会自动换方向,坦克之间不能相互穿越。
子弹:子弹可以由敌方坦克和我的坦克发射,且发射出去的子弹可以直线移动,直到碰到其它坦克或超越边界就消失。
坦克受到一颗子弹攻击便死亡,死亡后坦克消失。
爆炸:当子弹射击到坦克身上时,要产生爆炸效果。
方向:坦克和子弹都有方向,可以选择上下左右四个方向,且子弹的方向从属于坦克的方向。
具体功能:1、坦克可以上下左右移动2、坦克可以发子弹(可以连发,最多5发子弹)3、当坦克中弹时,坦克消失,并显示爆炸效果。
4、我的坦克被击中后显示爆炸效果5、防止敌人坦克重叠运动、我的坦克与敌人坦克重叠运动、敌人坦克与我的坦克重叠运动6、玩游戏时可以保存游戏和继续游戏7、记录玩家的成绩三、系统设计程序流程图:总体框架:项目名:TankGame1主类文件:MyFrame.java坦克父类文件:Tank.java坦克子类(我的坦克):MyTank.java坦克子类(敌人坦克):EnemyTank.java我的面板:MyPanel.java子弹类:Shot.java开始面板:MyStartPanel.java记录类:Recorder.java爆炸类:Bomb.java四、详细设计(一) 、画坦克1、Tank类class Tank{int x,y;//坦克的位置int direct;//坦克的方向int color;//坦克的颜色,值为0时为的我的坦克,为1时为敌人的坦克int speed;public Tank(int x, int y) {this.x = x;this.y = y;}setter与getter方法(代码略)public void moveUp(){//向上移动,y坐标值减,方向值为0y-=speed;this.setDirect(0);}public void moveDown(){//向下移动,y坐标值增,方向值为2y+=speed;this.setDirect(0);}public void moveRight(){//向右移动,x坐标值增,方向值为1x+=speed;this.setDirect(0);}public void moveLeft(){//向左移动,x坐标值减,方向值为3x-=speed;this.setDirect(0);}}2、我的坦克类MyTankclass MyTank extends Tank{public MyTank(int x, int y) {super(x, y);}}3、主类MyFramepublic class MyFrame extends JFrame{MyPanel mp=null;public static void main(String[] args) {MyFrame tankGame1=new MyFrame();MyFrame.setVisible(true);}public MyFrame() {mp=new MyPanel();this.add(mp);this.setBounds(200,200,600,500);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}}4、在MyFrame.java中创建MyPanel类class MyPanel extends JPanel{MyTank mytank=null;public MyPanel(){mytank=new MyTank(200,200);//创建我的坦克并设置其初始位置}//重载MyPanel类的paint函数以实现画坦克public void paint(Graphics g)//窗口大小改变或重绘窗口时,执行repaint()时会自动调用{super.paint(g);g.fillRect(0,0,600,500);this.drawTank(mytank.getX(),mytank.getY(),mytank.getDirect(),mytank.getColor(), 5, g); }//在MyPanel画坦克的函数,参数包括坦克的位置、方向、类型(用于设置颜色)、画笔:public void drawTank(int x, int y, int direct, int color, int size,Graphics g) {switch (color) {case 0://我的坦克的颜色g.setColor(Color.cyan);break;case 1:g.setColor(Color.yellow);break;case 2://敌人坦克的颜色g.setColor(Color.green);break;}switch (direct) {case 0:g.fill3DRect(x, y, size, 6 * size, false);g.fill3DRect(x + 3 * size, y, size, 6 * size, false);g.fill3DRect(x + size, y + size, 2 * size, 4 * size, false);g.fillOval(x + size, y + 2 * size, 2 * size, 2 * size);g.drawLine(x + 2 * size, y, x + 2 * size, y + 3 * size);break;case 3:g.fill3DRect(x, y, 6 * size, size, false);g.fill3DRect(x, y + 3 * size, 6 * size, size, false);g.fill3DRect(x + size, y + size, 4 * size, 2 * size, false);g.fillOval(x + 2 * size, y + size, 2 * size, 2 * size);g.drawLine(x, y + 2 * size, x + 3 * size, y + 2 * size);break;case 1:g.fill3DRect(x, y, 6 * size, size, false);g.fill3DRect(x, y + 3 * size, 6 * size, size, false);g.fill3DRect(x + size, y + size, 4 * size, 2 * size, false);g.fillOval(x + 2 * size, y + size, 2 * size, 2 * size);g.drawLine(x + 6 * size, y + 2 * size, x + 3 * size, y + 2 * size);break;case 2:g.fill3DRect(x, y, size, 6 * size, false);g.fill3DRect(x + 3 * size, y, size, 6 * size, false);g.fill3DRect(x + size, y + size, 2 * size, 4 * size, false);g.fillOval(x + size, y + 2 * size, 2 * size, 2 * size);g.drawLine(x + 2 * size, y + 6 * size, x + 2 * size, y + 3 * size);break;}}(二)、移动坦克(事件监听)在主类注册键盘事件监听,在MyPanel类中实现事件监听。
java课设报告坦克大战
java课设报告坦克大战什么是Java课设报告坦克大战?Java课设报告坦克大战是一个基于Java编程语言开发的游戏项目。
它模拟了坦克战争的场景,玩家需要操控一辆坦克,与其他玩家或者电脑控制的敌人进行战斗,完成各种任务。
这个项目旨在提高学生的Java编程能力和团队协作能力。
第一步:需求分析和设计在开始编写代码之前,我们需要进行需求分析和设计。
首先,确定游戏的功能和玩法。
例如,游戏应该具有地图、坦克、子弹等基本元素,玩家可以使用键盘控制坦克的移动和攻击,坦克和子弹应该有相应的属性和行为,坦克应该能够与其他坦克进行交互等等。
其次,我们需要设计游戏的界面和用户交互方式,包括游戏的开始菜单、游戏画面、得分、生命值等界面元素。
最后,我们应该考虑游戏的可扩展性,使得我们能够在后续的开发过程中添加更多的功能和元素。
第二步:编写代码在设计完成后,我们开始编写Java代码。
首先,我们创建一个Java项目,并进行必要的配置,例如添加游戏所需的外部库和资源文件。
然后,我们开始编写代码。
我们可以将游戏的不同元素,例如地图、坦克、子弹等,抽象成不同的类,并为每个类定义相应的属性和方法。
我们还可以使用设计模式和面向对象的编程思想,使得代码更加清晰和可维护。
同时,我们需要为游戏添加适当的事件处理器,以响应用户的操作和更新游戏状态。
我们还可以使用Java图形库或者相关的游戏引擎,使游戏具有更好的视觉效果和用户体验。
第三步:测试和调试在代码编写完成后,我们需要进行测试和调试。
我们可以编写一些测试用例,验证游戏的各个功能和元素是否正常工作。
同时,我们需要定期检查并修复可能存在的bug和错误,确保游戏的稳定性和可玩性。
在这个过程中,我们可以与团队成员合作,互相交流和帮助,提高解决问题的效率和质量。
第四步:项目上线和发布在完成测试和调试后,我们可以将游戏部署到服务器上,并发布给玩家。
我们可以选择通过应用商店或者网站进行发布,或者将游戏打包成可执行文件,供玩家下载和安装。
