Table des Matières

Sujet précédent

15. Résumé

Sujet suivant

17. Droit au but

Cette page

16. Si seulement ...

Si seulement Reeborg pouvait prendre des décisions de lui-même, écrire des programmes serait tellement plus simple ... OUPS ! J’ai oublié de vous le mentionner: Reeborg peut prendre ses propres décisions!

16.1. Énoncé if

if est un mot anglais, qu’on peut traduire par “si” en français. L’énoncé if suit un patron semblable à celui de def:

def un_nom():
    # bloc de code A

if une_condition:
    # bloc de code B

Ce bloc de code B ne sera exécuté que si la condition est vérifiée, autrement il sera traité comme s’il ne contenait aucune instruction.

Cependant, si l’exécution du programme faisait une boucle, et que cette partie du code était exécutée à nouveau, la condition de l’énoncé if serait réévaluée à chaque fois pour décider si le bloc de code B doit être exécuté ou non.

On peut représenter un énoncé if par un organigramme:

../_images/if2.jpg

Python regarde si la condition se vérifie : si oui, il attribue le mot-clé True (se traduit par «vrai» en français) à l’instruction if et exécute le bloc d’instructions; sinon il lui attribue le mot-clé False (se traduit par «faux» en français) et saute par-dessus le bloc d’instructions comme s’il n’était pas là.

16.2. Plus utile que vous ne le pensez...

Note

Le terme général utilisé pour décrire une fonction donnant un résultat équivalent à True ou False dans un énoncé if est une condition:

if condition:
    ...

Il existe des fonctions, utilisées comme des conditions, que Reeborg reconnaît comme lui indiquant des décisions à prendre. Une de ces fonctions est objet_ici() qui indique à Reeborg si un ou plusieurs objets se trouvent aux coordonnées où Reeborg est situé. Par exemple, si on demandait à Reeborg de collectionner des jetons, une partie du code pourrait être:

if objet_ici():
    prend()

Examinez à tour de rôle les mondes Jetons 1 et Jetons 2. Dans chaque cas, en supposant que Reeborg se déplace le long d’une ligne, tout ce qu’il a à faire lorsqu’il trouve un jeton est:

  1. prendre ce jeton
  2. avancer d’une case
  3. déposer ce jeton
  4. avancer d’une autre case
  5. et il termine()

où j’ai introduit une nouvelle instruction que Reeborg comprend: termine(), qui indique à Reeborg qu’il doit arrêter l’exécution.

Écrivons donc une esquisse d’un programme unique qui pourrait permettre à Reeborg d’accomplir la tâche dans les deux mondes mentionnés ci-dessus, soit Jetons 1 et Jetons 2:

def avance_jusque_tâche_terminée():
    avance()
    if objet_ici():
        # quelque chose
        # quelque chose d'autre
        # autre chose encore
        # une de plus
        termine()

repeat 42:
    avance_jusque_tâche_terminée()

Pourquoi 42? ... Je n’ai pas de véritables raisons pour ce choix. Tout ce que je veux est que Reeborg avance suffisamment de fois pour compléter sa tâche peu importe la dimension du monde. Les deux mondes en question sont suffisamment petits que de répéter 42 fois est plus que suffisant; certains diraient même que c’est excessif. Si vous pensez la même chose, je suis d’accord avec vous, ceci ne semble pas être une façon très intelligente de faire les choses ... On fera mieux plus tard.

À votre tour!

Copiez le code ci-dessus dans l’éditeur de code, ajoutez les instructions manquantes, et vérifiez que votre programme fonctionne dans les mondes Jetons 1 et Jetons 2.

Pour les enseignants

La fonction objet_ici() retourne une liste des types d’objets trouvés à un endroit donné. Par exemple, s’il y a des étoiles et des jetons, objet_ici() retournerait soit ["étoile", "jeton"] ou ["jeton", "étoile"]. Si aucun objet n’est présent, une liste vide est retournée. Comme vous le savez sans doute, Python considère une liste vide comme étant l’équivalent de False dans un énoncé if, et une liste non vide comme étant l’équivalent de True.

Si plusieurs objets pouvaient se trouver dans un monde donné et qu’on ne s’intéresse qu’à un seul type d’objet, on peut spécifier le type en utilisant un argument:

if objet_ici("jeton"):
    prend("jeton")

S’il y a un ou des jetons présents, la fonction retournera la liste ["jeton"]; sinon, elle retournera une liste vide.