Menu

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

-
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.
Afficher la suite 

Votre réponse

2 réponses

Messages postés
7773
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
22 mai 2019
381
0
Merci
bonjour, quel est votre soucis?
-
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.
yg_be
Messages postés
7773
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
22 mai 2019
381 > 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?
-
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.
Commenter la réponse de yg_be
0
Merci
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"
yg_be
Messages postés
7773
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
22 mai 2019
381 -
le code est illisible si tu n'utilises pas les balises de code.
Commenter la réponse de Jean-Baptiste