zoukankan      html  css  js  c++  java
  • JAVA基础课程设计 简易坦克大战

    工程的结构如下:

    类名

    父类/接口

    功能

    Paly

    void

    音频播放

    Wel_Panel

    JPanel

    欢迎界面

    keylistener

    KeyAdapter

    键盘监听

    PC_tank

    Runnable

    电脑坦克的控制

    T_Bullet

    Runnable

    子弹的控制

    Test

    void

    主函数入口各类的组装

    A_tank

    JPanel

    左方向坦克的绘制

    D_tank

    JPanel

    右方向坦克的绘制

    S_tank

    JPanel

    下方向坦克的绘制

    W_tank

    JPanel

    上方向坦克的绘制

    Bullet

    JPanel

    子弹的绘制


    Bullet.java:

    package draw_gra;
    
    import java.awt.Color;
    import java.awt.Graphics;
    
    import javax.swing.JPanel;
    
    @SuppressWarnings("serial")
    public class Bullet extends JPanel
    {
    	int x;
    	public Bullet(int i)
    	{
    		x=i;
    		
    	}
    	@Override
    	public void paint(Graphics g)
    	{
    		// TODO Auto-generated method stub
    		if(x==0)
    			g.setColor(Color.GREEN);
    		else
    			g.setColor(Color.red);
    		g.fillOval(0, 0, 5, 5);
    	}
    }
    

    paly.java:

    package draw_gra;
    
    import java.io.File;
    import java.io.IOException;
    import javax.sound.sampled.AudioFormat;
    import javax.sound.sampled.AudioInputStream;
    import javax.sound.sampled.AudioSystem;
    import javax.sound.sampled.LineUnavailableException;
    import javax.sound.sampled.SourceDataLine;
    import javax.sound.sampled.UnsupportedAudioFileException;
    
    public class Paly {
    	private static AudioInputStream audioInputStream;
    	private static AudioFormat audioFormat;
    	private static SourceDataLine res;
    
    
    
    
    	public  Paly(File file) throws UnsupportedAudioFileException, IOException, LineUnavailableException 
    		 {
    		audioInputStream = AudioSystem.getAudioInputStream(file);//得到要播放的文件的音频输入流
    		audioFormat = audioInputStream.getFormat();//音频流的
    
    		res = AudioSystem.getSourceDataLine(audioFormat);//得到输出设备对象
    		
    		res.open(audioFormat);//打开输出设备
    //		res.open();
    		res.start();//开始播放
    		
    		int inBytes = 0;
    		byte[] audioData = new byte[1024*200];//缓冲区
    		while ((inBytes != -1)) {
    			inBytes = audioInputStream.read(audioData, 0, audioData.length);//从音频输入流读取音频数据到缓冲区
    
    			if (inBytes >= 0) {//把音频数据写入到输出设备
    				res.write(audioData, 0, inBytes);
    			}
    		}
    		res.drain();//直到输出设备对象缓冲区的数据被输出,返回。加上这句,能完整的输出整个音频流
    		res.close();//关闭输出设备
    		audioInputStream.close();//关闭音频流
    	}
    }
    

    Wel_Panel.java

    package draw_gra;
    
    import java.awt.BorderLayout;
    import java.awt.CardLayout;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    
    import javax.swing.ImageIcon;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    
    public class Wel_Panel extends JPanel
    {
    	JFrame frame;
    	JPanel Tank;
    	public Wel_Panel(JFrame fra,JPanel tank)
    	{
    		frame=fra;
    		Tank=tank;
    		ImageIcon bg =new ImageIcon("./res/wel.png");
    		JLabel label=new JLabel(bg,JLabel.CENTER);
    		this.setLayout(new BorderLayout());
    		label.setBounds(0,0,bg.getIconWidth() ,bg.getIconHeight());
    		this.add(label,BorderLayout.CENTER);
    		JButton btn=new JButton();
    		btn.setIcon(bg);
    		this.add(btn);
    		btn.addMouseListener(new MouseAdapter(){
    
    			@Override
    			public void mouseClicked(MouseEvent e)
    			{
    				// TODO Auto-generated method stub
    				if(e.getButton()==MouseEvent.BUTTON1)
    					((CardLayout)frame.getContentPane().getLayout()).show(frame.getContentPane(), "Game");
    				Tank.requestFocus();
    			}
    			
    		});
    	}	
    
    }
    


    keylistener.java:

    package tank_war;
    
    import java.awt.CardLayout;
    import java.awt.event.KeyAdapter;
    import java.awt.event.KeyEvent;
    import java.util.ArrayList;
    
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    
    public class keylistener extends KeyAdapter
    {
    	
    
    	private JPanel Game;
    	private JPanel panel;			//玩家坦克
    	private static int x;			//记录tank方向
    	private ArrayList<PC_tank> pctanks;
    	public keylistener(JPanel Game1, JPanel panel2,ArrayList pcs)
    	{
    		// TODO Auto-generated constructor stub
    		Game=Game1;
    		panel=panel2;
    		x=3;
    		pctanks=pcs;
    	}
    	
    	@Override
    	public void keyPressed(KeyEvent e)
    	{
    		// TODO Auto-generated method stub
    		super.keyPressed(e);
    		if(panel.getX()==0&&e.getKeyCode()==KeyEvent.VK_A)			//防止越界
    			return ;
    		if(panel.getY()==0&&e.getKeyCode()==KeyEvent.VK_W)
    			return ;
    		if(panel.getX()>460&&e.getKeyCode()==KeyEvent.VK_D)
    			return ;
    		if(panel.getY()>460&&e.getKeyCode()==KeyEvent.VK_S)
    			return ;
    		switch(e.getKeyCode())
    			{
    			case KeyEvent.VK_W:
    				panel.setLocation(panel.getX(),panel.getY() -2);
    				((CardLayout)panel.getLayout()).show(panel, "W");
    				x=1;
    				break;
    			case KeyEvent.VK_A:
    				((CardLayout)panel.getLayout()).show(panel, "A");
    				panel.setLocation(panel.getX()-2,panel.getY() );
    				x=2;
    				break;
    			case KeyEvent.VK_S:
    				panel.setLocation(panel.getX(),panel.getY() +2);
    				((CardLayout)panel.getLayout()).show(panel, "S");
    				x=3;
    				break;
    			case KeyEvent.VK_D:
    				((CardLayout)panel.getLayout()).show(panel, "D");
    				panel.setLocation(panel.getX()+2,panel.getY() );
    				x=4;
    				break;
    			case KeyEvent.VK_J:								
    				T_Bullet t_bullet=new T_Bullet(panel,Game,x,pctanks,null);		//玩家坦克发子弹,目标:pctanks
    				new Thread(t_bullet,"b1").start();
    				break;
    
    			}
    		Game.repaint();				//重绘窗口
    	}
    	
    
    }

    PC_tank.java

    package tank_war;
    
    import java.awt.*;
    import java.util.Random;
    
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    
    import tank4T.A_tank;
    import tank4T.D_tank;
    import tank4T.S_tank;
    import tank4T.W_tank;
    
    public class PC_tank implements Runnable  
    {
    
    	private JPanel Game;
    	public JPanel tank;
    	private JPanel usrtank;
    	PC_tank(JPanel mf,JPanel usr)
    	{
    		Game = mf;
    		usrtank=usr;
    		tank=new JPanel();
    		tank.setLayout(new CardLayout());
    		tank.add("W",new W_tank(0));
    		tank.add("A",new A_tank(0));
    		tank.add("S",new S_tank(0));
    		tank.add("D",new D_tank(0));
    		tank.setBounds(200, 200, 30, 30);
    		Game.add(tank);
    	}
    
    	@Override
    	public void run()
    	{
    		// TODO Auto-generated method stub
    		int x=1;
    		Random r = new Random();
    		while (true)
    		{
    			int rom=r.nextInt(5);
    			if(rom==0)
    			{
    				for(int i=r.nextInt(20);i>0;i--)
    				{
    					if(tank.getY()-10<10)
    						continue;
    					tank.setLocation(tank.getX(),tank.getY() - 10);
    					((CardLayout)tank.getLayout()).show(tank, "W");
    					Game.repaint();
    					try
    					{
    						Thread.sleep(300);
    					} catch (InterruptedException e)
    					{
    						// TODO Auto-generated catch block
    						e.printStackTrace();
    					}
    				}
    				x=1;
    			}
    			if(rom==1)
    			{
    				for(int i=r.nextInt(20);i>0;i--)
    				{
    
    					if(tank.getX()-10<0)
    							continue;
    					tank.setLocation(tank.getX() - 10,tank.getY());
    					((CardLayout)tank.getLayout()).show(tank, "A");
    					Game.repaint();
    					try
    					{
    						Thread.sleep(300);
    					} catch (InterruptedException e)
    					{
    						// TODO Auto-generated catch block
    						e.printStackTrace();
    					}
    				}
    				x=2;
    			}
    			if(rom==2)
    			{
    				for(int i=r.nextInt(20);i>0;i--)
    				{
    					if(tank.getY()+10>470)
    							continue;
    					tank.setLocation(tank.getX(),tank.getY() +10);
    					((CardLayout)tank.getLayout()).show(tank, "S");
    					Game.repaint();
    					try
    					{
    						Thread.sleep(300);
    					} catch (InterruptedException e)
    					{
    						// TODO Auto-generated catch block
    						e.printStackTrace();
    					}
    				}
    				x=3;
    			}
    			if(rom==3)
    			{
    				for(int i=r.nextInt(20);i>0;i--)
    				{
    					if(tank.getX()>470)
    						continue;
    					tank.setLocation(tank.getX() + 10,tank.getY());
    					((CardLayout)tank.getLayout()).show(tank, "D");			
    					Game.repaint();
    					try
    					{
    						Thread.sleep(300);
    					} catch (InterruptedException e)
    					{
    						// TODO Auto-generated catch block
    						e.printStackTrace();
    					}
    				}
    				x=4;
    			}
    			if(rom==4)
    			{
    				T_Bullet t_bullet=new T_Bullet(tank,Game,x,null,usrtank);		//计算机发射发射子弹,目标:usrtank
    				new Thread(t_bullet,"p1").start();
    			}
    			
    			try
    			{
    				Thread.sleep(500);
    			} catch (InterruptedException e)
    			{
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    		if(tank.getParent()==null)			//如果该坦克以被移出Game,结束
    			return ;
    		Game.repaint();
    		}
    
    
    	}
    
    }
    

    T_Bullet.java:

    package tank_war;
    
    import java.awt.FlowLayout;
    import java.awt.TextArea;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    import java.util.ArrayList;
    import java.util.ListIterator;
    
    import javax.swing.JButton;
    import javax.swing.JDialog;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    
    import draw_gra.Bullet;
    public class T_Bullet implements Runnable
    {
    	JPanel tank;						//发射子弹的坦克
    	Bullet bullet;
    	JPanel Game;
    	int dir;
    	ArrayList <PC_tank>pctanks;			//目标:计算机坦克
    	JPanel usrtank;					//目标:玩家坦克
    	static Object lock=new Object();
    	@SuppressWarnings({ "rawtypes", "unchecked" })
    	T_Bullet(JPanel panel,JPanel fra,int d,ArrayList pcs,JPanel usr)			//方向1->W; 2->A; 3->S; 4->D
    	{
    		tank=panel;
    		usrtank=usr;
    		dir=d;
    		Game=fra;
    		pctanks=pcs;
    	}
    	@Override
    	public void run()
    	{
    		// TODO Auto-generated method stub
    //		bullet=new Bullet(tank.getX(),tank.getY());
    		if(usrtank==null)
    			bullet=new Bullet(0);
    		else
    			bullet=new Bullet(1);
    		bullet.setLayout(null);
    //		bullet.setBounds(tank.getX(),tank.getY(),20,20);
    		switch(dir)
    		{
    		case 1:bullet.setBounds(tank.getX()+10,tank.getY(),5,5);
    		break;
    		case 2:bullet.setBounds(tank.getX(),tank.getY()+10,5,5);
    		break;
    		case 3:bullet.setBounds(tank.getX()+10,tank.getY(),5,5);
    		break;
    		case 4:bullet.setBounds(tank.getX(),tank.getY()+10,5,5);
    		break;
    		}
    		Game.add(bullet);
    		while(bullet.getParent()!=null)
    		{
    			switch(dir)
    			{
    			case 1:bullet.setLocation(bullet.getX(), bullet.getY()-5);
    			break;
    			case 2:bullet.setLocation(bullet.getX()-5, bullet.getY());
    			break;
    			case 3:bullet.setLocation(bullet.getX(), bullet.getY()+5);
    			break;
    			case 4:bullet.setLocation(bullet.getX()+5, bullet.getY());
    			break;
    			}
    			try
    			{
    				Thread.sleep(100);
    			} catch (InterruptedException e)
    			{
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    			if(usrtank==null)
    			{
    				ListIterator<PC_tank> it=pctanks.listIterator();
    				synchronized(lock)
    				{
    					while(it.hasNext())
    					{
    						PC_tank obj=it.next();
    						if(Math.abs(bullet.getX()-obj.tank.getX())<20&&Math.abs(bullet.getX()-obj.tank.getX())>10
    						&&Math.abs( bullet.getY()-obj.tank.getY()    )<20
    						)
    						{
    						//	obj.tank.setVisible(false);				//坦克消失
    							it.remove();
    							pctanks.remove(it);
    							Game.remove(obj.tank);				//移出frame
    							Game.remove(bullet);					//子弹消失
    							
    						}
    					}
    				}
    			}
    			else
    			{
    
    				if( Math.abs(bullet.getX()-usrtank.getX() )<20
    				&&Math.abs(bullet.getY()-usrtank.getY())<20	)
    				{
    	//				usrtank.setVisible(false);			//游戏结束
    					Game.remove(usrtank);
    					
    				}
    				
    			}
    			Game.repaint();
    		}
    	}
    }

    Test.java:

    package tank_war;
    
    import java.awt.CardLayout;
    import java.awt.Color;
    import java.io.File;
    import java.io.IOException;
    import java.util.ArrayList;
    
    import javax.sound.sampled.LineUnavailableException;
    import javax.sound.sampled.UnsupportedAudioFileException;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    
    import draw_gra.Paly;
    import draw_gra.Wel_Panel;
    import tank4T.A_tank;
    import tank4T.D_tank;
    import tank4T.S_tank;
    import tank4T.W_tank;
    
    public class Test
    {
    	
    	public static void main(String[] args)
    	{
    		// TODO Auto-generated method stub
    		ArrayList <PC_tank>list=new ArrayList<PC_tank>();
    		JPanel Game_Panel=new JPanel();
    		Game_Panel.setBounds(0, 0, 500,500);
    		Game_Panel.setVisible(true);
    		Game_Panel.setLayout(null);
    		Game_Panel.setBackground(Color.black);
    		JFrame frame=new JFrame("Tank_War");
    
    		frame.setSize(500, 500);
    		frame.setResizable(false);
    		frame.setLayout(new CardLayout());			//卡片				
    		frame.setLocationRelativeTo(null);
    		frame.getContentPane().setBackground(Color.black);
    
    
    		JPanel Tank=new JPanel(new CardLayout());		//卡片布局
    
    		Wel_Panel wel_panel=new Wel_Panel(frame,Tank);
    		wel_panel.setVisible(true);
    		wel_panel.setBounds(0, 0, 500, 500);
    		Tank.setBounds(0, 0, 30, 30);
    		Tank.add("S",new S_tank(1));				//下
    		Tank.add("W",new W_tank(1));			//上
    		Tank.add("A",new A_tank(1));				//左
    		Tank.add("D",new D_tank(1));				//右	
    		Game_Panel.add(Tank);
    		Tank.addKeyListener(new keylistener(Game_Panel,Tank,list));
    		frame.setVisible(true);
    
    		frame.add("Wel",wel_panel);
    		frame.add("Game",Game_Panel);
    		Tank.requestFocus();		//获得键盘焦点
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		
    		
    		while(list.size()<10)				//添加电脑坦克
    		{
    			PC_tank pc_tank=new PC_tank(Game_Panel,Tank);
    			new Thread(pc_tank,"pc").start();
    			list.add(pc_tank);
    		}
    		 try
    		{
    			new Paly(new File("./res/start.wav"));
    		} catch (UnsupportedAudioFileException | IOException
    				| LineUnavailableException e)
    		{
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		 
    	}
    
    		
    
    }
    

    A_tank.java:

    package tank4T;
    
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Graphics;
    
    import javax.swing.ImageIcon;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    
    @SuppressWarnings("serial")
    public class A_tank extends JPanel
    {
    		
    	public A_tank(int s)					//s==1 for:usr  s==0 for pc
    	{
    		if(s==1)
    		{
    			ImageIcon bg =new ImageIcon("./res/wa.jpeg");
    			JLabel label=new JLabel(bg,JLabel.CENTER);
    			this.setLayout(new BorderLayout());
    			label.setBounds(0,0,bg.getIconWidth() ,bg.getIconHeight());
    			this.add(label,BorderLayout.CENTER);
    		}
    		else
    		{
    			
    			ImageIcon bg =new ImageIcon("./res/ya.jpeg");
    			JLabel label=new JLabel(bg,JLabel.CENTER);
    			this.setLayout(new BorderLayout());
    			label.setBounds(0,0,bg.getIconWidth() ,bg.getIconHeight());
    			this.add(label,BorderLayout.CENTER);
    			
    		}
    	}
    /*	public void paint(Graphics g)
    	{
    		// TODO Auto-generated method stub
    		g.setColor(Color.BLUE);
    		g.fillRect(0,0,20, 7);
    		g.fillRect(0,21,20 , 7);
    		g.setColor(Color.GREEN);
    		g.fillOval(3, 7, 13, 13);
    		g.setColor(Color.RED);
    		g.drawLine(0, 13,10, 13);
    
    	}*/
    }

    D_tank.java

    package tank4T;
    
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Graphics;
    
    import javax.swing.ImageIcon;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    
    @SuppressWarnings("serial")
    public class A_tank extends JPanel
    {
    		
    	public A_tank(int s)					//s==1 for:usr  s==0 for pc
    	{
    		if(s==1)
    		{
    			ImageIcon bg =new ImageIcon("./res/wa.jpeg");
    			JLabel label=new JLabel(bg,JLabel.CENTER);
    			this.setLayout(new BorderLayout());
    			label.setBounds(0,0,bg.getIconWidth() ,bg.getIconHeight());
    			this.add(label,BorderLayout.CENTER);
    		}
    		else
    		{
    			
    			ImageIcon bg =new ImageIcon("./res/ya.jpeg");
    			JLabel label=new JLabel(bg,JLabel.CENTER);
    			this.setLayout(new BorderLayout());
    			label.setBounds(0,0,bg.getIconWidth() ,bg.getIconHeight());
    			this.add(label,BorderLayout.CENTER);
    			
    		}
    	}
    /*	public void paint(Graphics g)
    	{
    		// TODO Auto-generated method stub
    		g.setColor(Color.BLUE);
    		g.fillRect(0,0,20, 7);
    		g.fillRect(0,21,20 , 7);
    		g.setColor(Color.GREEN);
    		g.fillOval(3, 7, 13, 13);
    		g.setColor(Color.RED);
    		g.drawLine(0, 13,10, 13);
    
    	}*/
    }

    S_tank.java:

    package tank4T;
    
    import java.awt.AWTEvent;
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.Image;
    import java.awt.Label;
    import java.awt.event.KeyAdapter;
    import java.awt.event.KeyEvent;
    
    import javax.swing.ImageIcon;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    
    @SuppressWarnings({ "unused", "serial" })
    public class S_tank extends JPanel
    {
    	
    
    	public S_tank(int s)					//s==1 for:usr  s==0 for pc
    	{
    		if(s==1)
    		{
    			ImageIcon bg =new ImageIcon("./res/ws.jpeg");
    			JLabel label=new JLabel(bg,JLabel.CENTER);
    			this.setLayout(new BorderLayout());
    			label.setBounds(0,0,bg.getIconWidth() ,bg.getIconHeight());
    			this.add(label,BorderLayout.CENTER);
    		}
    		else
    		{
    			ImageIcon bg =new ImageIcon("./res/ys.jpeg");
    			JLabel label=new JLabel(bg,JLabel.CENTER);
    			this.setLayout(new BorderLayout());
    			label.setBounds(0,0,bg.getIconWidth() ,bg.getIconHeight());
    			this.add(label,BorderLayout.CENTER);
    			
    		}
    	}
    	/*public void paint(Graphics g)
    	{
    		// TODO Auto-generated method stub
    		g.setColor(Color.BLUE);
    		g.fillRect(0,0,7, 20);
    		g.fillRect(21,0,7 , 20);
    		g.setColor(Color.GREEN);
    		g.fillOval(7, 3, 13, 13);
    		g.setColor(Color.RED);
    		g.drawLine(13, 10, 13, 20);
    
    	}*/
    	
    
    
    }
    

    W_tank.java

    package tank4T;
    
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.FlowLayout;
    import java.awt.Graphics;
    import java.awt.GridLayout;
    
    import javax.swing.ImageIcon;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    
    @SuppressWarnings("serial")
    public class W_tank extends JPanel
    {
    	public W_tank(int s)
    	{
    		if(s==1)
    		{
    			ImageIcon bg =new ImageIcon("./res/ww.jpeg");
    			JLabel label=new JLabel(bg,JLabel.CENTER);
    			this.setLayout(new BorderLayout());
    			label.setBounds(0,0,bg.getIconWidth() ,bg.getIconHeight());
    			this.add(label,BorderLayout.CENTER);
    		}
    		else
    		{
    			
    			ImageIcon bg =new ImageIcon("./res/yw.jpeg");
    			JLabel label=new JLabel(bg,JLabel.CENTER);
    			this.setLayout(new BorderLayout());
    			label.setBounds(0,0,bg.getIconWidth() ,bg.getIconHeight());
    			this.add(label,BorderLayout.CENTER);
    			
    		}
    	}
    	/*public void paint(Graphics g)
    	{
    		// TODO Auto-generated method stub
    		g.setColor(Color.BLUE);
    		g.fillRect(0,0,7, 20);
    		g.fillRect(21,0,7 , 20);
    		g.setColor(Color.GREEN);
    		g.fillOval(7, 3, 13, 13);
    		g.setColor(Color.RED);
    		g.drawLine(13, 10, 13, 0);
    
    	}*/
    }
    

    程序运行界面,,,简易...


  • 相关阅读:
    第4章.计算节点
    Eclipse插件ViPlugin2.X的破解方法
    金刚经
    js
    C++ 重写重载重定义区别
    string::substr()简介
    信息熵与二进制
    一个简单的条件概率问题
    HPLINUX hplinux 安装升级 至 jdk1.8
    linux 解压命令
  • 原文地址:https://www.cnblogs.com/frankM/p/4399441.html
Copyright © 2011-2022 走看看