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

Jean-Baptiste -  
yg_be Messages postés 23437 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.

2 réponses

  1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     
    bonjour, quel est votre soucis?
    0
    1. 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
      1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > 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
    2. 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
  2. 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
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      le code est illisible si tu n'utilises pas les balises de code.
      0