## Instruções condicionais

Programas feitos simplesmente de um conjunto de instruções similares ao do exercício anterior são bastante chatos. Sempre fazem a mesma coisa e não reagem a condições externas. Um condicional faz o programa se adaptar a fazer coisas do tipo se está a chover, leve um guarda-chuva.

A sintaxe de [!thelang] é a seguinte:

    [!java|scala|c]if (condição) {
        whatToDoIfTrue();
        whatToDoNextIfTrue();
    }[/!][!python]if condição:
        whatToDoIfTrue()
        whatToDoNextIfTrue()[/!]
    whatToDoAnyway()[!java|c];[/!]

Se a condição for verdade, o código do próximo bloco será executado e então o resto do código continua. Se a condição for falsa, o próximo bloco é ignorado e a execução continua depois disto. O bloco condicional pode conter várias instruções, pode até mesmo conter outros testes, com os próprios sub-testes dele.

Neste exemplo, as instruções `whatToDoIfTrue()` e `whatToDoNextIfTrue()` serão executadas se e somente se a condição for verdadeira, mas a instrução `whatToDoAnyway()` vai ser executada se a condição for verdadeira ou não.

Em [!thelang], os blocos de código são [!java|scala|c]envolvidos entre chaves: um { abre o bloco e um } fecha-o. Espaços em branco não são importantes[/!][!java|c].[/!][!scala], uma vez que as suas instruções ainda estejam separadas com um ponto-e-vírgula ou um fim-de-linha.[/!] [!java|scala|c]Ainda assim é muito importante indentar corretamente o seu código para mantê-lo legível.[/!] [!python]marcados pela indentação: todas as linhas que estiverem um pouco deslocadas para a direita com espaços pertencem ao bloco. Frequentemente se usam 4 espaços para indentação, mas funciona se usar mais ou menos espaços. A resumir, quaisquer linhas do bloco devem usar a mesma quantidade de espaços. O fim do bloco de código Python não é marcado por nenhum caractere específico. Indentar linhas começa um bloco e parar de indentar termina o bloco. Não se esqueça do dois-pontos (:) no final da linha do `if`, python precisa dele para saber que um novo bloco vai começar. O fato de que python se baseia em indentação para delimitar blocos é uma ótima propriedade para iniciantes: vai forçá-lo a aderir a padrões de apresentação de código estritos.[/!] É muito fácil se perder no seu próprio código se não for corretamente indentado, então precisa deixá-lo bem-arrumado para que trabalhar nele continue a ser agradável e produtivo.

Todas as indentações de um dado bloco devem ser consistentes e não é possível cortar um bloco. os dois códigos a seguir estão incorretos e devem resultar em erro.

    if condição:
        whatToDo()
         whatToDoNext() # um espaço a mais
    whatToDoAnyway()

    se condição:
        whatToDo()
    whatToDoAnyway()
        whatToDoNext() # este bloco não está condicionado a uma linha de condição

A condição deve ser uma expressão `[!c]int[/!][!java]boolean[/!][!scala|python]Boolean[/!]`. O bloco interno do código será executado se a expressão for calculada como `[!c]1[/!][!java|scala]true[/!][!python]True[/!]` e será ignorado se for `[!c]0[/!][!java|scala]false[/!][!python]False[/!]`. [!python|scala|java]`[!java|scala]true[/!][!python]True[/!]` e `[!java|scala]false[/!][!python]False[/!]` são valores constantes definidos por [!thelang] diretamente, assim como 0 ou 1 na matemática.[/!]

A condição pode ser uma variável `[!c]int[/!][!java]boolean[/!][!scala|python]Boolean[/!]` (vamos voltar a falar de variáveis num próximo exercício, não se preocupe) ou um teste aritmético, como `x == 5`, que verifica se o valor atual de `x` é 5, ou algo como != (a verificar inequação, ou seja, a retornar [!c]1[/!][!java|scala]true[/!][!python]True[/!] apenas se o lado esquerdo é diferente do lado direito), < (menor que), > (maior que), <= (menor ou igual a), >= (maior ou igual a).

Cuidado com um erro clássico, que é verificar a igualdade da variável a usar = no lugar de ==. Ainda bem que o [!java|scala|c]compilador[/!][!python]interpretador[/!] detecta este problema na maior parte das vezes, mas às vezes passa (como quando está a atribuir valor a uma variável [!c]int[/!][!java|python|scala]booleana[/!]). Então é bom ter cuidado...

A condição pode também ser uma chamada para alguns métodos particulares que retornam booleano. Por exemplo, o método `isFacingWall()` do buggle retorna [!c]1[/!][!java|python|scala]true[/!] se o buggle está a olhar para uma parede e false caso contrário.

Finalmente, uma condição pode ser composta de várias sub-condições conectadas por operadores booleanos:

- `cond1 [!java|scala|c]&&[/!][!python]and[/!] cond2` é true quando `cond1` e `cond2` são ambos trues (se `cond1` é false, `cond2` não é nem sequer calculado pois sabe-se previamente que a conjunção das duas proposições não pode ser verdadeira).
- `cond1 [!java|scala|c]||[/!][!python]or[/!] cond2` é true se `cond1` ou `cond2` é true (se `cond1` é true, `cond2` não é nem sequer calculada pois já se sabe que a disjunção de ambas as proposições não pode ser verdadeira).
- `[!java|scala|c]![/!][!python]not [/!]cond` é verdadeira se `cond` é falsa.
- Quando a expressão se torna complicada, é melhor adicionar parêntesis para forçar a ordem de cálculo. Não hesite em adicionar mais parêntesis para remover ambiguidades que apareçam na expressão.

Por fim, é possível especificar o que fazer quando a condição é falsa a usar a seguinte sintaxe. Neste caso, a instrução `oQueFazerSeForFalso` será executada apenas se a condição for falsa.

    [!java|scala|c]if (condição) {
        whatToDoIfTheConditionIsTrue();
    } else {
        whatToDoIfItsFalse();
    }[/!][!python]if (condição):
        whatToDoIfTheConditionIsTrue()
    else:
        whatToDoIfItsFalse()[/!]

Não se esqueça do dois-pontos (:) depois do else, indica que um novo bloco está a começar.

### Objetivo do exercício

Se o buggle está de cara para uma parede, deve mover um passo para trás. Se não, deve mover um passo para frente. Para detetar se está de cara para uma parede, simplesmente use a função pré-fabricada `isFacingWall()`, que todos os buggles entendem.

Este exercício é um pouco diferente: o seu código tem que funcionar para vários buggles, cada um a começar numa posição diferente. O mesmo código será executado para cada um deles.

Quando o seu programa funcionar, vá ao próximo exercício, que está escondido numa sub-árvore da janela de seleção.