Dessins avec turtle¶
turtle¶
On utilisera les fonctions suivantes de la bibliothèque turtle :
forward(x)
avance la tortue dex
pas,backward(x)
la recule;left(d)
etright(d)
change l'orientation ded
degrés vers la gauche ou la droite;done()
permet d'afficher l'animation de la tortue dans le résultat de la cellule
Et on pourra aussi utiliser :
penup()
etpendown()
pour lever et abaisser le stylospeed(v)
règle la vitesse, de1
pour la plus lente à11
pour la plus rapide (pas d'animation)goto(x,y)
déplace directement la tortue vers les coordonnées(x,y)
color(colorstring)
change la couleur du stylo avec un nom ou code hexadécimal :color("red")
oucolor("#a0c8f0")
.
from turtle import *
# Question 1 : comment peut-on importer seulement certaines fonctions
# (par exemple forward et left) d'une bibliothèque ?
# Réponse : from turtle import forward, left
# Question 2 : quelle est l'autre manière d'importer une bibliothèque ?
# Quels sont les avantages/inconvénients ?
# Réponse : import turtle
# on doit alors préfixer les noms de fonctions du nom de la biliothèque et d'un point
# "turtle.forward" au lieu de "forward"
# ça a l'inconvénient d'être plus long à écrire, mais c'est clair dans le code d'où vient la fonction
# et ça permet d'importer des fonctions qui avaient le même nom que d'autres fonctions déjà définies
# Exemple d'utilisation :
color("green")
right(45)
forward(40)
left(100)
forward(100)
right(145)
penup()
forward(80)
left(135)
pendown()
color("red")
forward(100)
backward(50)
left(90)
forward(50)
backward(100)
done()
Dessin 1 : spirale¶
Initialisez une variable qui contient la longueur du côté, puis faites une boucle pour dessiner la spirale en augmentant la longueur du côté à chaque tour de boucle.
longueur_cote = 10
for i in range(20):
forward(longueur_cote)
left(90)
longueur_cote = longueur_cote + 5
done()
""" Autre possibilité en utilisant directement la variable de boucle i (+ court à écrire mais moins clair)
for i in range(20):
forward(5+5*i)
left(90)
"""
' Autre possibilité en utilisant directement la variable de boucle i (+ court à écrire mais moins clair)\nfor i in range(20):\n forward(5+5*i)\n left(90)\n'
Dessin 2 : polygone¶
Créez une fonction polygone(n, cote)
qui dessine un polygone avec n
côtés de longueur cote
.
Astuce : pour savoir de combien de degrés il faut tourner entre chaque côté, on peut se dire qu'on va tourner n
fois et qu'à la fin du polygone on aura fait un tour complet, donc 360 degrés.
Testez la fonction avec différentes valeurs, par exemple pour faire un octogone:
def polygone(n, cote): # Rappel : les paramètres quand on crée la fonction sont abstraits
for i in range(n): # on ne sait pas quand on écrit le code de la fonction la valeur de n ou de cote
forward(cote) # ce sont juste des variables dont la valeur sera utilisée à l'execution
left(360//n)
polygone(3,100) # Ici, au moment d'appeler la fonction, on choisit les valeurs pour n et cote
polygone(5,20) # La fonction est donc polyvalente : on peut choisir des valeurs différentes à chaque appel
done()
Dessin 3 : suite de polygones¶
Ré-utilisez la fonction précédente dans une boucle pour dessiner une série de polygones :
penup()
backward(200)
for n in range(3,11): # on pourrait aussi faire avec une variable qu'on augmente à chaque tour de boucle
pendown() # comme on avait fait pour la spirale
polygone(n,30)
penup()
forward(50)
done()
Dessin 4 : colorer les polygones¶
Copiez et compléter la fonction suivante pour générer des codes de couleur aléatoires en hexadécimal. Vous devez juste prendre pour r,g,b des entiers aléatoires entre 0 et 255.
from random import randint
def random_colorcode():
r = ...
g = ...
b = ...
return f'#{r:02x}{g:02x}{b:02x}'
On peut utiliser fillcolor(code)
pour changer la couleur de remplissage de la tortue. Il faut ensuite appeler begin_fill()
au début du polygone à remplir et end_fill()
à la fin.
Utiliser tout cela pour obtenir le dessin suivant :
from random import randint
def random_colorcode():
r = randint(0,255)
g = randint(0,255)
b = randint(0,255)
return f'#{r:02x}{g:02x}{b:02x}'
penup()
backward(300)
for n in range(3,11):
pendown()
fillcolor(random_colorcode())
begin_fill()
polygone(n,40)
end_fill()
penup()
forward(60)
done()
Dessin 5 : histogramme¶
Créez une fonction qui prend en paramètre une liste d'entier positifs, et dessine l'histogramme où la hauteur de chaque barre est proportionnelle à la valeur dans la liste.
Par exemple avec la liste [12,2,10,5,3,16,2,1,7,11]
on doit obtenir quelque chose comme :
def histogramme(l):
for v in l: # Rappel : avec cette boucle v parcourt directement les valeurs de la liste
left(90)
forward(10*v)
right(90)
forward(10)
right(90)
forward(10*v)
left(90)
forward(20)
histogramme([12,2,10,5,3,16,2,1,7,11])
done()
Exercice sur les listes : saut maximum¶
On suppose que notre histogramme est en fait un niveau d'un jeu de plateforme où notre personnage doit sauter de barre en barre comme ceci :
Créez une fonction saut_max(hauteurs)
qui prend en paramètre la liste qui a servi à créer l'histogramme et renvoie la hauteur maximale que devra sauter le personnage dans le niveau. Sur la liste précédente la fonction devrait renvoyer 16-3 = 13
.
Utilisez assert
pour confirmer que votre fonction donne la bonne réponse sur quelques exemples de listes choisies à la main.
def saut_max(hauteurs):
resultat = 0 # initialisation de la valeur maximum
for i in range(len(hauteurs)-1): # on regarde le saut de la barre i à i+1 donc il faut s'arréter 1 avant la fin
saut = hauteurs[i+1] - hauteurs[i]
if saut > resultat:
resultat = saut
return resultat
assert saut_max([12,2,10,5,3,16,2,1,7,11]) == 13
assert saut_max([1,2,3]) == 1
assert saut_max([1,1]) == 0
assert saut_max([42]) == 0
assert saut_max([100,0,2]) == 2