Labyrinthe

Contenu du snippet

Un labyrinthe généré aléatoirement et une petite fonction récursive qui recherche une sortie, c'est à dire un chemin entre deux points donnés.
  • ATTENTION !!! *
  • Il y a trois sources différentes dans le zip mais elles ne fonctionnent *
  • pas toutes, elles sont là pour que vous puissiez vous en inspirer *
  • où les modifier. *

Source / Exemple :


//1ére source :

public class labyrinthe
{public static void main ( String arg[])
	{char tab[][]; 
	int l,c,i,j,n,p,nb[],balise[];
	boolean trouve=false;
	nb=new int[4];
	balise=new int[2];
	for(i=0;i<4;i++)
	nb[i]=i+1;
	creerpermut(nb);
	System.out.println("Donner le nb de ligne");
	n=Lire.i();
	System.out.println("Donner le nb de cols");
	p=Lire.i();
	tab=new char[n][p];
	for(i=0;i<n;i++)
	{tab[i][0]='7';
	tab[i][p-1]='7';}
	for(i=0;i<p;i++)
	{tab[0][i]='7';
	tab[n-1][i]='7';}
	for(i=1;i<n-1;i++)
	for(j=1;j<p-1;j++)
	tab[i][j]='0';
	creation(tab,nb,aleat(1,n-2),aleat(1,p-2));
	affiche(tab,n,p);
	do{
	balise(balise,n,p);
	}while(tab[balise[0]][balise[1]]!='*');
	do{
	l=aleat(1,n-1);
	c=aleat(1,p-1);
	}while(tab[l][c]!='*');
	
	
	System.out.println("départ"+l+c);
	System.out.println("balise"+balise[0]+balise[1]);
	trouve=false;
	trouve=recherche(balise,tab,l,c,trouve);
	affiche(tab,n,p);
	System.out.println(trouve);	
	}

public static void affiche(char[][]tab,int l,int c)
	{int i,j;
	for(i=0;i<l;i++)
	{for(j=0;j<c;j++)
	System.out.print(tab[i][j]);
	System.out.println();}
	}

public static void coord(int i,int j,int num,int[]tab)
	{switch(num)
		{
	case 1: tab[0]=i;
		tab[1]=j-1;
		break;

	case 2: tab[0]=i-1;
		tab[1]=j;
		break;

	case 3: tab[0]=i;
		tab[1]=j+1;
		break;

	case 4: tab[0]=i+1;
		tab[1]=j;
		break;
		}
	}

public static int aleat(int i,int j)
	{return ((int)Math.floor(Math.random()*j+i));}

public static void permut(int t[])
	{int i,j,a;
	i=aleat(0,3);
	j=aleat(0,3);
	a=t[i];
	t[i]=t[j];
	t[j]=a;
	}

public static void creerpermut(int[] t)
	{int a,i;
	a=aleat(1,10);
	for(i=1;i<=a;i++)
	permut(t);
	}

public static boolean valide(int i,int j, char tab[][],int voisin[])
	{int s,k;
	if(tab[i][j]=='7'||tab[i][j]=='*')
	
		return false;
	
	else {
		s=0;
		for(k=1;k<=4;k++)
			{coord(i,j,k,voisin);
				if (tab[voisin[0]][voisin[1]]=='*')
				s++;
			}
	
	return(s<=1);}
	}

public static void creation(char tab[][],int nb[],int i,int j)
	{int voisin[],k,nb2[],v;
	nb2=new int[4];
	for(v=0;v<4;v++)
	nb2[v]=v+1;
	creerpermut(nb2);
	voisin=new int[2];
	if(valide(i,j,tab,voisin))
		{tab[i][j]='*';
		for(k=0;k<4;k++)
		{coord(i,j,nb2[k],voisin);
		creation(tab,nb2,voisin[0],voisin[1]);}
		}
	}
public static void balise  (int[] balise,int n,int p)
	{balise[0]=aleat(1,n-1);
	 balise[1]=aleat(1,p-1);
	}

public static boolean recherche(int[] balise, char[][] tab,int l,int c,boolean trouve)
	{int voisin[],i;
	boolean cherche=false;
	voisin =new int[2];
	if(trouve!=true)
	{ if(tab[l][c]!='7')
	{if(l==balise[0]&&c==balise[1])
	{tab[l][c]='e';
	return true;}
	 else if(tab[l][c]=='*')
			{tab[l][c]='_';
			for(i=1;i<=4;i++)
				{if (cherche==false)
				{coord(l,c,i,voisin);
				cherche=recherche(balise,tab,voisin[0],voisin[1],trouve);}
				}
			if(cherche)
			return true;
			else {tab[l][c]='a';return false;}
		
			}
	
	}
	}
	return false;	
}
}

//2éme source :

public class laby2
{public static void main(String args[])
{
              char lab[][]; 
              int l,c,i,j;
           
              System.out.println("lign balise?");
              i=Lire.i();           
              System.out.println("col balise?"); 
              j=Lire.i();
                

              System.out.println("nb lignes?");
              l=Lire.i();
              System.out.println("nb colonnes?");
              c=Lire.i();
           
              lab=new char[l][c];
              lab[i][j]='B'; 
              initialisation(c,l,lab);
              creer_laby(1,2,lab);
              affichage(c,l,lab);
         
              if(l==i||j==c){ }

              else 
                {if(tab[i][j]=='*')
                   creer_che(i,j,lab);
                 if(tab[i][j]=='0'||tab[i][j]=='7')
                   creer_laby(i,j,lab);}         

}

       public static void initialisation(int c,int l, char t[][])

       {for(int i=0;i<l;i++)
           {for(int j=0;j<c;j++)
          
              if(i==0||j==0||i==(l-1)||j==(c-1))
          
                t[i][j]='7';
          
              else
              
                t[i][j]='0';
           }
        }

   
       public static void affichage(int c,int l,char t[][])
      
       {for(int i=0;i<l;i++)

           {for(int j=0;j<c;j++)
 
               System.out.print(t[i][j]+" ");
            System.out.println();
           }
        } 

       public static boolean test(int i, int j,char t[][])
 
       {int s=0;

        if(t[i][j]=='0')
          {if(t[i][j-1]=='*'||t[i][j-1]=='1')
           s++;
 
           if(t[i][j+1]=='*'||t[i][j+1]=='1')
           s++;

           if(t[i-1][j]=='*'||t[i-1][j]=='1')
           s++;

           if(t[i+1][j]=='*'||t[i+1][j]=='1')
           s++;

        
           if(s>1)
            return false;
 
           else
            return true;
          }
        
        else 
         return false;
       }

      public static void melange(int tab[])

      {int i,j,a;

       for(i=0;i<4;i++)
          tab[i]=(i+1);

       for(j=4;j>1;j--)
          {i=(int)Math.floor(Math.random()*j);
           a=tab[i];
           tab[i]=tab[j-1];
           tab[j-1]=a;
          }
      }

      public static void creer_laby(int i,int j,char tab[][])
      {int tab2[]=new int[4];
       if(test(i,j,tab))
         {tab[i][j]='*';
          melange(tab2);
          
          for(int k=0;k<=3;k++)
             {switch(tab2[k])
              
                             {case 1:creer_laby(i-1,j,tab);break;
                              case 2:creer_laby(i,j+1,tab);break;
                              case 3:creer_laby(i+1,j,tab);break;
                              case 4:creer_laby(i,j-1,tab);break;}
             }
          } 
      }

      public static void creer_che(int i,int j,char tab[][])
      {int tab2[]=new int[4];
       if(test(i,j,tab))
         {tab[i][j]='1';
          melange(tab2);
          
          for(int k=0;k<=3;k++)
             {switch(tab2[k])
              
                             {case 1:creer_che(i-1,j,tab);break;
                              case 2:creer_che(i,j+1,tab);break;
                              case 3:creer_che(i+1,j,tab);break;
                              case 4:creer_che(i,j-1,tab);break;}
             }
          } 
      }
}

//3éme source :

public class laby
{public static void main(String args[])
  {
              char lab[][]; 
              int l,c;
           
              System.out.println("donner nombre de lignes?");
              l=Lire.intData();
              System.out.println("donner le nombre de colonnes?");
              c=Lire.intData();
           
              lab=new char[l][c];
              initialisation_tableau(c,l,lab);
              creer_labyrinthe(1,2,lab);
              affichage(c,l,lab);
  }

 public static void initialisation_tableau(int c,int l, char t[][])
  {
   for (int i=0;i<l;i++)
     {for (int j=0;j<c;j++)
	if(i==0||j==0||i==(l-1)||j==(c-1))
	   t [i][j]='7';
	else
	    t[i][j]='0';
     }
  }
   

 public static void affichage(int c,int l,char t[][])
 {
  for (int i=0;i<l;i++)
     {for (int j=0;j<c;j++)
	System.out.print(t[i][j]+" ");
      System.out.println();
     }
 }
 

 public static boolean test(int i,int j, char t[][])
 {int s=0;
    if(t[i][j]=='0')
     {if(t[i][j-1]=='x')
	  s++;
      if(t[i][j+1]=='x')
	  s++;
      if(t[i-1][j]=='x')
	  s++;
      if(t[i+1][j]=='x')
	  s++;
      if(s>1)
       return false;
      else 
	return true;
     }
    else 
       return false;
 }
 

 public static void melange(int tab[])
  {int i, j, a;
    for (i=0;i<4;i++)
      tab[i]=i+1;
    for (j=4;j>1;j--)
    {i=(int)Math.floor(Math.random()*j);
        a=tab[i];
        tab[i]=tab[j-1];
  	tab[j-1]=a;
    }
  }

 public static void creer_labyrinthe(int i,int j, char tab [][])
  {int tab2[]=new int [4];int k;
    if(test(i,j,tab))
	{tab[i][j]='x';
	 melange(tab2);
       for(k=0;k<=3;k++)
	    {switch(tab2[k])
		{case 1:creer_labyrinthe (i-1,j,tab);break;
		 case 2:creer_labyrinthe (i,j+1,tab);break;
		 case 3:creer_labyrinthe (i+1,j,tab);break;
		 case 4:creer_labyrinthe (i,j-1,tab);break;
		}
	    }
	}
  }
}

Conclusion :


Ce code est complétement libre, vous pouvez le modifier comme bon vous semble.

Si vous arrivez à des trucs bien, envoyez les moi, je les ajouterais ici afin que tout le monde puisse en profiter...

(bon ben le zip marche toujours pas alors je mets le code direct voilà...)

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.