j'aimerai créer un labyrinthe aléatoirement avec python 3.3 . Le Labyrinthe serai représenté sous forme d'une variable contenant un labyrinthe sous cette forme (exemple pour un labyrinthe sur deux ligne):
je ne sait pas à quoi pourrait ressembler un algorithme pouvant créer de telles variable j'aimerais savoir si il existe des modules pouvant m'aider (autre que random et math) et à quoi ressemblerait la structure du code.
Merci d'avance.
Note : je suis au collège et je ne connais que trés peu les algorithmes
Je t'ai fais un programme tout maché mais essaie de la comprendre pour que tu progresses, j'ai commenté le code pour que tu comprennes:
import random #Notre module random
def generer(x, y): #Avec x le nombre de 'carreaux' sur l'axe horizontal et y celui de l'axe vertical.
diagramme = [] #'diagramme' sera le... diagramme... de notre labyrinthe. Le type de carreau sera représenté par 0, 1 ou 2.
for i in range(0, x * y): #On a donc i le compteur qui servira à compter le nombre de fois que l'opération dans la boucle for a été exécutée. 'x * y' est le nombre de fois que cette opération doit être exécutée. J'ai utilisé for et pas while car cela m'évite de déclarer et d'incrémenter i.
rand = random.randint(0, 2) #On déclare 'rand' qui sera la variable indiquant le type de 'carreau' à générer, si j'ai bien compris y'a 3 types. Sa valeur changera aléatoirement à chaque exécution de la boucle.
diagramme.append(rand) #J'utilise la méthode append() de la classe list pour ajouter à mon diagramme le carreau correspondant
return diagramme
x = int(input("Largeur du labyrinthe: ")) #On demande à l'utilisateur d'entrer des valeurs pour x et y et on transforme l'entrée en type int().
y = int(input("Hauteur du labyrinthe: "))
labyrinthe = generer(x, y) #Je préfère mettre le code dans une fonction c'est mieux
listeLignes = [] #On créer une liste qui va contenir 'x' listes contenant les types de carreaux de chaque ligne.
while len(labyrinthe) != 0: #Tant que la liste 'labyrinthe' n'est pas vide...
ligne = [] #On créer une liste vide ou on la vide à chaque exécution de boucle.
a = x #On créer une variable 'a' qu'on fixe à 'x'
while a != 0:
ligne.append(labyrinthe[0]) #On 'déplace' la première variable de la liste 'labyrinthe'
labyrinthe.pop(0)
a -= 1
listeLignes.append(ligne)
print(listeLignes) #On affiche la liste finale
Voilà si t'as d'autres questions sur mon programme n'hésite pas.
Note: Moi aussi j'suis au collège pas besoin de savoir ce qu'est un algorithme.
Il y a déjà un thread sur ce forum (assez vieux, environ deux ans) sur lequel on discute de plusieurs algorithmes de génération de labyrinthes parfaits. Je me souviens y avoir posté plusieurs codes d'exemples.
Note: Moi aussi j'suis au collège pas besoin de savoir ce qu'est un algorithme.
Dans ce cas, comment t'assurer que ton labyrinthe a bien une entrée et une sortie, que tu peux atteindre la sortie depuis l'entrée, et qu'il est possible en fait d'atteindre n'importe quelle cellule depuis n'importe quelle autre (c'est-à-dire qu'il est parfait, donc qu'il y a un intérêt à essayer de le résoudre) ?
J'ajoute ceci à ce que dis nohar, l'algorithme peut simplifier bien la vie
import random #Notre module random
def generer(x, y): #Avec x le nombre de 'carreaux' sur l'axe horizontal et y celui de l'axe vertical.
return [[random.randint(0, 2) for i in range(x)] for y in range(y)]
x = int(input("Largeur du labyrinthe: ")) #On demande à l'utilisateur d'entrer des valeurs pour x et y et on transforme l'entrée en type int().
y = int(input("Hauteur du labyrinthe: "))
labyrinthe = generer(x, y) #Je préfère mettre le code dans une fonction c'est mieux
print(labyrinthe)
Merci pour le lien Nohar j'ai choisi de prendre le deuxième programme mais comme je le précise plus haut j'ai deux type 'm' pour mur et '0' pour un vide (en fait 'd' c'était pour départ) j'ai essayé de convertir la liste que l'on obtient mais elle contient que des nombre compris entre 1 et 14 que l'on dirait aléatoire.
comment faire pour obtenir le labyrinthe en mode binaire ? (soit mur sois vide)
Ta modélisation est différente de la mienne. Chaque case de mes labyrinthes représente une pièce. Tu n'es pas obligé de changer ton modèle (qui est largement suffisant) pour appliquer l'algorithme. Il suffit juste que tu comprennes celui-ci assez bien pour le traduire dans ton modèle.
En gros tu as un algorithme expliqué en detail et un modèle qui tient la route : il ne te reste vraiment plus qu'à faire l'effort de réflexion pour traduire l'algo dans ton modèle. C'est à ce prix que tu maitriseras vraiment ton programme.
j'ai essayer mais j'ai commencé le python il y a 4 ois et dans le programme il y a pas mal de ligne de code que je comprend pas surtout la fonction draw(maze)
dans le deuxième algorithme qu'à donné nohar dans ce forum le programme pour afficher la labyrinthe se sert d'une variable que je n'ai pas compris alors j'ai essayé de voir comment fonctionne ce qui affiche le labyrinthe et je me suis aperçu que les éléments étaient rajouté petit à petit j'aimerais savoir si c'est possible d'obtenir le labyrinthe qui s'affiche.
j'avais mis ce forum en résolu mais j'avais pas vu un probleme alors voila le message que j'ai mis dans l'autre forum : aide génération aléatoire 2:
J'avais récemment créer un forum pour générer un labyrinthe parfait aléatoire.
Nohar m'a renvoyé vers un autre forum où j'ai pu trouver l'algorithme que je cherchais mais sans trop faire attention au résultat j'adapte le générateur a mon programme mais je vois qu'une case peut être un mur et un passage comment faire pour avoir un labyrinthe parfait remplit de case qui soit soit des mur soit du vide?
l'algorithme que j'ai obtenu donais de labyrinthes comme celui ci:
mais de nombreux passage sont le symbole "_" donc des mur
Bonsoir, je souhaite générer un labyrinthe non parfait c'est-à-dire avec plusieurs chemins possibles et parfois sans solutions. Il faut également que le labyrinthe possède 5, 10, 15, ou 20% de murs internes. C'est sur cette dernière partie ou je n'arrive pas à concevoir qu'on puisse contrôler le nombre de mûrs ouverts ou fermés dans le labyrinthe...
Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.
Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre. En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.
Au lieu de déterrer un sujet il est préférable :
soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
soit de créer un nouveau sujet décrivant votre propre contexte
ne pas répondre à un déterrage et le signaler à la modération
Je ferme ce sujet. En cas de désaccord, me contacter par MP.
Le Tout est souvent plus grand que la somme de ses parties.