Voici la cause du problème que nous avons vu à la fin de la 1re partie : nous posions une sonnette et, avant d'avoir l'occasion d'avancer, testions pour voir s'il n'y avait pas de sonnette à cet endroit. Puisqu'il y avait déjà là une sonnette depuis le début, nous n'avions jamais l'occasion d'entrer dans la boucle while. Peut-être que nous pouvons changer le programme pour ajouter un move() avant de commencer la boucle, comme suit :
put_beeper()
move()
while not on_beeper():
if front_is_clear():
move()
else:
turn_left()
turn_off()
Essayez-le !
Essayons le programme que nous avons écrit sur un monde légèrement plus compliqué, comme celui qui suit, que vous pouvez facilement reproduire. Vous pourriez vouloir enregistrer le monde dans un fichier monde avant d'essayer votre programme.
Quand vous essayerez votre programme, vous verrez que le résultat n'est pas exactement ce que nous voulions : Reeborg prend un raccourci, et ne fait pas tout le tour.
Le problème est que nous avions supposé que Reeborg devait seulement avancer ou tourner à gauche pour faire le tour du monde. Nous n'avons jamais pris en compte les situations dans lesquelles nous aurions voulu qu'il tourne à droite. Ce que Reeborg doit faire est vérifier d'abord à sa droite pour voir s'il y a encore un mur ; si ce n'est pas le cas, il doit tourner à droite. Voici un programme modifié qui essaie de faire justement cela :
def turn_right():
repeat(turn_left, 3)
put_beeper()
move()
while not on_beeper():
if right_is_clear():
turn_right()
elif front_is_clear():
move()
else:
turn_left()
turn_off()
Est-ce que cela fonctionne ? Lisez-le attentivement pour vous décider. Ensuite, essayez-le pour confirmer votre opinion, ou alors faites les changements qui vous semblent adéquats.