Les paramètres
Retour sur les fonctions
Je peux déclarer une fonction, puis l'exécuter.
/js function metsDuRouge() { up(1).box(blocks.wool.red); }
/js metsDuRouge()
Note : attirer l'attention sur la différence entre metsDuRouge
et metsDuRouge()
. D'après les participant/e/s, quelle explication donner à cette différence ?
Entre les parenthèses
Si on écrit quelque chose entre les parenthèses, ça ne semble pas gêner le fonctionnement.
/js function metsDuRouge() { up(1).box(blocks.wool.red); }
/js metsDuRouge(4807)
/js metsDuRouge("C'est vraiment n'importe quoi")
Étonnant, non ?
Un indice sur ce qu'il se passe.
/js function monteDuRouge(hauteur) { up(hauteur).box(blocks.wool.red); }
/js monteDuRouge(3)
/js monteDuRouge(5)
Composer des fonctions
/js function monteDuRouge(hauteur) { up(hauteur).box(blocks.wool.red); }
/js function colonnePointillee() { monteDuRouge(1); monteDuRouge(3); monteDuRouge(5); }
/js colonnePointillee()
Ça ne se passe pas comme quand on enchaîne les actions d'un drone. Pour rappel :
/js up(1).box(blocks.wool.red).up(1).box(blocks.wool.blue)
Des pointillés dans le sol
Du coup, on peut faire une ligne pointillée de taille variable !
/js function pointilles(distance) { box(blocks.wool.blue).right(2).times(distance); }
/js pointilles(3)
/js pointilles(5)
Et si on changeait la couleur des pointillés ?
/js function pointillesCouleur(bloc, distance) { box(bloc).right(2).times(distance); }
/js pointillesCouleur(blocks.wool.blue, 3)
/js pointillesCouleur(blocks.wool.red, 5)
On peut avoir une ligne pointillée de couleur et de taille variables ! Pas mal :)
Si on veut construire un plongeoir de hauteur et de longueur variables, c'est plus dur.
/js function monte(hauteur) { up(1).box(blocks.wool.red).times(hauteur); }
/js function avance(distance) { fwd(1).box(blocks.wool.blue).times(distance); }
/js function plongeoir(hauteur, longueur) { monte(hauteur); avance(longueur) }
/js function plongeoir(10, 4)
Tiens, ça ne marche pas… la partie en bleu reste au sol, et pas en haut du pilone.
Un indice de ce qu'il se passe.
/js function enAvant(distance) { box(blocks.gold).fwd(1).times(distance); }
/js function aDroite(distance) { box(blocks.gold).right(1).times(distance); }
/js function enArriere(distance) { box(blocks.gold).back(1).times(distance); }
/js function aGauche(distance) { box(blocks.gold).left(1).times(distance); }
/js function truc() { enAvant(2); aDroite(4); enArriere(6); aGauche(8); }
/js truc()
Ah hah ! Le problème, on dirait, c'est qu'on n'enchaîne pas les actions du drone entre deux fonctions. Comment faire ?
De la même manière qu'on peut « entrer » un paramètre dans une fonction, on voudrait pouvoir « sortir » un résultat de la fonction. Ainsi, on pourrait faire rentrer un drone placé au bon endroit pour la deuxième fonction.
Pour faire « sortir » un résultat d'une fonction, il faut utiliser le mot-clef return
.
/js function pointillesCouleur(bloc, distance) { box(bloc).right(2).times(distance); }
/js function sorsUnBloc() { return blocks.emerald; }
/js bloc = sorsUnBloc()
/js pointillesCouleur(bloc, 4)
Du coup, maintenant on peut le faire, notre plongeoir !
/js function monte(hauteur) { return up(1).box(blocks.wool.red).times(hauteur); }
/js function avance(depart, distance) { depart.fwd(1).box(blocks.wool.blue).times(distance); }
/js function plongeoir(hauteur, longueur) { drone = monte(hauteur); avance(drone, longueur); }
/js plongeoir(2, 3)
Flûte, ça ne marche toujours pas... Comme le drone reste le même sur les deux fonctions, il contient à la fois les mouvements vers le haut et vers la droite. On va lui dire d'oublier les mouvements qu'il connaît déjà. On fait ça avec la commande drone.history = []
.
/js function monte(hauteur) { return up(1).box(blocks.wool.red).times(hauteur); }
/js function avance(drone, l) { drone.history = []; drone.fwd(1).box(blocks.wool.blue).times(l); }
/js function plongeoir(hauteur, longueur) { drone = monte(hauteur); avance(drone, longueur); }
/js plongeoir(2, 3)
Et voilà !
Notes :
- La ligne de saisie dans le client Minecraft ne permet pas de taper de longues séquences, d'où les nom de variables abrégées dans la fonction
plongeoir
. Ce n'est pas vraiment satisfaisant. Il faudra peut-être trouver mieux.