Problème dans la récursivité d'un démineur

Jean-Baptiste -  
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

Nous sommes en classe de Terminal S en spécialité ISN.
Dans notre spécialité nous devons pour le bac coder le jeu du démineur.
Nous avons réussi entièrement a créer ce démineur mais nous bloquons pour l'action du joueur sur une case vide ou une récursivité doit s'enclencher pour ouvrir a la chaîne toutes les cases vides ainsi que les chiffres autour.
#cette fonction s'active en cas de clique sur une case vide
#a correspond a la ligne et b a la colonne
#leur valeur varie entre 0 et 20 dans une matrice de 20x20
def case_vide(a,b):
    if a==0 or a==20 or b==0 or b==20:
        """case_vide_particuliere(a,b)"""
        #on traitera ici les cas particuliers des premieres et derniere ligne/colone
        pass
    else:
        can.create_text(b*25+15, a*25+15,
                    text=grille[a][b], fill='black',font='Arial 16')
        can.create_text((b-1)*25+15, (a-1)*25+15,
                    text=grille[a-1][b-1], fill='black',font='Arial 16')
        if grille[a-1][b-1] == 0:
            case_vide(a-1,b-1)
        else:
            pass
        can.create_text((b-1)*25+15, a*25+15,
                    text=grille[a][b-1], fill='black',font='Arial 16')
        if grille[a][b-1] == 0:
            case_vide(a,b-1)
        else:
            pass
        can.create_text((b-1)*25+15, (a+1)*25+15,
                    text=grille[a+1][b-1], fill='black',font='Arial 16')
        if grille[a+1][b-1] == 0:
            case_vide(a+1,b-1)
        else:
            pass
        can.create_text(b*25+15, (a+1)*25+15,
                    text=grille[a+1][b], fill='black',font='Arial 16')
        if grille[a+1][b] == 0:
            case_vide(a+1,b)
        else:
            pass
        can.create_text((b+1)*25+15, (a+1)*25+15,
                    text=grille[a+1][b+1], fill='black',font='Arial 16')
        if grille[a+1][b+1] == 0:
            case_vide(a+1,b+1)
        else:
            pass
        can.create_text((b+1)*25+15, a*25+15,
                    text=grille[a][b+1], fill='black',font='Arial 16')
        if grille[a][b+1] == 0:
            case_vide(a,b+1)
        else:
            pass
        can.create_text((b+1)*25+15, (a-1)*25+15,
                    text=grille[a-1][b+1], fill='black',font='Arial 16')
        if grille[a-1][b+1] == 0:
            case_vide(a-1,b+1)
        else:
            pass
        can.create_text(b*25+15, (a-1)*25+15,
                    text=grille[a-1][b], fill='black',font='Arial 16')
        if grille[a-1][b] == 0:
            case_vide(a-1,b)
        else:
            pass

Merci pour l'aide que vous pourrez nous apporter.

EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles ici : ICI

Merci d'y penser dans tes prochains messages.


Merci d'y penser dans tes prochains messages.
A voir également:

2 réponses

yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 584
 
bonjour, quel est votre soucis?
0
Jean-Baptiste
 
Il semblerait que la récursivité entraîne des erreurs et qu'un seul enchaînement d'action s'actionne. Que seul le premier if est pris en compte (sauf si il s'applique pas) et ainsi de suite. Nous avons aussi un message de récursivité maximum.
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > Jean-Baptiste
 
comme tu n'expliques pas ce que tu souhaites que la fonction fasse, difficile de t'aider.
je ne suis pas surpris du comportement que tu décris: ne devrais-tu pas modifier la valeur de la grille avant d'appeler la fonction?
0
Jean-Baptiste
 
Cette fonction se trouve dans un jeu, le démineur, que nous codons. Lorsque que l'on appui sur une case vide, celle-ci doit s'ouvrir, mais aussi les 8 autres autour, mais si une case vide se trouve dans les 8 cases autour l'action se répète et les 8 case autour doivent s'ouvrir.
C'est cette fonction que nous n'arrivons pas a coder, nous avons un message de maximum de récursivité atteinte ainsi que les différentes actions non réalisées mais cela veut-il dire que la pile est pleine ou que le programme n'arrive pas a continuer pour une erreur que nous ne voyons pas. Visuellement la fonction le prend qu'une option a chaque fois et s’arrête pas ces messages d'erreur.
0
Jean-Baptiste
 
nous avons finalement réussi merci.
voici le bout de code finale
pb : programme tournait en boucle
resolution : chemin du programme marqué par verif dans la grille des drapeau
def verification(a,b):
## On définit ce qu'il se passe lorsque le joueur fais un clic gauche
## sur une case
if face[a][b] == "drapeau":
pass
elif face[a][b] == "verif":
pass
elif grille[a][b] == 'bombe':
echec(a,b)
init = 0
elif grille[a][b] == 0:
can.create_rectangle(b*25+3, a*25+3,b*25+27, a*25+27,width=0, fill="ivory")
face[a][b] = "verif"
if a ==0 and b==0:
verification (a,b+1)
verification(a+1,b+1)
verification(a+1,b)
elif a==0 and b==19:
verification(a,b-1)
verification(a+1,b-1)
verification(a+1,b)

elif a ==19 and b==0:
verification (a-1,b)
verification(a-1,b+1)
verification(a,b+1)

elif a==19 and b==19:
verification(a,b-1)
verification(a-1,b-1)
verification(a-1,b)

elif a==0:
verification(a,b-1)
verification(a+1,b-1)
verification(a+1,b)
verification(a+1,b+1)
verification(a,b+1)

elif a==19:
verification(a-1,b-1)
verification(a,b-1)
verification(a,b+1)
verification(a-1,b+1)
verification(a-1,b)

elif b==0:
verification(a+1,b)
verification(a+1,b+1)
verification(a,b+1)
verification(a-1,b+1)
verification(a-1,b)

elif b==19:
verification(a-1,b-1)
verification(a,b-1)
verification(a+1,b-1)
verification(a+1,b)
verification(a-1,b)
else:
verification(a-1,b-1)
verification(a,b-1)
verification(a+1,b-1)
verification(a+1,b)
verification(a+1,b+1)
verification(a,b+1)
verification(a-1,b+1)
verification(a-1,b)

else:
coul = ['blue','green','orange','red','brown','purple','black','black']
can.create_rectangle(b*25+3, a*25+3,
b*25+27, a*25+27,width=0, fill="ivory")
can.create_text(b*25+15, a*25+15,
text=grille[a][b], fill=coul[grille[a][b]-1], font='Arial 18')
face[a][b] = "verif"
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 
le code est illisible si tu n'utilises pas les balises de code.
0