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

📄 mi.java

📁 迷宫,它会自动认路且玩家可以控制等级,如果玩家迷路
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
           {
           	if(向上())
               peopley--;
           }
           
        if(key==KeyEvent.VK_DOWN)//向下走
           {
           	if(向下())
               peopley++;
           }
        
        repaint();
       }
   //---------------------------------------------------------------------------
   //避免闪动的方法
   //
   //---------------------------------------------------------------------------
   
   public void update(Graphics g)
   {
    paint(g);
   }
       
       
   //----------------------------------------------------------------------------
   //向上,下,左,右方向的方法
   //
   //---------------------------------------------------------------------------
   private boolean 向右(){
   	if(标记[peoplex][peopley]=='r'
   	 ||标记[peoplex][peopley]=='e')//如果右边有通道,就返回true
   	   return true;
   	else return false;
   }  
   
   
   
   private boolean 向上(){
   	if(标记[peoplex][peopley]=='u'||
   	   标记[peoplex][peopley]=='e')//如果上边有通道,就返回true
   	   return true;
   	else return false;
   }  
   
   
   private boolean 向左(){
   	if((标记[peoplex-1][peopley]=='r')||
   	   (标记[peoplex-1][peopley]=='e'))//如果左边有通道,就返回true
   	   return true;
   	else return false;
   }  
   
   
   private boolean 向下(){
   	if((标记[peoplex][peopley+1]=='u')||
   	   (标记[peoplex][peopley+1]=='e'))//如果下边有通道,就返回true
   	   return true;
   	else return false;
   }  
   
   
   //---------------------------------------------------------------------------
   //画出人的方法
   //
   //---------------------------------------------------------------------------
   
   private void 画出人(Graphics page)
     {  
        if(peoplex==(n+1)&&peopley==n)//当人的坐标超出了边界之后,人重新回到始点,进入下一关
           {
           	peoplex=peopley=1;
           	if(nn<=40)nn++;
           	label.setText("关数:"+(nn-9));
           	生成迷宫(); 
           }
     	page.drawImage(people,peoplex*width,peopley*width+10,width-10,width-8,this);
     	                              //在人位置上画出人
     	Font f=new Font("Dialog",Font.BOLD+Font.ITALIC,40);
     	page.setFont(f);
     	page.setColor(Color.black);
     	page.drawString("第"+(n-9)+"关",0,40);
     	
        if(peoplex==n&&peopley==n)
            	timer.stop();         //当人的位置处于坐标(n,n)时,自动演示就停止	
     	
     } 


  //--------------------------------------------------------------------------------
  //在人所在之处进行遍历,目的是遍历到坐标(n,n)这个位置,这个位置就是要遍历的目标
  //
  //-------------------------------------------------------------------------------  
  private void find(int i,int j)
  {
   if(i==n&&j==n) //用find方法进行递归遍历,目的是找到坐标为(n,n)的位置
      {           //当找到时就令purpose为1,表示已经找到了,0表示还没有找到
       purpose=1;
       direction=4;
       }
                
   mark[i][j]=1; //遍历过的地方用mark[i][j]=1标记,否则则标记为0

   if((标记[i][j]=='u'||标记[i][j]=='e')&&purpose==0)
      {//----------------------------------------------------------------
       //如果本坐标的上方没有"上墙",且还没有遍历到坐标(n,n),则执行下列程序
       //------------------------------------------------------------------
       if(标记[i][j-1]!='w'&&(mark[i][j-1]==0))
         {   //如果本坐标的上方不是边界且还没有遍历,则向上遍历
          find(i,j-1);
          if(purpose==1)direction=1;
             //如果如果目标已经找到,就令用于指示方向的direction为1,表示要找到(n,n)
             //这个目标必然经过本坐标,而且在本坐标遍历时是向上走,2表示向下走
             //3表示向左走,4表示向右走
         }
      }
   if((标记[i][j+1]=='e'||标记[i][j+1]=='u')&&purpose==0&&mark[i][j+1]==0)
     { //-------------------------------------------------------------------------
       //如果向下存在通道,且还没有遍历到坐标(n,n),而(i,j+1)还没有遍历,则向下遍历
       //--------------------------------------------------------------------------
      find(i,j+1);
      if(purpose==1)direction=2;
      }
   if((标记[i-1][j]=='r'||标记[i-1][j]=='e')&&purpose==0&&mark[i-1][j]==0)
     { //-------------------------------------------------------------------------
       //如果向左存在通道,且还没有遍历到坐标(n,n),而(i,j+1)还没有遍历,则向下遍历
       //--------------------------------------------------------------------------
      find(i-1,j);
      if(purpose==1)direction=3;
     }
   if((标记[i][j]=='e'||标记[i][j]=='r')&&(标记[i+1][j]!='w')&&purpose==0&&mark[i+1][j]==0)
     { //-------------------------------------------------------------------------
       //如果向右存在通道,且还没有遍历到坐标(n,n),而(i,j+1)还没有遍历,则向下遍历
       //--------------------------------------------------------------------------
      find(i+1,j);
      if(purpose==1)direction=4;
      }
  }  

  //---------------------------------------------------------------------------------------
  //提示方向方法,用画出提示的方向
  //
  //---------------------------------------------------------------------------------------- 
 private void 提示方向(Graphics page){
   if(是否提示==1){  
       if(direction==1) //当direction为一时,表示向上有路通向终点,并画出指向上方的箭头
          page.drawImage(updirection,peoplex*width,peopley*width,width,width,this);
       if(direction==2) //当direction为二时,表示向下有路通向终点,并画出指向下方的箭头
          page.drawImage(downdirection,peoplex*width,peopley*width,width,width,this);
       if(direction==3) //当direction为三时,表示向左有路通向终点,并画出指向左方的箭头
          page.drawImage(leftdirection,peoplex*width,peopley*width,width,width,this);
       if(direction==4)  //当direction为四时,表示向右有路通向终点,并画出指向右方的箭头
          page.drawImage(rightdirection,peoplex*width,peopley*width,width,width,this);
                  }
   是否提示=0;   //当执行一次后就令"是否提示"等于0,这样当下次的时候就不再显示方向了
   }
      
 //-----------------------------------------------------------------------------------------
 //"调整"方法,是用于使镜头始对应着小人,就算小人出了视野,也可以通过此方法能看到它的所在处
 //
 //
 //---------------------------------------------------------------------------------------------
 public void 调整(Graphics page)
  { 
    page_2d=(Graphics2D)page;
    
    page_2d.translate(原点i*width,原点j*width);
        //此方法为平移画面方法,相对原来的原点来说,向右平移"原点i*width",向下平移"原点j*width"
        //此方法对应于下面的平移方法,目的是使现在的"原点"恢复到(0,0)的坐标上
    
    if(peoplex==1&&peopley==1)原点i=原点j=0;
        
  	if(原点i>=0&&原点j>=0)   
  	  {
  	   if((peoplex-原点i)>=10) //当人横坐标离原点的横坐标超过10时,原点就向右平移6个单位
  	      原点i+=6;
  	   if((peoplex-原点i)<=4)  //当人横坐标离原点的横坐标小于4时,原点就向右平移6个单位
  	      if(原点i!=0)
  	         原点i-=6;
  	   if((peopley-原点j)>=10) //当人纵坐标离原点的纵坐标超过10时,原点就向下平移6个单位
  	      原点j+=6;
  	   if((peopley-原点j)<=4)  //当人的纵坐标离原点的纵坐标小于4时,原点就向上平移6个单位
  	      if(原点j!=0)
  	         原点j-=6;
  	  }
  	
    page_2d.translate(-1*原点i*width,-1*原点j*width);
      //此方法为平移画面方法,相对原来的原点来说,向右平移"原点i*width",向下平移"原点j*width"
  }
  
  
  
  //-------------------------------------------------------------------------------
  //"Listen演示"内部类,此内部类可以演示小人在迷宫内部行走的动画
  //
  //
  //---------------------------------------------------------------------------------
  
  private class Listen演示 implements ActionListener
   {              
   	public void actionPerformed(ActionEvent event)
   	 {
   	 	for(int i=1;i<=n;i++)
          for(int j=1;j<=n;j++)
             mark[i][j]=0;
             
        purpose=0;  //purpose=0表示还没有找到目标,当purpose=1时,就表示已经找到目标了
        
        direction=1;//direction表示方向,当direction=0时就表示初始化,没有方向
                    //direction=1,2,3,4分别表示向上,下,左,右
                    
        find(peoplex,peopley);//从人物当前的位置做起,进行递归
   	 	 
   	 	if(direction==1)
   	 	  peopley-=1;
   	 	else{
   	 		if(direction==2)
   	 		   peopley+=1;
   	 	    else{
   	 			if(direction==3)
   	 			   peoplex-=1;
   	 			else peoplex+=1;
   	 	         }
   	        }
   	   
   	   repaint();
    }
   
  }
  
  
  
       
    
}























































































































⌨️ 快捷键说明

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