diff --git a/README.md b/README.md index ab3de20..c212607 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ Tout ça affichait dans une fenêtre Tkinter. - [x] Faire qu'on puisse générer avec un bouton [Bonus] - [x] Faire qu'on puisse le résoudre depuis l'app avec des boutons [Bonus] - [x] Pouvoir gérer la grandeur du labyrinthe à générer sans devoir modifier le code [Bonus] -#### Mur : +#### Mur & Chemins: - [x] Créer des murs sur toutes les cases du tableau de 25x25. - [x] Définir une entrée et une sortie. - [x] Casser certains murs de façons aléatoires. @@ -28,6 +28,9 @@ Tout ça affichait dans une fenêtre Tkinter. - [ ] Toujours un chemin entre l'entrée et la sortie - [x] Faire plusieurs sorties possibles [Bonus]. - [x] Avoir le temps de création du labyrinthe [Bonus]. +#### Seed: +- [x] Créer des labyrinthe suivant une seed +- [x] Afficher la seed ### Recherche du plus court chemin dans le graphe : - [x] Dire le plus court chemin avec les noms ou valeurs des points traversé. diff --git a/__pycache__/gen_lab.cpython-311.pyc b/__pycache__/gen_lab.cpython-311.pyc index 7cadeb9..e3b0a71 100644 Binary files a/__pycache__/gen_lab.cpython-311.pyc and b/__pycache__/gen_lab.cpython-311.pyc differ diff --git a/gen_lab.py b/gen_lab.py index fb9a753..7d74030 100644 --- a/gen_lab.py +++ b/gen_lab.py @@ -1,21 +1,36 @@ -from random import randint +from random import randint,seed import time +import hashlib class GenLab: ''' Génération d'un labyrinthe résolvable ''' - def __init__(self, dim): + def __init__(self, dim, seed_value=None): ''' paramètre: - dim : dimension du labyrinthe + - seed_value : (facultatif) seed pour la génération aléatoireZ renvoie: - zonedess : zone dessinable - - tab : grille crée par creer_lab + - tab : grille créée par creer_lab ''' self.dim = dim self.zonedess = self.dim - 1 + self.seed_value = seed_value + + # Utilisation de la seed pour la génération si donné + if self.seed_value is not None: + seed(self.seed_value) + + # Génération du labyrinthe self.tab = self.creer_lab() + + # Si aucune seed on génère une seed à partir du labyrinthe + if self.seed_value is None: + self.generated_seed = self.generate_seed() + else: + self.generated_seed = self.seed_value # Si une seed est donnée, on la garde # -------------------------------------------------------------------------------------------- # @@ -49,6 +64,15 @@ def creer_lab(self): # -------------------------------------------------------------------------------------------- # + def generate_seed(self): + """ + Crée une seed unique basée sur la configuration du labyrinthe généré + """ + lab_string = ''.join(str(cell) for row in self.tab for cell in row) # Convertir le labyrinthe en une chaîne + seed = int(hashlib.md5(lab_string.encode()).hexdigest(), 16) # Hasher en MD5 puis la convertir en entier + return seed + + # -------------------------------------------------------------------------------------------- # def dessine_lab(self): """ @@ -138,5 +162,4 @@ def dessine_lab(self): print("labyrinthe généré en",tempsgen, "secondes") return self.tab,tempsgen - # -------------------------------------------------------------------------------------------- # diff --git a/main.py b/main.py index 1b7d355..b38b787 100644 --- a/main.py +++ b/main.py @@ -16,6 +16,7 @@ dim_global = tk.IntVar(value=25) # Valeur de la dimension de base : 25 longueur_var = tk.StringVar() # Variable longeur du labyrinthe temps_var = tk.StringVar() # Variable temps du labyrinthe +seed_global = tk.StringVar(value="") # Variable seed du labyrinthe : par défaut vide def affiche_lab(): global labyrinthe_global @@ -23,22 +24,30 @@ def affiche_lab(): Affiche le labyrinthe sur l'application tkinter ''' dim = dim_global.get() + seed_value = seed_global.get() # Récupère la seed entrée par l'utilisateur + + if seed_value: + seed_value = int(seed_value) # Convertir la seed en entier si écrite + else: + seed_value = None # Pas de seed alors génération aléatoire + dimcanva = 500 / dim - gen = GenLab(dim) - labyrinthe_global,temps_generation = gen.dessine_lab() - temps_generation=round(temps_generation*10000) - temps_generation=temps_generation/10000 + gen = GenLab(dim, seed_value=seed_value) # Donner la seed pour générer le labyrinthe + + labyrinthe_global, temps_generation = gen.dessine_lab() + temps_generation = round(temps_generation * 10000) / 10000 longueur_var.set(f"Longueur: N/A") temps_var.set(f"Temps de génération du labyrinthe : {temps_generation} secondes") - # Mettre à jour la taille du canevas + # Afficher la seed générée + if not seed_value: + seed_global.set(str(gen.generated_seed)) # Afficher la seed générée + + # Mise à jour de l'affichage du labyrinthe sur le canvas canvas.config(width=len(labyrinthe_global[0]) * dimcanva, height=len(labyrinthe_global) * dimcanva) canvas.delete("all") # Effacer tout ce qui est dessiné précédemment sur le canvas - #labyrinthe_global[1][1] = 2 - #labyrinthe_global[dim - 2][dim - 2] = 3 - # Parcours du labyrinthe pour dessiner les murs et les espaces for i, ligne in enumerate(labyrinthe_global): for j, case in enumerate(ligne): @@ -89,7 +98,7 @@ def resoudre_lab(): else: canvas.create_rectangle(j * dimcanva, i * dimcanva, (j + 1) * dimcanva, (i + 1) * dimcanva, fill="white") -# Zone des Boutons et de l'étiquette pour afficher la longueur +# Zone des Boutons et de l'étiquette pour afficher la longueur et la seed button_frame = tk.Frame(app) button_frame.pack(side=tk.TOP, pady=10) @@ -97,6 +106,12 @@ def resoudre_lab(): dim_menu = tk.OptionMenu(button_frame, dim_global, *dimensions) dim_menu.pack(side=tk.LEFT, padx=5) +# Champ d'entrée pour la seed +seed_label = tk.Label(button_frame, text="Seed :") +seed_label.pack(side=tk.LEFT, padx=5) +seed_entry = tk.Entry(button_frame, textvariable=seed_global) +seed_entry.pack(side=tk.LEFT, padx=5) + gen_button = tk.Button(button_frame, text="Générer Labyrinthe", command=affiche_lab) gen_button.pack(side=tk.LEFT, padx=5)