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 ). 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 ?
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.
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 )
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é
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 )
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 )
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.
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.
Blond, bouclé, toujours le sourire aux lèvres...
Blond, bouclé, toujours le sourire aux lèvres...