Skip to content
Snippets Groups Projects
Commit 5dae5302 authored by Komi Dogbe's avatar Komi Dogbe
Browse files

reconstitution de mon solveur pour qu'il puisse resoudre le probleme ajout de...

reconstitution de mon solveur pour qu'il puisse resoudre le probleme ajout de lanceur qui permet de lancer le jeu quelque petite amelioration dans plateau
parent 636d2afb
No related branches found
No related tags found
No related merge requests found
from configuration import charger_niveau
from plateau import Plateau
from solveur import solveur
def main():
""" fonction principale
Précondition :
Exemple(s) :
$$$
"""
# Liste des niveaux disponibles
liste_niveau = [1, 2, 38, 39, 40]
# Demander à l'utilisateur de choisir un niveau
niveau = input("Choisissez un niveau entre [1, 2, 38, 39, 40] : ")
# Vérification si le niveau est valide
if int(niveau) not in liste_niveau:
print("Niveau invalide. Choisissez un niveau valide svp.")
else:
# Charger les voitures du niveau choisi
voitures = charger_niveau(int(niveau))
# Créer le plateau et ajouter les voitures
plateau = Plateau()
for voiture in voitures:
plateau.ajouter_voiture(voiture)
plateau.remplir_grille()
# Afficher le plateau initial
print("Plateau initial:")
plateau.afficher_grille()
# Résoudre le niveau
solution = solveur(plateau)
# Afficher la solution
if not solution:
print("Aucune solution trouvée.")
else:
print("Solutions :")
for (couleur, direction) in solution:
print(f"{couleur} vers {direction}")
if __name__ == '__main__':
main()
# éxécuté qd ce module n'est pas initialisé par un import.
pass
\ No newline at end of file
......@@ -189,11 +189,9 @@ class Plateau():
""" Retourne une copie indépendante du plateau.
Précondition :
Exemple(s) :
Exemple(s) :
$$$
"""
nouveau_plateau = Plateau()
# Copier tous les véhicules un par un
for voiture in self.vehicules:
......
from plateau import Plateau
from voiture import Voiture
from apqueue import ApQueue
# representons l'etat initial du plateau dans une liste de tuple (en utilisant la position initial des voiture ) me permet de ne plus revisiter des etats deja representer
def position_init_voiture(plateau:Plateau):
""" permet de connaitre la position initiale de tout les voiture sur la grille
from copy import deepcopy
def etat_plateau(plateau:Plateau):
""" cree un tuple qui enregistre l'etat initiale du plateua
Précondition :
Exemple(s) :
$$$
"""
return tuple((voiture.couleur, voiture.position) for voiture in sorted(plateau.vehicules, key = lambda voiture: voiture.couleur))
def est_sortie(plateau:Plateau):
""" verifie si la voiture rouge est sortie
Précondition :
Exemple(s) :
$$$
"""
return tuple((voiture.couleur, voiture.position) for voiture in sorted(plateau.vehicules, key=lambda x: x.couleur)) # on pourit utiliser ine liste de tuple mais c'est pas adapte pour cree un seul emprint (alliasing)
def solution(plateau:Plateau)->bool:
""" dtermine si la voiture est a la sortie
for voiture in plateau.vehicules:
if voiture.couleur[0] == "Z" and voiture.orientation.lower()=="h":
ligne, colonne= voiture.position
if colonne +voiture.taille -1 == 5:
return True
return False
def tout_deplacement_possible(plateau:Plateau):
""" verifie si le deplacement peut etre realiser et les enregistre
Précondition :
Exemple(s) :
$$$
"""
deplacement = []
for voiture in plateau.vehicules:
if voiture.couleur[0] == "Z" and voiture.orientation.lower() == "H": # verifie si la voiture rouge est belle bien horizontale
ligne, colonne = voiture.position
if colonne + voiture.taille - 1 == 5: # verifi si la voiture rouge a atteint la colone car elle est deja sur la ligne 2
return True
return False
def solveur(plateau:Plateau):
""" resoud le probleme
directions = [-1, 1]
for direction in directions:
teste_plateau = deepcopy(plateau)
if teste_plateau.deplacement2(voiture.couleur, direction):
deplacement.append((voiture.couleur, direction))
return deplacement
def aplication_du_deplacement(plateau: Plateau, couleur, direction1):
""" permet d'appliquer le deplacement
Précondition :
Exemple(s) :
$$$
"""
nouveau_plateau = deepcopy(plateau)
if nouveau_plateau.deplacement2(couleur, direction1):
return nouveau_plateau
return None
def solveur(plateau_initial:Plateau):
""" resoud le probleme
Précondition :
Exemple(s) :
$$$
"""
file = ApQueue()
etat_deja_vus= set()
signature = etat_plateau(plateau_initial)
file.enqueue((plateau_initial, []))
etat_deja_vus.add(signature)
while not file.is_empty():
plateau, chemin = file.dequeue()
if est_sortie(plateau):
print("solution trouve:", chemin)
return chemin
for voiture, direction2 in tout_deplacement_possible(plateau):
nouveau_plateau = aplication_du_deplacement(plateau, voiture, direction2)
if nouveau_plateau:
nouvel_signature = etat_plateau(nouveau_plateau)
if nouvel_signature not in etat_deja_vus:
etat_deja_vus.add(nouvel_signature)
nouveau_chemin = chemin + [(voiture, direction2)]
file.enqueue((nouveau_plateau, nouveau_chemin))
print("aucun chemin trouver.")
return None
def appliquer_solution(plateau:Plateau, solution):
""" permet d'afficher la grille avec la voiture rouge a la sortie
Précondition :
Exemple(s) :
$$$
"""
etat_initial = position_init_voiture(plateau) # enregistre la position initiale des voitures sur le plateau intitiale
for couleur , direction in solution :
plateau.deplacement2(couleur, direction)
file = ApQueue() # cree une fille vide
file.enqueue((etat_initial, [])) # ajoute un etat et la liste des mouvement a la fille
config_deja_vue = set() # cree un ensemble de configuration deja vue
while not file.is_empty() : # tant que la fille n'est pas vide
etat_courant, chemin = file.dequeue() # permet de recuperer un etat a un instant donner
plateau_independant = Plateau() # on cree un plateau indepedant .
for voiture in plateau.vehicules:
voiture_copier = Voiture(voiture.couleur, voiture.taille, voiture.position, voiture.orientation) # on copies les voitures avec tous leurs infos
plateau_independant.ajouter_voiture(voiture_copier)# cree un plateau independans qui va nous servire a tester les deplacement sans tpoucher le plateau initial
plateau_independant.recharger_etat(etat_courant)# recharge l'etat courant
if etat_courant not in config_deja_vue: # ajouter l'etat a l'ensembles des config deja vue si elle n'y est pas
config_deja_vue.add(etat_courant)
print("TEST état :", etat_courant)
if solution(plateau_independant):
print("chemin trouve :", chemin)
return chemin # renvoie le chemin si la voiture rouge est sortie
for voiture in plateau_independant.vehicules:
if voiture.orientation.lower() == "h":
directions = [-1, 1] # gauche/droite
else:
directions = [-1, 1] # haut/bas
for direction in directions: # pour les deux direction possibles
plateau_copie = plateau_independant.copie() # on fais un essaie sur un plateau copier pour permetre des deplacement independante
if plateau_copie.deplacement2(voiture.couleur, direction): # on tente un deplacement
print(f"{voiture.nom} bouge en direction {direction}")
nouvel_etat = position_init_voiture(plateau_copie) # on a une nouvelle etat si le deplacement reussi
if nouvel_etat not in config_deja_vue: # verifie si on a deja cette configuration
nouveau_chemin = chemin + [(voiture.nom, direction)] # on a un nouveau chemin
file.enqueue((nouvel_etat, nouveau_chemin)) # on ajoute un nouveau etat a la fille d'attente
return None
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment