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.