TP⚓︎
Objectifs:⚓︎
- Se familiariser avec une bibliothèque graphique
- Travailler sur le concept de fonctions
NE PAS OUBLIER LE COMPTE RENDU : 1NSINF1, 1NSINF2
1. Davistk⚓︎
Ce TP utilise le module de dessin davistk que vous devez télécharger et placer dans le même dossier que les programmes que vous allez écrire.
Pour pouvoir l'utiliser dans un programme, vous devez charger les fonctions de ce module en écrivant la ligne from davistk import
en début de fichier.
La documentation du module se trouve là: davistk.brunache.ovh
Ce TP vous permettra de manipuler les fonctions du module de dessin et leurs arguments.
-
Copier le code ci-dessous dans un fichier et l'exécuter:
from davistk import * # Importe les fonctions du module davistk cree_fenetre(600,600) # Crée un fenetre de 600 par 600 rectangle(10,10,100,50) # Crée un rectangle rectangle(200,100,300,150) # Crée un autre rectangle attend_ev() # Attend un evenement (clic, touche clavier...) ferme_fenetre() # ferme la fenêtre
-
Dans un nouveau fichier
- Créer une fenêtre de 400 par 400
- Dessiner un cercle de rayon 100 centré au milieu de la fenêtre
- Dessiner un cercle rouge de rayon 100 légèrement à gauche du premier cercle.
2. Une balle rebondissante⚓︎
Récupérer le fichier suivant, le mettre dans le même dossier que celui utilisé jusqu'ici.
-
Copier le code suivant dans un nouveau fichier et l'éxécuter:
from balle import * def mise_a_jour_vitesse(dx, dy, ax, ay): return dx, dy # A modifier def mise_a_jour_position(x, y, dx, dy): return x, y # A modifier def affiche_balle(x, y, taille): ... # A modifier x, y = 100, 50 # Position initiale de la balle taille = 10 # Rayon de la balle dx, dy = 1, 1 # Vitesse initiale de la balle à chaque rafraichissement la balle se déplace de dx et de dy cree_fenetre(400, 400) encore = True # Booléen permettant d'arrêter lorsqu'on appuie sur l'icone pour fermer la fenêtre while encore: # Boucle (on verra ca plus tard) permettant de répéter les actions indentées ci-dessous à chaque rafraichissement d'image ax, ay, encore = gestion_evenement() # permet de récupérer les touches claviers et les clics dx, dy = mise_a_jour_vitesse(dx, dy, ax, ay) # permet de calculer la nouvelle vitesse en fonction de l'accélération demandée par le joueur x, y = mise_a_jour_position(x, y, dx, dy) # permet de calculer la nouvelle position de la balle en fonction de sa vitesse x, y, dx, dy = gestion_collision(x, y, dx, dy, taille) # Permet de gérer les collisions avec les murs affiche_balle(x, y, taille) # Affiche la balle ferme_fenetre() # ferme la fenêtre lorque l'on clique sur l'icone pour fermer la fenetre
On donne ci-dessous les docstrings et doctests des fonctions gestion_evenement et gestion_collision
def gestion_evenement(): """Cette fonction permet de récupérer les informations du joueur tels que les touches pressées et le clic sur l'icone fermer. Si le joueur presse une touche de direction (droite, gauche, haut, bas) la fonction retourne le changement de vitesse à réaliser. Exemple: - si il presse à gauche, cela signifie que la vitesse horizontale diminue (en l'occurence, elle diminuera de 1), la fonction renvoie donc: -1, 0, True (le dernier étant le fait de continuer le jeu) - si il presse en bas, cela signifie que la vitesse verticale augmente (en l'occurence, elle augmentera de 1), la fonction renvoie alors: 0, 1, True Si le joueur clique sur l'icone pour fermer la fenetre, la fonction renvoie 0, 0, False (ce dernier servant à arreter le jeu)""" def gestion_collision(x, y, dx, dy, taille): """Cette fonction gère les collisions de la balle avec les murs, si la balle touche un mur sa vitesse est modifiée suivant la règle suivante: - Si elle touche un mur de droite ou de gauche, la vitesse verticale n'est pas modifiée mais la vitesse horizontale est opposée. - Si elle touche un mur de haut ou de bas, la vitesse horizontale n'est pas modifiée mais la vitesse verticale est opposée. Pour éviter des problème de 'traversée' de mur on remet la balle exactement sur le mur. Attention le fait de toucher le mur dépend de la position de la balle et de sa taille. >>> gestion collision(100, 391, 2, 3, 10) # touche en bas (100, 390, 2, -3) # la balle remonte alors """
-
Pourquoi rien ne s'affiche-t-il ?
- Compléter la fonction
affiche_balle
sachant que l'on représentera la balle par un cercle de rayontaille
. Tester. -
Compléter la fonction
mise_a_jour_position
de manière à ce qu'elle réponde au docstring et doctests suivant:def mise_a_jour_position(x, y, dx, dy): """Cette fonction renvoie la nouvelle position de la balle en fonction de sa positoin précédente et de sa vitesse. Exemple: >>> mise_a_jour_position(120, 133, -3, 4) (117, 137) """
Retester.
-
Compléter la fonction
mise_a_jour_vitesse
de manière à ce qu'elle réponde au docstring et doctests suivant:def mise_a_jour_vitesse(dx, dy, ax, ay): """Cette fonction renvoie la nouvelle vitesse de la balle en fonction de sa vitesse précédente et de son changement de vitesse. Exemple: >>> mise_a_jour_vitesse(2, -3, 1, -2) (3, -5) """
Retester.
-
Modifier la couleur de la balle.
- La pesanteur est une accélération (un changement de vitesse) constament vers le bas, simuler cette accélération dans votre jeu.
3.
Calculer avec des fractions⚓︎
Dans cet exercice, on manipulera des fractions à l'aide de couples d'entiers. Par exemple, la fraction \(\frac{a}{b}\) sera représentée par le couple \((a, b)\), qui s'écrit également en Python (a, b)
, ou même parfois simplement a, b
.
Par exemple, pour initialiser une fraction f
à la valeur \(\frac{3}{4}\), on écrira : f = (3, 4)
. Réciproquement, pour récupérer les valeurs du numérateur et du dénominateur de f
dans deux variables a
et b
, on écrira : (a, b) = f
. On reviendra sur ce type de valeurs plus tard dans le cours.
- Écrire une fonction
valeur_approchee(f)
recevant une fraction et renvoyant sa valeur approchée sous forme defloat
. - Écrire une fonction
simplifier(f)
recevant une fraction et en renvoyant une forme simplifiée. On utilisera la fonctiongcd
du modulemath
. - Écrire une fonction
oppose(f)
recevant une fraction et renvoyant son opposé. - Écrire une fonction
inverse(f)
recevant une fraction et renvoyant son inverse. - Écrire une fonction
multiplier(f, g)
recevant comme paramètres deux fractionsf
etg
et renvoyant leur produit, et une fonctiondiviser(f, g)
renvoyant leur quotient. Cette dernière fonction devra utiliser la fonctionmultiplier
. Écrire une fonction
additionner(f, g)
recevant comme paramètres deux fractionsf
etg
et renvoyant leur somme, et une fonctionsoustraire(f, g)
renvoyant leur différence. Cette dernière fonction devra utiliser la fonctionadditionner
.- Modifier (si nécessaire) toutes les fonctions précédentes afin qu'elles renvoient toujours des fractions irréductibles (c'est-à-dire sous forme simplifiée).