Funções

Frequentemente, você vai querer escrever um método que calcula algum valor e o retorna. Métodos retornando resultados são chamados funções. Escrever uma função não é realmente mais difícil do que escrever um simples método. [!java|c]Você simplesmente tem que especificar o tipo de dados do resultado esperado entes do nome da função (onde nós previamente tínhamos void).[/!] [!scala]Você simplesmente tem que adicionar um dois-pontos (:) depois do parêntesis e escrever o tipo de dados que sua função vai retornar, e adicionar um símbolo de igualdade (=). Esta sintaxe é na verdade mais próxima de definir uma variável, com seu tipo, do que na verdade escrever uma função.[/!] Você pode usar a instrução return em qualquer lugar do corpo da sua função para especificar que o cálculo foi feito (a função não continuará sendo executada), e que o resultado é o valor que acompanha a palavra-chave return.

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

Na verdade, você também pode usar a palavra-chave return em métodos que não retornam qualquer resultado, para interromper o cálculo. Obviamente que nestes casos você não passa nenhum valor para retornar.

É possível ter várias instruções return em várias ramificações de um condicional. De fato, é proibido ter um caminho de execução no corpo da função sem nenhum return, ou escrever algum código depois da instrução return. Na verdade, se a máquina alcança o fim da função sem encontrar qualquer return, ela não sabe o real valor que deve retornar a quem chamou a função. Além disto, o return interrompe imediatamente a execução da função (por que se preocupar olhando além quando você sabe o resultado da função?). Então, se existe algum código depois de um return, deve ser um erro e o compilador irá te alertar disto.

[!java|scala|c][!java]boolean [/!][!c]int [/!][!scala]def [/!]isFrontFree()[!scala]:Boolean =[/!] {
    if (estáDeFrenteParaParede() == [!java|scala]true[/!][!c]1[/!]) {
        return [!java|scala]false[/!][!c]0[/!];
        /* proibido colocar código aqui */
    } else {
        return [!java|scala]true[/!][!c]1[/!];
        /* nem aqui */
    }
    /* e nem mesmo aqui. desista */
}[/!][!python]def livreEmFrente():
    if estáDeFrenteParaParede() == True:
        return False
        # proibido colocar código aqui
    else
        return True
        # nem aqui
# e nem mesmo aqui, desista[/!]

Objetivo do exercício

Você vai mais uma vez escrever uma função que o buggle vai usar. Seu nome deve ser temBaggle, e ela retorna um valor booleano indicando se a linha na frente do buggle contém um baggle ou não. O buggle vai usar isto para buscar a primeira linha contendo um baggle, e parar nela.

A forma fácil de fazer esta função é usar uma variável booleana chamada baggleAvistado indicando se nós vimos ou não um baggle até o momento. O valor inicial é '[!python]False[/!][!scala|java]false[/!][!c]0[/!]'.

Então mova 6 passos para frente (o mundo contém 7 células e nós já estamos em uma delas). Para cada célula, se ela contiver um baggle, vamos guardar true em baggleVisto (e se não, vamos simplesmente andar para frente).

No final, vamos nos mover 6 passos para trás, e retornar o valor de baggleVisto para quem chamou o método.

Note that the used buggle provides some hidden code that will call your haveBaggle function on each column, moving automatically between columns. It is thus very important that your haveBaggle function have no side effect: the position (and orientation) at the end of your code must be the one observed at the beginning of this code. It will move in between to seek for the baggle, but come back to the column start.

Also, this exercise is a bit different since there is two initial worlds, each with a specific objective. Your code must work for each of them. Observe that the world selection scrolling menu (right below the speed slider) allows to switch the observed world.

Quando sua função temBaggle funcionar, siga para o próximo exercício.