Sous condition

Être capable de conduire des tests pour vérifier qu'une condition est remplie ou non fait partie des fondamentaux de l'informatique. Ici, nous allons devoir vérifier qu'une variable est dans un domaine de validité

L'exercice habituel pour cela est de comparer l'âge d'une personne à 18 ans, pour savoir si cette personne peut voter. On a une condition (la personne a plus de 18 ans). Si cette condition est remplie, la personne peut voter, sinon elle ne le peut pas

Comme la plupart des langages informatiques, Python utilise l'anglais pour "s'exprimer". Aussi le vocabulaire est simple :

Voici l'exemple simple sur l'age

On notera deux choses :

Ne pas dépasser les bornes des limites

Comme le poisson rouge Maurice l'a appris, il ne faut pas dépasser les bornes des limites

Notre algoblob aussi doit apprendre à ne pas dépasser les bornes des limites.

  1. Vous allez reprendre dans votre éditeur le code précédent ou votre algoblob a pris vie (cf ci-dessous)
  2. Vous allez rajouter des conditions sur ses déplacements : si son abscisse dépasse la largeur, alors son abscisse devient la largeur
  3. Testez votre code pour vérifier son bon fonctionnement
import p5

largeur = 500
hauteur = 500
abscisse = 250
ordonnee = 250
rayon = 20

def setup():
    p5.size(largeur,hauteur)

def draw():
    global abscisse
    p5.background(0)
    p5.circle(abscisse,ordonnee,rayon)
    abscisse = abscisse + 1

p5.run()

Voilà, notre algoblob a un peu appris à ne pas dépasser les bornes des limites.

Varier les plaisirs

Votre algoblob bouge certes. Mais toujours de la même façon. Nous allons donc ajouter un petit peu d'aléatoire la dedans, pour que le mouvement soit différent à chaque éxécution du programme.

La bibliothèque random

Pour cela nous allons utiliser la bibliothèque random. Juste après l'import de la bibliothèque p5 au début du programme, rajoutez une ligne avec import random. Cela va vous permettre d'utiliser la bibliothèque random (ce qui en anglais signifie aléatoire). Nous allons définir deux nouvelles variables : vitesseX et vitesseY, qui indiqueront à quelle vitesse va se déplacer le blob suivant les axes horizontaux et verticaux. Nous allons utiliser la fonction de la bibliothèque random qui s'appelle uniform. Elle prend deux arguments et donne un nombre aléatoire en le minimum et le maximum. Le début de notre code deviendra donc

import p5
import random

largeur = 500
hauteur = 500
abscisse = 250
ordonnee = 250
vitesseX = random.uniform(-5,5)
vitesseY = random.uniform(-5,5)
rayon = 20

Il va maintenant falloir modifier la fonction draw pour prendre en compte les nouveaux éléments

Modifiez votre programme de sorte que :
  1. l'abscisse et l'ordonnée pourront tous les deux varier. Il faudra donc les passer tous les deux en variable globale
  2. l'abscisse augmentera à chaque tour de vitesseX et non plus de 1
  3. l'ordonnée augmentera à chaque tour de vitesseY
  4. On ne peut plus se contenter de tester que l'algoblob ne sort pas du côté droit. Il faut aussi qu'il ne sorte pas à gauche (ce qui arrive quand l'abscisse est plus petite que 0), ni par le haut, ni par le bas.
N'oubliez pas de tester et de profiter du sentiment de satisfaction que vous pouvez retirer de voir que tout avance.
  • Pour effectuer un test, on utilise une condition et le mot clef if.
  • Si la condition(ou les conditions) n'est pas vérifié, on utilise le mot clef else
  • Les clauses liées aux condtions sont suivies d'un : et d'un bloc d'instruction indenté

Vous pouvez aller un peu plus loin en cas de besoin et revoir les tests sur OpenClassrooms

Testons encore un peu plus

Au début du programme, nous fixons vitesseX et vitesseY avec des nombres aléatoire. Il se pourrait que la vitesse soit nulle aussi bien en abscisse qu'en ordonnée. On ne veut pas d'un algoblob totalement immobile. Aussi, on va vérifier qu'il n'est pas avec une vitesse nulle sur les deux axes. Si c'est le cas, on fixera la vitesse à 1 en abscisse et 0 en ordonnée.

Voici le code pour que l'on peut faire actuellement pour cela

if vitesseX == 0 :
    if vitesseY == 0 :
        vitesseX = 1

Première constatation : pour comparer, on utilise pas le = car celui ci sert à l'affectation. On utilise le symbole ==

Seconde constatation : on a utilisé deux "si" successifs. Comme si en français on avait dit "si la vitesse est nulle en abscisse et si la vitesse est nulle en ordonnée". C'est assez lourd. Comme en français, on peut combiner les conditions "Si la vitesse est nulle en abscisse et nulle en ordonnée". Cela va se traduire ainsi :

if vitesseX == 0 and vitesseY == 0 :
    vitesseX = 1

C'est quand même plus léger !

Il y a trois opérateurs logiques à connaître : le ET logique and, le OU logique or, et la négation logique not

En cas de besoin, vous pouvez aller plus loin et consulter plus d'exemples sur le site de l'IREM de la Réunion

Rebondir !

Dernière étape : notre algoblob peut maintenant partir dans toutes les directions. Mais quand il se heurte au murs, il reste bloqu". Du coup, mis à part le cas d'une des deux vitesses qui est nulle, il finit toujours dans l'un des quatres coins. C'est un peu déprimant au final. On se propose donc de le faire rebondir. Comment ? Quand il touche un bord, la vitesse horizontale ou verticale correspondante doit être changée en son oppposée. En effet, s'il sort "par la droite", vitesseX était positive et pour le faire aller vers la gauche, elle devra être négative. Il faut donc compléter le code

if abscisse > 500 :
    abscisse = 500
    vitesseX = -vitesseX
  1. Modifiez votre programme pour que les 4 possibilités de rebond soient prises en compte
  2. Il est fort probable que vous ayez une erreur. Une instruction n'a pas été donnée. Laquelle ?
  3. Testez votre programme et soyez fiers du résultat. Votre algoblob vit de façon beaucoup plus variée. Il s'amuse grâce à vous.

Nous avons bien progressé. Nous allons verrons plus tard comment alléger un peu le code, en le faisant tenir sur moins de lignes tout en restant compréhensible.