On regarde devant soi

Contenu

On regarde devant soi#

Ici, plus de caillou. La fourmi doit parcourir un long couloir; comment faire ?

from laby.global_fr import *
Laby(niveau="2a")

Il serait bien sûr possible de copier la commande avance() autant de fois que nécessaire, mais c’est long et répétitif. Ce que l’on voudrait donner comme consigne à la fourmi, c’est «tant que la case devant la fourmi est vide, avancer». Outre sa concision, cette consigne ne dépends pas de la longueur du couloir.

Dans cette feuille, nous allons découvrir comment écrire cette consigne sous la forme d’un programme Python.

On commence par introduire une nouvelle commande qui permettra de regarder le contenu de la case devant la fourmi:

regarde()  # Renvoie Mur, Vide, Sortie, Caillou, PetitCaillou, Toile, PetiteToile ou Inconnu
           # selon ce qui se trouve dans la case juste devant la fourmi

Par exemple, dans le labyrinthe suivant, il y a un mur juste devant la fourmi:

from laby.global_fr import *
carte = """
o x o
o ↓ o
o o o
"""
Laby(carte=carte)

La commande regarde() renvoie alors la valeur Mur:

regarde()
Tile(name='wall', char='o')
Mur
Tile(name='wall', char='o')

On peut alors comparer ce qu’il y a devant la fourmi avec l’une des valeurs prédéfinies. Par exemple, la case devant la fourmi contient un mur, donc l’expression suivante est vraie (True en Anglais):

regarde() == Mur
True

et elle n’est pas vide, donc l’expression suivante est fausse (False en Anglais):

regarde() == Vide
False

On introduit maintenant la boucle while (Tant que en anglais) qui s’écrit comme suit en Python:

while condition:
    instructions

Elle signifie : «Tant que la condition est vraie, on répète les instructions».

Dans le programme suivant, cela donne «Tant que la fourmi regarde un mur, tourner à droite»:

from laby.global_fr import *
carte = """
o x o
o ↓ o
o o o
"""
Laby(carte=carte)
debut()
while regarde() == Mur:
    droite()
ouvre()

En vous inspirant de cet exemple, programmez la fourmi pour sortir du long couloir ci-dessous.

from laby.global_fr import *
from random import randint
l = randint(2,20)
carte = "o " + "o " * l + "o\n"
carte+= "o " + "→ " + ". " * (l-1) + "x\n"
carte+= "o " + "o " * l + "o\n"
Laby(carte = carte)
debut()
### BEGIN SOLUTION
while regarde() == Vide :
    avance()
### END SOLUTION
ouvre()
assert est_gagnant()

Vérifiez que votre programme fonctionne quelle que soit la longueur du couloir. Pour cela, exécutez plusieurs fois les trois cellules ci-dessus.

Bilan#

Avec la boucle while, nous venons de voir une première structure de contrôle. Vous aurez noté que, pour distinguer les instructions qui sont dans la boucle de celles qui sont après la boucle, il y a quatre espaces supplémentaires en début de chaque ligne. On appelle cela l’indentation. La convention en Python est que les lignes dans une structure de contrôle sont indentées avec quatre espaces de plus que les lignes alentours.