⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 planegame.java

📁 飞机大战游戏Java源码.rar 飞机大战游戏Java源码综合运用Java程序设计语言的图形图像处理、事件处理、多线程、socket通讯等技术
💻 JAVA
📖 第 1 页 / 共 4 页
字号:
		}
	}
	//游戏结束的对话框
	class GameOver extends JFrame implements ActionListener
	{
		JPanel pnl;
		JButton btnyes;
		JButton btnnew;
		JButton btnexit;
		JTextArea textarea;
		GameOver()
		{
			pnl=new JPanel();
			pnl.setLayout(null);
			
			btnnew=new JButton("重 来");
			btnnew.setBounds(215,100,70,30);
			
			btnyes=new JButton("确 定");
			btnyes.setBounds(215,180,70,30);
			
			btnexit=new JButton("离 开");
			btnexit.setBounds(215,260,70,30);
			
			textarea=new JTextArea(20,20);
			textarea.setBounds(5,5,200,400);
			textarea.setLineWrap(true);
			
			pnl.add(textarea);
			pnl.add(btnyes);
			pnl.add(btnnew);
			pnl.add(btnexit);
			
			textarea.append("       ★★★ 十 佳 排 行 榜 ★★★ "+"\n");
			textarea.append("      姓名              分数              排名"+"\n");
			btnyes.addActionListener(this);
			btnnew.addActionListener(this);
			btnexit.addActionListener(this);
			this.setResizable(false);
			this.setContentPane(pnl);
			this.setTitle("游戏结束");
			this.setLocation(400,200);
			this.setResizable(false);
			this.setSize(300,400);
			this.setVisible(true);
			new Connet();
		}
		public void actionPerformed(ActionEvent e)
        {
        	if(e.getSource()==btnyes)
        	{
        		this.setVisible(false);
        	}
        	else if(e.getSource()==btnnew)
        	{
        		this.setVisible(false);
        		fra.setVisible(false);
        		fra=null;
        		count.lbllife=5;
        		count.level=0;
        		count.mark=0;
        		new MyFrame(count.UserName,count);
        	}
        	else if(e.getSource()==btnexit)
        	{
        		System.exit(1);
        	}
        }
	    //游戏结束时,把分数存进数据库.并从数据库取出数据,进行排列,得出前十名
		class Connet
		{
			Connection conn;  //连接对象
			Statement stm;    //陈述对象
			ResultSet rst;    //结果集
			String uName;
			public Connet()
			{
				try
				{
					String strSQL;
					String strDBDriver="com.microsoft.jdbc.sqlserver.SQLServerDriver";
					Class.forName(strDBDriver);   //注册驱动
					String strConnStr="jdbc:microsoft:sqlserver://localhost;DatabaseName=PlaneGame";
					String strUserName = "sa";
					String strPassword = "123456";
					conn = DriverManager.getConnection(strConnStr,strUserName,strPassword);
					stm = conn.createStatement();  //取得陈述对象
					System.out.println("连接数据库成功...等待数据操作.....");
					strSQL = "update login set mark="+count.mark+" where username='"+count.UserName+"'";
					System.out.println("上传分数成功!分数是:"+count.mark+";  姓名是 "+count.UserName);
					stm.executeUpdate(strSQL);
					////////////////////////////
					String strS ;
			        ResultSet rstShowAll;
				    strS = "select * from login order by mark desc";
				    rstShowAll=stm.executeQuery(strS);
				    int i=1;
				    while(rstShowAll.next()==true)
				    {
				    	if(i<11)
				    	{
				    	    textarea.append(rstShowAll.getString("UserName")+"            "+rstShowAll.getString("mark")+"         "+i+"\n");
				    	}
				    	i++;
				    }
				}
				catch(Exception e)
				{
					System.out.println("上传分数出现的异常"+e);
				}
			}
		}
	}
	//以随机的时间,在随机的位置出现敌机,并按照分数,设定出现敌机的数量,以提高游戏难度
	class ShowEPlane extends Thread
	{
		ShowEPlane()
		{
			new Thread(this).start();
		}
		public void run()
		{
			Random way=new Random(12340L);
			while(true&&count.wincontral==false)
			{
				if(count.mark<100)      //分数每加100,敌机出现的架数加多+1
				{
					count.level=0;
				}
				else if(100<=count.mark&&count.mark<200)//
				{
					count.level=1;
				}
				else if(200<=count.mark&&count.mark<300) //
				{
					count.level=2;
				}
				else if(300<=count.mark&&count.mark<400) //
				{
					count.level=3;
				}
				else if(400<=count.mark&&count.mark<500) //
				{
					count.level=4;
				}
				else if(500<=count.mark&&count.mark<600) //
				{
					count.level=5;
				}
				else if(600<=count.mark&&count.mark<700) //
				{
					count.level=6;
				}
				else if(700<=count.mark&&count.mark<800) //
				{
					count.level=7;
				}
				else if(800<=count.mark&&count.mark<900) //
				{
					count.level=8;
				}
				try
				{
					sleep(100);
				}
				catch(Exception ee)
				{
					System.out.println("ShowEPlane 睡眠出错1"+ee);
				}
				if(planeEVector.size()<(6+count.level)&&picPlane.isVisible()==true)
				{
					try
					{
						intSleep=sleep.nextInt(11)*5;  //控制飞机的运动速度
						int s=way.nextInt(5);
						
			        	if(intSleep==0)
			        	{
			        		intSleep=30;
			            }
					    if(s==1)
					    {
							new PlaneEClass1(intSleep);    //创建一个敌机	
					    }
					    else if(s==2)
					    {
							new PlaneEClass2(intSleep);    //创建一个敌机	
					    }
					    else if(s==3)
					    {
							new PlaneEClass3(intSleep);    //创建一个敌机	
					    }
					    else if(s==4)
					    {
							new PlaneEClass4(intSleep);    //创建一个敌机
					    }
					    sleep(1000);
					}
					catch(Exception e)
					{
						System.out.println("ShowEPlane 的休眠出错2:"+e);
					}
				}
			}
		}
	}
    //我方飞机控制的线程,我方飞机开始行动
	class PlaneThread extends Thread
	{
		public PlaneThread()
		{
			picPlane.setVisible(true);
			new Thread(this).start();
		}
		public void run()
		{
			while(true)
			{
					if(picPlane.getY()<20)
	        	    {
	        	    	KeyUp=0;
	        	    }
	        	    if(picPlane.getY()>550)
	        	    {
	        	    	KeyDown=0;
	        	    }
	        	    if(picPlane.getX()<-10)
	        	    {
	        	    	KeyLeft=0;
	        	    }
	        	    if(picPlane.getX()>500)
	        	    {
	        	    	KeyLight=0;
	        	    }
					if(KeyUp==1)
					{
						picPlane.setLocation(picPlane.getX(),picPlane.getY()-15);
					}
					if(KeyDown==1)
					{
						picPlane.setLocation(picPlane.getX(),picPlane.getY()+15);
					}
					if(KeyLeft==1)
					{
						picPlane.setLocation(picPlane.getX()-15,picPlane.getY());
					}
					if(KeyLight==1)
					{
						picPlane.setLocation(picPlane.getX()+15,picPlane.getY());
					}
					if(KeyBit==1) ///
					{
						if(count.BitContral<6)
						{
							new FireClass(picPlane);
							count.BitContral++;
						}
					}
					if(KeyDaoDan==1)
					{
						if(count.DaoDan>0)
						{
							new DaoDanClass();
							count.DaoDan--;
							SaveLine.setText("安全线:"+count.DaoDan);
							System.out.println("还有安全线:"+count.DaoDan);
						}
						else
						{
							System.out.println("没有安全线了!!");
						}
					}
					try
					{
						sleep(100);
					}
					catch(Exception e)
					{
					}
			}
		}
	}
    //我方飞机控制的事件类  ,使飞机可以平滑地移动
    class PlaneControl implements KeyListener
	{
	    public void keyTyped(KeyEvent e) 
	    {
	    }
	    public void keyPressed(KeyEvent e)  ////当按下S W A D 或J 键时,判断它的参数设为0
	    {
	        switch(e.getKeyChar())
	        {
	        	case 'w':
	        	  KeyUp=1;
	        	  break;
	        	case 's':
	        	  KeyDown=1;
	        	  break;
	        	case 'a':
	        	  KeyLeft=1;
	        	  break;
	        	case 'd':
	        	  KeyLight=1;
	        	  break;
	        	case 'j':  //我方飞机发射子弹
	        	  if(picPlane.isVisible()==true)  //如果我们飞机还没有被击中,则Visible为true,则可以发射子弹
	        	  {                               //如果我们飞机被击中了,则Visible为false,则不可以发射子弹
		        	  KeyBit=1;
		          }
	        	  break;
	        	case 'k':
	        	  if(picPlane.isVisible()==true)
	        	  {
	        	  	KeyDaoDan=1;
	        	  }
	        }
	    }
	    public void keyReleased(KeyEvent e)  //当不按S W A D 或J 键时,判断它的参数设为0
	    {
	        switch(e.getKeyChar())
	        {
	        	case 'w':
	        	  KeyUp=0;
	        	  break;
	        	case 's':
	        	  KeyDown=0;
	        	  break;
	        	case 'a':
	        	  KeyLeft=0;
	        	  break;
	        	case 'd':
	        	  KeyLight=0;
	        	  break;
	        	case 'j':
	        	  if(picPlane.isVisible()==true)  //如果我们飞机还没有被击中,则Visible为true,则可以发射子弹
	        	  {                               //如果我们飞机被击中了,则Visible为false,则不可以发射子弹
		        	  KeyBit=0;
		          }
		        case 'k':
		          if(picPlane.isVisible()==true)
		          {
		          	  KeyDaoDan=0;
		          }
		          
	       }
	    }
	}
	//我方飞机子弹线程
	class FireClass extends Thread
	{
		JLabel picP;             //用于显示我方飞机
		JLabel picPE;            //用于显示敌机
		JLabel picB;             //用于显示我方飞机子弹
		EPlaneInfor planeEInfor; //敌机用于取出敌机信息的对象
		public FireClass(JLabel pP)
		{
			picP=pP;
			picB = new JLabel(picBullet);
		    picB.setBounds(picP.getX(),picP.getY()-45,100,100);//我方飞机子弹的初始位置
		    pnl.add(picB);
			picB.setLocation(picB.getX(),picB.getY()+5);
			new Thread(this).start();
		}
		public void run()
		{
			try
	    	{
		    	this.sleep(100);
		    }
		    catch(InterruptedException e)
	        {
	        	System.out.println("我方飞机子弹线程 Sleep2 Error11!! :"+e);
	        }
            //如果子弹没有到达40这个底线,则子弹向前移动
	    	while(picB.getY()>-40)
	    	{
	    		picB.setLocation(picB.getX(),picB.getY()-20);
	    		    //检查每一架敌机是否被击中
	    		for(int j=0;j<planeEVector.size();j++)
		        {
		        	//从Vector中取出一架敌机进行判断
		        	planeEInfor=(EPlaneInfor)planeEVector.elementAt(j);
				    picPE=planeEInfor.planeLabel;
		            //判断敌机的位置跟子弹的位置是否符合,如果符合则表示击中敌机
		    		if(picB.getX()>(picPE.getX()-30) && picB.getX()<(picPE.getX()+30) && picB.getY()>(picPE.getY()-50) && picB.getY()<(picPE.getY()+20))
		    		{
		    			count.mark+=10;   //如果敌机被击中,成绩+10
				    	mark.setText("分数:"+Integer.toString(count.mark));
				    	
				    	if(count.mark==200||count.mark==400||count.mark==600||count.mark==800)
				    	{                 //传递count.mark到LifeClass,为了取得心的位置
				    		new LifeClass(count.mark);
				    	}
				    	else if(count.mark==1000)
				    	{
				    		count.wincontral=true;
				    		new GameOver();
				    		this.stop();
				    		System.out.println("你取得了胜利!!"+count.wincontral);
				    	}
				        //如果敌机被击中,则设Visible为false,并杀死线程,从Vector中移除敌机信息对象
					    planeEInfor.section=true;
			        	planeEInfor.planeLabel.setVisible(false);
			        	planeEInfor.planeLabel.setLocation(-100,-100);
			        	planeEInfor.planeThread.stop();
			    		planeEVector.removeElement(planeEInfor);
			    		if(count.bool==true)
					    {
					    	new BombSound();  //子弹爆炸声
					    }
					    //通过图片的更替显示,显示爆炸效果
		    		    for(int i=1;i<16;i++)
				    	{
					    	picB.setIcon(imgBullet[i]);
					    	try
					    	{
						    	this.sleep(200);
						    }
						    catch(InterruptedException e)
					        {
					        	System.out.println("Sleep Error!! :"+e);
					        }
					    }
				    	picB.setVisible(false);
				    	if(picB.isVisible()==true)
				    	{
				    		count.BitContral--;
				    	}
				        picB.setLocation(-100,-100);
				    	this.stop();
		    		}
		        }
		        try
		    	{
			    	this.sleep(50);
			    }
			    catch(InterruptedException e)
		        {
		        	System.out.println("我方飞机子弹线程 Sleep2 Error!! :"+e);
		        }
	    	}
	    	//如果子弹到达-40这个底线,则不显示,并杀死子弹线程,子弹减1
	    	count.BitContral--;
	    	picB.setVisible(false);
	    	picB.setLocation(-100,-100);
	    	this.stop();
		}
	}
	//我方飞机安全line线程
	class DaoDanClass extends Thread
	{
		int i=0;
		JLabel picLine;             //用于显示我方飞机
		public DaoDanClass()
		{
			picLine=new JLabel(anBullet);
			picLine.setBounds(0,picPlane.getY(),650,4);
			pnl.add(picLine);
			new Thread(this).start();
		}
		public void run()
		{
			while(i<7)
			{
				picLine.setLocation(picLine.getX(),picLine.getY()-7);
		        count.saveline=picLine.getY();
				i++;
		        try
		    	{
			    	this.sleep(200);
			    }
			    catch(InterruptedException e)
		        {
		        	System.out.println("我方飞机子弹线程 Sleep2 Error!! :"+e);
		        }
			}
	        picLine.setVisible(false);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -