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

Fermé
Jean-Baptiste - Modifié le 9 mai 2019 à 18:34
yg_be Messages postés 22724 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 avril 2024 - 15 mai 2019 à 20:17
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.

2 réponses

yg_be Messages postés 22724 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 avril 2024 1 476
9 mai 2019 à 22:35
bonjour, quel est votre soucis?
0
Jean-Baptiste
10 mai 2019 à 08:31
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 22724 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 avril 2024 1 476 > Jean-Baptiste
10 mai 2019 à 09:48
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
14 mai 2019 à 08:15
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
14 mai 2019 à 15:51
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 22724 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 avril 2024 1 476
15 mai 2019 à 20:17
le code est illisible si tu n'utilises pas les balises de code.
0