Méthodes retournant un résultat

Écrire une méthode retournant un résultat n'est pas tellement plus dur que pour les méthodes sans résultat. [!java]Il suffit d'écrire le type de données renvoyées par votre méthode avant son nom (là où nous écrivions void avant).[/!] [!scala]Il suffit d'ajouter deux points (:), le type de données renvoyées par votre méthode et le signe égal (=) entre les parenthèses de la déclaration et l'accolade du bloc. Cette syntaxe est assez proche de la définition d'une variable (avec son type) dont la valeur serait une fonction.[/!] Vous pouvez utiliser l'instruction return n'importe ou dans le corps de votre méthode pour spécifier que le calcul est fini (la suite de la méthode n'est pas exécutée) et donner la valeur à donner à l'appelant après le mot-clé return.

[!java]double pi() {[/!][!scala]def pi(): Double = {[/!][!python]def pi():[/!]
    return 3.14159[!java];[/!]
[!java|scala]}[/!]

En fait, vous pouvez également utiliser le mot-clé return dans les méthodes ne renvoyant pas de résultat, pour interrompre leur exécution. Dans ce cas, il ne faut bien entendu pas donner de valeur à droite du return.

Il est possible d'avoir plusieurs instructions return dans différentes branches de if. Ce qui est interdit, c'est d'avoir une branche du code qui n'est pas terminée par un return, ou d'écrire du code après le return. En effet, si la machine arrive à la fin de la méthode sans avoir rencontré de return, elle ne peut pas savoir quelle valeur communiquer à celui qui a appelé la méthode. De plus, le return interrompt immédiatement l'exécution de la méthode (pourquoi continuer à chercher quand on a déjà trouvé le résultat de la méthode?). Donc, s'il y a du code après un return, c'est sans doute une erreur, et le compilateur vous l'indique.

[!java|scala][!java]boolean [/!][!scala]def [/!]estDevantLibre()[!scala]:Boolean =[/!] {
    if (estFaceMur() == true) {
        return false;
        /* interdit d'écrire du code ici */
    } else {
        return true;
        /* pareil ici */
    }
    /* même ici, oubliez */
}[/!][!python]def estDevantLibre():
    if estFaceMur() == True:
        return False
        # interdit d'écrire du code ici
    else
        return True
        # pareil ici
# même ici, oubliez[/!]

Objectif de cet exercice

Vous allez encore une fois écrire une méthode qui sera utilisée par la buggle. Son nom doit être haveBaggle, et elle doit renvoyer un booléen indiquant si la colonne face à la buggle contient un biscuit ou non. Votre buggle va s'en servir pour chercher la première colonne contenant un biscuit et s'y arrêter.

Le plus simple pour écrire cette méthode est peut être d'utiliser une variable booléenne vuBiscuit indiquant si on a vu un biscuit jusque là. Initialement, elle contient faux.

Ensuite, on avance de 6 cases (le monde contient 7 cases, et on est déjà sur l'une d'entre elles). Pour chaque case, si elle contient un biscuit, on range la valeur vrai dans vuBiscuit (et on ne fait rien d'autre qu'avancer si non).

Quand on est arrivé à la fin, on recule de 6 cases, et on retourne le contenu de vuBiscuit à l'appelant.

Cet exercice est un peu particulier, puisqu'il a deux mondes initiaux, chacun ayant un objectif particulier. Votre code doit fonctionner pour chacun d'entre eux. Remarquez que le menu déroulant de sélection du monde (juste sous la barre de réglage de la vitesse) permet de spécifier le monde que vous souhaitez observer.

Quand votre méthode haveBaggle fonctionne, passez à l'exercice suivant.