3-tp-clique-la-tortue-1

Le programme plante

a marqué ce sujet comme résolu.

Bonjour,

Je regarde le TP https://zestedesavoir.com/tutoriels/944/a-la-decouverte-de-turtle/samuser-avec-plusieurs-tortues/#3-tp-clique-la-tortue-1 Le programme plante. Les tortues n’apparaissent pas et j’ai l’icone de la souris qui tourne sans fin. Pour éviter ça j’ai rajouté jeu.ecran.exitonclick() A la fin du if name == "main":

Maintenant, j’ai les tortues qui apparaissent mais évidemment si je clique, la fenêtre se ferme.

Pouvez-vous m’aiguiller?

Merci?

Chez moi, ça marche.
j’ai mis :

import turtle
from random import randint
import sys

TITRE = "Clique la tortue !"
IMAGE_FOND = "fond_clique_tortue.png"
LARGEUR, HAUTEUR = 640, 480
COULEURS = { 'black' : 1, 'grey' : 1,
             'brown' : 2, 'orange' : 2,
             'pink' : 4, 'yellow': 4,
             'purple' : 8, 'green' : 8,
             'blue' : 16,
             'red' : 32 }
CLES_COULEURS = list(COULEURS.keys())
TEMPS_APPARITION = 1000

puis toutes les classes, et enfin :

if __name__ == "__main__":
    jeu = Jeu()  #Initialisation jeu
    jeu.ecran.ontimer(jeu.tour_de_jeu, TEMPS_APPARITION)  #Exécution jeu
+0 -0

Voici le code.

A part changer l’image de fond, je me suis contenté de prendre le code du site.


import turtle
from random import randint
import sys

TITRE = "Clique la tortue !"
IMAGE_FOND = "tortue.png"
LARGEUR, HAUTEUR = 640, 480
COULEURS = { 'black' : 1, 'grey' : 1,
             'brown' : 2, 'orange' : 2,
             'pink' : 4, 'yellow': 4,
             'purple' : 8, 'green' : 8,
             'blue' : 16,
             'red' : 32 }
CLES_COULEURS = list(COULEURS.keys())
TEMPS_APPARITION = 1000

#Classes

class Bonus(turtle.Turtle):

    jeu = None  #Attribut de classe

    def __init__(self):
        """Constructeur"""
        turtle.Turtle.__init__(self)  #Constructeur classe mère
        self.niveau = 1  #Niveau initial
        self.cout_niveau = self.niveau * 10  #Cout niveau supérieur initial
        self.bouton_bonus()  #Affichage du bouton bonus
        self.onclick(lambda x, y : self.niveau_suivant())  #Gestion du clique sur le bouton

    def bouton_bonus(self):
        """Affichage du bouton lié au bonus"""
        self.speed(0)
        self.shape("square")
        self.shapesize(1.5)
        self.color("lightblue", "darkblue")
        self.up()
        self.goto(LARGEUR // 2 - 25, -HAUTEUR // 2 + 25)

    def niveau_suivant(self):
        """Gestion passage au niveau suivant"""
        if Bonus.jeu != None:
            if jeu.points >= self.cout_niveau:
                self.onclick(None)  #Désactivation gestion clique le temps des modifications
                Bonus.jeu.points -= self.cout_niveau
                self.niveau += 1
                self.cout_niveau = self.niveau * 10
                Bonus.jeu.affiche_bonus()
                Bonus.jeu.affiche_nombre_points()
                self.onclick(lambda x, y : self.niveau_suivant())  #Réactivation gestion clique


class Tortue(turtle.Turtle):

    jeu = None  #Attribut de classe

    def __init__(self):
        """Constructeur"""
        turtle.Turtle.__init__(self)  #Constructeur classe mère
        self.hideturtle()
        self.couleur_trace = self.couleur_remplissage = None  #Couleurs
        self.initialise_tortue()  #Initialisation du crayon
        self.showturtle()

    def initialise_tortue(self):
        """Initialise la tortue"""
        self.couleur_trace = CLES_COULEURS[randint(0, len(CLES_COULEURS)-1)]
        self.couleur_remplissage = CLES_COULEURS[randint(0, len(CLES_COULEURS)-1)]
        self.color(self.couleur_trace, self.couleur_remplissage)
        self.speed(0); self.shape("turtle"); self.setheading(randint(0, 359))
        self.up()
        self.goto(randint(-LARGEUR//2+15, LARGEUR//2-15),
                  randint(-HAUTEUR//2+40, HAUTEUR//2-15))
        self.onclick(lambda x, y : self.clique_tortue())

    def clique_tortue(self):
        """Gestion du clique sur la tortue"""
        if Tortue.jeu != None:
            self.onclick(None)  #Désactivation du clique sur la tortue
            points = COULEURS[self.couleur_remplissage]
            if self.couleur_trace == self.couleur_remplissage:
                points *= 2
            points += jeu.bonus.niveau - 1
            Tortue.jeu.points += points
            Tortue.jeu.affiche_nombre_points()
            self.hideturtle()
            del self


class Jeu():

    def __init__(self):
        """Constructeur"""
        self.ecran = turtle.Screen()  #Instanciation d'un écran
        self.points = 0
        self.bonus = Bonus()  #Instanciation d'un bonus
        self.crayon = turtle.Turtle()  #Instanciation d'un crayon
        self.initialise_crayon()  #Initialisation du crayon
        self.initialise_fenetre()  #Initialisation de la fenêtre
        self.lie_classe()

    def initialise_crayon(self):
        """Initialise crayon de la fenêtre"""
        self.crayon.speed(0)
        self.crayon.hideturtle()
        self.crayon.up()

    def initialise_fenetre(self):
        """Initialise la fenêtre"""
        self.ecran.setup(LARGEUR, HAUTEUR)
        self.ecran.title(TITRE)
        self.ecran.bgpic(IMAGE_FOND)
        self.affiche_nombre_points()
        self.affiche_bonus()
        self.ecran.onscreenclick(lambda x, y : self.quitter(), 3)

    def lie_classe(self):
        """Lie les classe Bonus et Tortue au jeu"""
        Tortue.jeu = self
        Bonus.jeu = self

    def affiche_bonus(self):
        """Affiche le niveau actuel"""
        self.crayon.up()
        self.crayon.goto(-140, - HAUTEUR // 2 + 10)
        self.dessine_rectangle((30, 375), ('darkblue', 'lightblue'))
        self.crayon.pencolor("black")
        self.crayon.forward(10)
        self.crayon.write("Bonus niveau {} (Up pour : {} points)".format
                          (self.bonus.niveau, self.bonus.cout_niveau),
                          align = "left",
                          font = ("Aria", 14, "bold"))

    def dessine_rectangle(self, dimensions, couleurs):
        """Dessine un rectangle personnalisé"""
        self.crayon.setheading(0)
        self.crayon.color(couleurs[0], couleurs[1])
        self.crayon.down()
        self.crayon.begin_fill()
        for i in range(4):
            if i%2 == 0:
                self.crayon.forward(dimensions[1])
            else:
                self.crayon.forward(dimensions[0])
            self.crayon.left(90)
        self.crayon.end_fill()
        self.crayon.up()

    def tour_de_jeu(self):
        """Gestion du tour de jeu"""
        if self.bonus.niveau >= 20:
            self.crayon.up()
            self.crayon.home()
            self.crayon.pencolor("darkblue")
            self.crayon.write("Victoire !",
                              align = "center",
                              font = ("Arial", 27, "bold"))
            self.ecran.ontimer(self.quitter, TEMPS_QUITTER)
        else:
            Tortue()
            self.ecran.ontimer(self.tour_de_jeu, TEMPS_APPARITION)

    def affiche_nombre_points(self):
        """Affiche le nombre de points"""
        self.crayon.up()
        self.crayon.goto(-LARGEUR // 2 + 5, - HAUTEUR // 2 + 10)
        self.dessine_rectangle((30, 140), ('darkblue', 'lightblue'))
        self.crayon.pencolor("black")
        self.crayon.forward(10)
        self.crayon.write("{} point(s)".format(self.points),
                          align = "left",
                          font = ("Arial", 15, "bold"))
    def quitter(self):
        """Fin du game"""
        self.ecran.bye()
        sys.exit(0)

if __name__ == "__main__":
    jeu = Jeu()  #Initialisation jeu
    jeu.ecran.ontimer(jeu.tour_de_jeu, TEMPS_APPARITION)  #Exécution jeu
##    jeu.ecran.exitonclick()

J’ai une partie de la réponse. Si j’utilise Edupython, ça bug sans message d’erreur. Si j’utilise Thonny, ça fonctionne Bizarre. Dans les 2 cas, j’execute le prog. depuis l’IDE. Edupython : Python 3.7.6 (default, Jan 8 2020, 20:23:39) Thonny: Python 3.7.9 (bundled)

J’ai essayé le code du TP avec une version 3.7.6 de Python, ça fonctionne.

Code

#!/usr/bin/env python3

import turtle
from random import randint
import sys

TITRE = "Clique la tortue !"
IMAGE_FOND = "tortue.png"
LARGEUR, HAUTEUR = 640, 480
COULEURS = { 'black' : 1, 'grey' : 1,
             'brown' : 2, 'orange' : 2,
             'pink' : 4, 'yellow': 4,
             'purple' : 8, 'green' : 8,
             'blue' : 16,
             'red' : 32 }
CLES_COULEURS = list(COULEURS.keys())
TEMPS_APPARITION = 1000

#Classes
class Bonus(turtle.Turtle):

    jeu = None  #Attribut de classe

    def __init__(self):
        """Constructeur"""
        turtle.Turtle.__init__(self)  #Constructeur classe mère
        self.niveau = 1  #Niveau initial
        self.cout_niveau = self.niveau * 10  #Cout niveau supérieur initial
        self.bouton_bonus()  #Affichage du bouton bonus
        self.onclick(lambda x, y : self.niveau_suivant())  #Gestion du clique sur le bouton

    def bouton_bonus(self):
        """Affichage du bouton lié au bonus"""
        self.speed(0)  
        self.shape("square")
        self.shapesize(1.5)
        self.color("lightblue", "darkblue")
        self.up()
        self.goto(LARGEUR // 2 - 25, -HAUTEUR // 2 + 25)
        
    def niveau_suivant(self):
        """Gestion passage au niveau suivant"""
        if Bonus.jeu != None:
            if jeu.points >= self.cout_niveau:
                self.onclick(None)  #Désactivation gestion clique le temps des modifications
                Bonus.jeu.points -= self.cout_niveau
                self.niveau += 1
                self.cout_niveau = self.niveau * 10
                Bonus.jeu.affiche_bonus()
                Bonus.jeu.affiche_nombre_points()
                self.onclick(lambda x, y : self.niveau_suivant())  #Réactivation gestion clique

class Tortue(turtle.Turtle):
    
    jeu = None  #Attribut de classe
    
    def __init__(self):
        """Constructeur"""
        turtle.Turtle.__init__(self)  #Constructeur classe mère
        self.hideturtle()
        self.couleur_trace = self.couleur_remplissage = None  #Couleurs
        self.initialise_tortue()  #Initialisation du crayon
        self.showturtle()
                                     
    def initialise_tortue(self):
        """Initialise la tortue"""
        self.couleur_trace = CLES_COULEURS[randint(0, len(CLES_COULEURS)-1)]
        self.couleur_remplissage = CLES_COULEURS[randint(0, len(CLES_COULEURS)-1)]
        self.color(self.couleur_trace, self.couleur_remplissage)
        self.speed(0); self.shape("turtle"); self.setheading(randint(0, 359))
        self.up()
        self.goto(randint(-LARGEUR//2+15, LARGEUR//2-15),
                  randint(-HAUTEUR//2+40, HAUTEUR//2-15))
        self.onclick(lambda x, y : self.clique_tortue())
    
    def clique_tortue(self):
        """Gestion du clique sur la tortue"""
        if Tortue.jeu != None:
            self.onclick(None)  #Désactivation du clique sur la tortue
            points = COULEURS[self.couleur_remplissage]
            if self.couleur_trace == self.couleur_remplissage:
                points *= 2
            points += jeu.bonus.niveau - 1
            Tortue.jeu.points += points
            Tortue.jeu.affiche_nombre_points()
            self.hideturtle()
            del self

class Jeu():
    
    def __init__(self):
        """Constructeur"""
        self.ecran = turtle.Screen()  #Instanciation d'un écran
        self.points = 0
        self.bonus = Bonus()  #Instanciation d'un bonus
        self.crayon = turtle.Turtle()  #Instanciation d'un crayon
        self.initialise_crayon()  #Initialisation du crayon
        self.initialise_fenetre()  #Initialisation de la fenêtre
        self.lie_classe()

    def initialise_crayon(self):
        """Initialise crayon de la fenêtre"""
        self.crayon.speed(0)
        self.crayon.hideturtle()
        self.crayon.up()
        
    def initialise_fenetre(self):
        """Initialise la fenêtre"""
        self.ecran.setup(LARGEUR, HAUTEUR)
        self.ecran.title(TITRE)
        self.ecran.bgpic(IMAGE_FOND)
        self.affiche_nombre_points()
        self.affiche_bonus()
        self.ecran.onscreenclick(lambda x, y : self.quitter(), 3)

    def lie_classe(self):
        """Lie les classe Bonus et Tortue au jeu"""
        Tortue.jeu = self
        Bonus.jeu = self
        
    def affiche_bonus(self):
        """Affiche le niveau actuel"""
        self.crayon.up()
        self.crayon.goto(-140, - HAUTEUR // 2 + 10)
        self.dessine_rectangle((30, 375), ('darkblue', 'lightblue'))
        self.crayon.pencolor("black")
        self.crayon.forward(10)
        self.crayon.write("Bonus niveau {} (Up pour : {} points)".format
                          (self.bonus.niveau, self.bonus.cout_niveau),
                          align = "left",
                          font = ("Aria", 14, "bold"))
    
    def dessine_rectangle(self, dimensions, couleurs):
        """Dessine un rectangle personnalisé"""
        self.crayon.setheading(0)
        self.crayon.color(couleurs[0], couleurs[1])
        self.crayon.down()
        self.crayon.begin_fill()
        for i in range(4):
            if i%2 == 0:
                self.crayon.forward(dimensions[1])
            else:
                self.crayon.forward(dimensions[0])
            self.crayon.left(90)
        self.crayon.end_fill()
        self.crayon.up()
                    
    def tour_de_jeu(self):
        """Gestion du tour de jeu"""
        if self.bonus.niveau >= 20:
            self.crayon.up()
            self.crayon.home()
            self.crayon.pencolor("darkblue")
            self.crayon.write("Victoire !",
                              align = "center",
                              font = ("Arial", 27, "bold"))
            self.ecran.ontimer(self.quitter, TEMPS_QUITTER)
        else:
            Tortue()
            self.ecran.ontimer(self.tour_de_jeu, TEMPS_APPARITION)

    def affiche_nombre_points(self):
        """Affiche le nombre de points"""
        self.crayon.up()
        self.crayon.goto(-LARGEUR // 2 + 5, - HAUTEUR // 2 + 10)
        self.dessine_rectangle((30, 140), ('darkblue', 'lightblue'))
        self.crayon.pencolor("black")
        self.crayon.forward(10)
        self.crayon.write("{} point(s)".format(self.points),
                          align = "left",
                          font = ("Arial", 15, "bold"))
    def quitter(self):
        """Fin du game"""
        self.ecran.bye()
        sys.exit(0)

if __name__ == "__main__":
    jeu = Jeu()  #Initialisation jeu
    jeu.ecran.ontimer(jeu.tour_de_jeu, TEMPS_APPARITION)  #Exécution jeu

À tout hasard, ton programme a bien accès à ton image (le chemin est le bon) ?

Je ne connais pas bien EduPython. Y-a-t’il un endroit avec des logs pour comprendre le problème ? As-tu moyen de passer à la version 3.1 de ce soft (la 3.0 utilise Python 3.7 qui arrive en fin support fin juin) ou une autre alternative ? Peut-être que tu pourras te faire aider ici.

+0 -0

Oui, le fond s’affiche correctement. J’utilise la version 3.1 Pour les logs, il faut que je regarde, je n’ai pas l’habitude. Même sur thonny ça n’a pas l’air très stable. J’ai déjà utiliser le forum, et si je ne trouve pas je leur posterai un message. Merci.

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte