1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
| from random import *
TAILLE=10 #taille arbitraire
def grille_pleine(val):
""" l'objectif de cette fonction est de generer une matrice TAILLE*TAILLE dont chaque case a la meme valeur val"""
grille=[]
for i in range(TAILLE):
L=[]
for j in range(TAILLE):
L.append(val)
grille.append(L)
return grille
def position_alea():
""" cette fonction renvoie l'abscisse et l'ordonnee d'un point choisi aleatoirement dans la grille """
x=randint(0,TAILLE-1)
y=randint(0,TAILLE-1)
return x,y
def generer_grille(densite):
"""l'objectif de cette fonction est de generer une grille (liste de listes) dans laquelle la densite de murs est un entier entre par lutilisateur compris entre 0 et 100, un espace vide est represente par un 1 et un mur par un 0 """
y,x=position_alea() # on choisit une case de depart au hasard
if densite>=15: # Cette division en 2 cas permet de diminuer grandement le temps de calcul; la borne 15 a ete obtenue experimentalement car c'est pour cette valeur que la duree d'execution varie drastiquement
grille=grille_pleine(0) # on cree une grille pleine de mur
sommematrice=0 # on initialise la valeur qui nous permettra de suivre l'evolution du nombre de cases vides creees au court de l'evolution de la fonction
espacevide=[] # on creer un liste regroupant les espaces vides
while sommematrice<(TAILLE**2)*(1-(densite/100)): #tant que l'on a pas atteint la densite de murs souhaitee
espacevide.append([y,x]) # on met a jour la liste des espaces vides
if x==0: # si on se trouve sur la face ouest
chemin=choice("d") # h pour haut, b pour bas, g pour gauche, d pour droite // choice("hbgd") permet de choisir au hasard une lettre entre h,b,g,d avec equiprobabilite
elif x==TAILLE-1: # si on se trouve sur la face est
chemin=choice("g") # cela pemet de diminuer le nombre de chemins sur les exterieurs
elif y==0: # si on se trouve sur la face sud
chemin=choice("b")
elif y==TAILLE-1: # si on se trouve sur la face nord
chemin=choice("h")
elif x==0 and y==0: # si on se trouve dans le coin nord ouest
chemin=choice("bd")
elif x==0 and y==TAILLE-1: # si on se trouve dans le coin sud ouest
chemin=choice("hd")
elif x==TAILLE-1 and y==0: # si on se trouve dans le coin nord est
chemin=choice("bg")
elif x==TAILLE-1 and y==TAILLE-1: # si on se trouve dans le coin sud est
chemin=choice("gh")
else:
chemin=choice("hbgd") # si on se trouve dans le coeur du labyrinthe
if chemin=='d':
x+=1
elif chemin=='g':
x+=-1
elif chemin=='h':
y+=-1
elif chemin=='b':
y+=1
if grille[y][x]==1: # si la case est deja vide
[y,x]=espacevide[randrange(len(espacevide))] #on vient prendre les coordonnees d'un espace vide et on recommence a creuser
else: # sinon elle devient une case vide
grille[y][x]=1
sommematrice+=1
else: # sinon on choisit de venir placer les murs aleatoirement dans la grille
sommematrice=TAILLE**2
grille=grille_pleine(1) # on vient creer une grille vide
while sommematrice>(TAILLE**2)*(1-(densite/100)): # tant que la densite souhaitee n'est pas atteinte, on continue
x,y=position_alea()
grille[x][y]=0
sommematrice+=-1
return grille |
Partager