Partage
  • Partager sur Facebook
  • Partager sur Twitter

Erreur de récursivité

Sujet résolu
    15 janvier 2018 à 19:36:15

    Bonjours à toutes et à tous,

    Je dois actuellement coder un Pacman à l'aide de Tkinter. Ce forum m'a déjà bien aidé mais je reviens une nouvelle fois demander de l'aide (la dernière normalement :ange: ). J'essaie de faire bouger les fantômes mais il m'arrive l'erreur suivante:

    Voici le code du mouvement des fantômes:

    def Fantomes(id_fant_p):
        global vecteur
        liste_mouv = ["Haut", "Bas", "Gauche", "Droite"]
        for id in id_fant_p:
            choix_mouv = choice(liste_mouv)
            if choix_mouv == "Haut":
                dx, dy = 0, -vecteur
            elif choix_mouv == "Bas":
                dx, dy = 0, vecteur
            elif choix_mouv == "Droite":
                dx, dy = vecteur, 0
            else:
                dx, dy = -vecteur, 0
            zone_g.move(id, dx, dy)
            if Collision_fant(liste_mur, id):
                zone_g.move(id, -dx, -dy)
            fenetre.after(50, Fantomes(id_fant))
    
    def Collision_fant(liste_mur_p, id_p):
        x1, y1, x2, y2 = zone_g.bbox(id_p)
        id_contact_f = zone_g.find_overlapping(x1, y1, x2, y2)
        for id in id_contact_f: #collision murs
            #print(id_contact) #DEBUG
            if id in liste_mur_p:
                return True
        return False
    • id_fant_p est une liste qui contient les ids de tous les fantômes
    • liste_mur contient les ids de chaque murs

    En lisant la description de l'erreur et en testant la fonction en la liant à un évènement KeyPress je suis sûr que l'erreur vient du fenetre.anim. Le problème c'est qu'au début je pensais que c'était parce que la fonction n'avait pas le temps de s'effectuer entièrement avant d'être relancée, mais il semblerait que ce ne soit pas ça (j'ai testé en mettant 500 d'attente sans résultat).

    Est-ce que quelqu'un pourrait m'expliquer d'où vient l'erreur et comment je peux faire pour la résoudre s'il vous plaît ?

    En espérant avoir été assez clair.

    -
    Edité par Firox 15 janvier 2018 à 19:36:26

    • Partager sur Facebook
    • Partager sur Twitter
      15 janvier 2018 à 19:49:44

      Ta fonction Fantomes est récursive (tu appelle la fonction dans la fonction elle-même).

      Je pense que c'est pas ce que tu voulais faire.

      • Partager sur Facebook
      • Partager sur Twitter

      Blond, bouclé, toujours le sourire aux lèvres...

        15 janvier 2018 à 20:05:20

        Si si je veux bien qu'elle soit récursive. Mais je viens de remarquer dans ce que j'ai écrit que j'ai mis fenetre.anim() dans la boucle for. Je pense que c'est cette erreur d'indentation qui est la source du problème. Il faudra que j'essaie quand je pourrais.
        • Partager sur Facebook
        • Partager sur Twitter
          15 janvier 2018 à 20:13:43

          Le problème c'est que tu arrives au max du nombre de récursions possibles. Faut changer l'algo en itératif pour éviter ça.

          -
          Edité par LoupSolitaire 15 janvier 2018 à 20:13:56

          • Partager sur Facebook
          • Partager sur Twitter

          Blond, bouclé, toujours le sourire aux lèvres...

            15 janvier 2018 à 20:58:55

            Attention aussi, ta fonction after prends un callback en argument et donc une fonction, ici tu fais l'appel de la fonction directement dans ta fonction after et donc tu lui passe en argument None (puisque ta fonction Fantomes ne retourne rien). Regarde partial pour passer des arguments à ton  callbacks.

            Autre chose, ta variable vecteur est définie nul part, cela pourra peut-être te poser des problèmes plus tard. Enfin fais attention quand tu codes à respecter PEP8, et donc quand tu définis une fonction, son nom commence en minuscule (c'est très perturbant une fonction dont le nom commence en majuscule ;))

            • Partager sur Facebook
            • Partager sur Twitter
              16 janvier 2018 à 21:06:03

              Merci pour vos réponses.

              Tyrion78000 a écrit:

              Attention aussi, ta fonction after prends un callback en argument et donc une fonction, ici tu fais l'appel de la fonction directement dans ta fonction after et donc tu lui passe en argument None (puisque ta fonction Fantomes ne retourne rien). Regarde partial pour passer des arguments à ton  callbacks.

              Je n'ai pas bien compris ce que tu voulais dire. Est-ce que tu pourrais me réexpliquer s'il-te-plaît ?

              Tyrion78000 a écrit:

              Autre chose, ta variable vecteur est définie nul part, cela pourra peut-être te poser des problèmes plus tard.


              En fait cette variable est bien définie. C'est juste qu'elle n'était pas dans la portion de code que j'ai envoyé :D

              LoupSolitaire a écrit:

              Le problème c'est que tu arrives au max du nombre de récursions possibles. Faut changer l'algo en itératif pour éviter ça.

              -
              Edité par LoupSolitaire hier à 20:13

              Le problème c'est que si je le passe en itératif la fonction s'exécute un nombre précis de fois alors que je veux qu'elle s'exécute tant que le joueur n'a pas gagné ou perdu...

              Edit: J'ai réussi a réglé le problème et grâce à ça j'ai compris ce que tu voulais dire Tyrion78000. Le problème venait bien du Fantomes(id_fant) dans le fenetre.after. Du coup j'ai enlevé le paramètre en utilisant le mot-clé global (bon je sais que c'est pas bien mais bon :ange: )

              -
              Edité par Firox 16 janvier 2018 à 21:28:24

              • Partager sur Facebook
              • Partager sur Twitter
                17 janvier 2018 à 2:36:55

                JamesElric a écrit:

                Edit: J'ai réussi a réglé le problème et grâce à ça j'ai compris ce que tu voulais dire Tyrion78000. Le problème venait bien du Fantomes(id_fant) dans le fenetre.after. Du coup j'ai enlevé le paramètre en utilisant le mot-clé global (bon je sais que c'est pas bien mais bon :ange: )


                Cool que tu aies compris, j'essayerais d'être plus clair la prochaine fois ;)

                Sinon plutôt que d'utiliser une variable global, regarde plutôt partial qui te permet justement de passer des arguments à un callback.

                • Partager sur Facebook
                • Partager sur Twitter

                Erreur de récursivité

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown