Skip to content

TP3. Tortue Logo

Énoncé

Dans ce premier TP, on se propose d’écrire un programme simulant un mini Logo. Logo est un langage de programmation vous permettant de contrôler une petite tortue représentant la pointe d’un crayon, dessinant une image lors de ses déplacements.

logo de Logo

La tortue obéit à différentes commandes mais nous ne considérerons dans ce TP que les commandes suivantes :

  • avance
  • tourne_droite
  • tourne_gauche
  • leve_crayon
  • baisse_crayon

Votre travail consiste à implémenter toutes les fonctions du module logo.py dont le squelette vous est fourni ici et affiché ci dessous :

"""Module tortue logo.

Ce module implémente les primitives graphiques basiques
d'une tortue logo.
"""

from collections import namedtuple
import svg

TortueLogo = namedtuple("TortueLogo", "point direction crayon_en_bas")

def init():
    """Renvoie une nouvelle Tortue à l'origine.

    Initialement la tortue regarde vers le haut.
    """
    # TODO
    ...

def avance(tortue, distance):
    """Renvoie une nouvelle tortue ayant avancé tout droit.

    La tortue avance tout droit de la distance donnée et affiche le
    segment SVG correspondant si le crayon de la tortue est en bas.
    """
    # TODO
    ...

def tourne_droite(tortue, angle):
    """
    Renvoie une nouvelle tortue ayant changé de direction.

    La tortue change de direction en tournant à droite de l'angle
    donné (en degrés)
    """
    # TODO
    ...

def tourne_gauche(tortue, angle):
    """Renvoie une nouvelle tortue ayant changé de direction.

    La tortue change de direction en tournant à gauche de l'angle
    donné (en degrés)
    """
    # TODO
    ...

def baisse_crayon(tortue):
    """Renvoie une nouvelle tortue ayant baissé le crayon."""
    # TODO
    ...

def leve_crayon(tortue):
    """Renvoie une nouvelle tortue ayant levé le crayon."""
    # TODO
    ...

Nous vous fournissons le programme principal test_logo.py qui n’est pas à modifier et qui vous permettra de tester votre module logo.py.

Pour dessiner des segments dans votre module logo.py, vous utiliserez la fonction suivante que vous devez rajouter à votre module svg.py :

def genere_segment(dep, arr):
    """
    Retourne la chaîne de caractères correspondant à un
    ségment SVG. Ce segment relie les points dep et arr.
    """
    # TODO
    ...

Il est assez facile de se tromper dans les calculs pour ce TP, n’hésitez pas à interpeller votre enseignant pour qu’il vous explique comment déboguer votre programme.

Cliquez ici pour révéler la correction.

Correction

Une correction détaillée en vidéo est disponible :

Une version du code de correction, différente de celle de la vidéo est également affichée ci dessous :

"""Module tortue logo.

Ce module implémente les primitives graphiques basiques
d'une tortue logo.
"""

from collections import namedtuple
from math import cos, sin, pi
import svg

TortueLogo = namedtuple("TortueLogo", "point direction crayon_en_bas")

def init():
    """Renvoie une nouvelle Tortue à l'origine.

    Initialement la tortue regarde vers le haut.
    """
    abscisse = 0.0
    ordonnee = 0.0
    direction = 90.0  # angle du regard de la tortue en degrés
    crayon_en_bas = False
    return TortueLogo(svg.Point(abscisse, ordonnee), direction, crayon_en_bas)

def avance(tortue, distance):
    """Renvoie une nouvelle tortue ayant avancé tout droit.

    La tortue avance tout droit de la distance donnée et affiche le
    segment SVG correspondant si le crayon de la tortue est en bas.
    """
    # il faut que l'on fasse un peu de trigonométrie
    # on avance suivant un vecteur donné par la direction
    # attention : comme la doc nous le rappelle cos et sin
    # prennent des angles en radians.
    vecteur = (cos(tortue.direction * pi / 180),
               sin(tortue.direction * pi / 180))
    nouvelle_abscisse = tortue.point.x + vecteur[0] * distance
    nouvelle_ordonnee = tortue.point.y - vecteur[1] * distance
    nouveau_point = svg.Point(nouvelle_abscisse,
                              nouvelle_ordonnee)
    # on dessine maintenant
    if tortue.crayon_en_bas:
        segment_svg = svg.genere_segment(tortue.point, nouveau_point)
        print(segment_svg)

    return TortueLogo(nouveau_point, tortue.direction, tortue.crayon_en_bas)

def tourne_droite(tortue, angle):
    """
    Renvoie une nouvelle tortue ayant changé de direction.

    La tortue change de direction en tournant à droite de l'angle
    donné (en degrés)
    """
    return TortueLogo(tortue.point, tortue.direction - angle, tortue.crayon_en_bas)

def tourne_gauche(tortue, angle):
    """Renvoie une nouvelle tortue ayant changé de direction.

    La tortue change de direction en tournant à gauche de l'angle
    donné (en degrés)
    """
    return TortueLogo(tortue.point, tortue.direction + angle, tortue.crayon_en_bas)

def baisse_crayon(tortue):
    """Renvoie une nouvelle tortue ayant baissé le crayon."""
    return TortueLogo(tortue.point, tortue.direction, True)

def leve_crayon(tortue):
    """Renvoie une nouvelle tortue ayant levé le crayon."""
    return TortueLogo(tortue.point, tortue.direction, False)

Difficulté

star star star star star

Exercices associés