Comme vous le savez, Reeborg peut voir s’il y a un obstacle qui bloque son chemin avec rien_devant(); il peut également déterminer s’il y a un obstacle à sa droite avec rien_a_droite(). Malheureusement, il ne peut pas détecter des obstacles à sa gauche. Vous allez corriger ceci.
Important
Assurez-vous de sélectionner Javascript comme langue de programmation.
Explorons le code en exécutant ce qui suit:
voir_source(rien_devant)
Le résultat que je vois est le suivant:
function () {
return RUR.control.front_is_clear(RUR.current_world.robots[0]);
}
Note
On peut traduire front_is_clear par rien_devant, et right_is_clear par rien_a_droite.
avec un résultat semblable pour voir_source(rien_a_droite). Poursuivons notre exploration en exécutant ce qui suit:
voir_source(RUR.control.front_is_clear)
Le résultat que j’obtiens, et qui est très différent de celui que j’avais obtenu lorsque je préparais la première version de ce tutoriel, est le suivant:
function (robot){
var tile, tiles, tilename;
if( RUR.control.wall_in_front(robot)) {
return false;
}
tile = RUR.control.tile_in_front(robot);
if (tile) {
if (tile.detectable && tile.fatal){
if (tile == RUR.tiles.water) {
if (!RUR.control._bridge_present(robot)){
return false;
}
} else {
return false;
}
}
}
tiles = RUR.control.top_tiles_in_front(robot);
if (tiles) {
for (tilename in tiles) {
if (RUR.top_tiles[tilename] !== undefined &&
RUR.top_tiles[tilename].detectable &&
RUR.top_tiles[tilename].fatal) {
return false
}
}
}
return true;
}
Bon, tout cela est très compliqué ... essayons plutôt ce qui suit:
voir_source(RUR.control.right_is_clear)
Ah, ceci semble beaucoup plus simple! Voici le résultat que je vois:
function (robot){
var result;
RUR._recording_(false);
RUR.control.__turn_right(robot);
result = RUR.control.front_is_clear(robot);
RUR.control.turn_left(robot);
RUR._recording_(true);
return result;
}
Tenant compte du fait qu’en Javascript on a besoin de déclarer les variables locales, ce qui n’est pas requis en Python, voici comment on pourrait écrire une fonction équivalente en Python:
def function(robot):
RUR._recording_(False)
RUR.control.__turn_right(robot)
result = RUR.control.front_is_clear(robot)
RUR.control.turn_left(robot)
RUR._recording_(True)
return result
et voici la traduction française correspondante:
def fonction(robot):
RUR._enregistrement_(False)
RUR.control.__tourne_a_droite(robot)
résultat = RUR.control.rien_devant(robot)
RUR.control.tourne_a_gauche(robot)
RUR._enregistrement_(True)
return résultat;
Comme on peut le voir, le créateur de Reeborg a inclus le prototype d’une fonction permettant à Reeborg de tourner directement à droite: RUR.control.__turn_right. Il a utilisé la convention Python d’utiliser un nom qui débute avec deux caractères de soulignement pour dénoter un objet “privé”, qui n’est pas à l’intention des programmeurs externes comme nous.
Voici un résumé de l’effet de la fonction:
L’arrêt temporaire de l’enregistrement fait en sorte qu’on ne voit jamais à l’écran les mouvements de Reeborg lorsqu’il tourne tout d’abord à sa droite avant de retourner à son orientation de départ. Il est très malin ce programmeur...
Important
Assurez-vous de sélectionner Python comme langue de programmation pour ce qui suit.
À votre tour!
Ensuite, en vous inspirant de la logique de la méthode Javascript rien_a_droite ci-dessus, ajouter une méthode rien_a_gauche à votre classe RobotRéparé. Au lieu d’utiliser la méthode Javascript RUR._recording_() pour arrêter ou reprendre l’enregistrement, vous devriez utiliser la fonction Python enregistrement() dont je vous ai caché l’existence jusqu’ici.
Je suggère que vous placiez votre classe ``RobotRéparé`` dans votre bibliothèque.
Finalement vous pouvez tester votre méthode avec le monde Vide et le code ci-dessous:
from biblio import RobotRéparé
reeborg = RobotRéparé()
while reeborg.rien_a_gauche():
reeborg.tourne_a_gauche()
Si vous avez bien fait le tout correctement, Reeborg devrait faire un seul virage à gauche avant que le programme ne termine.