Lição 2: Construir e Testar o Projeto
Continuação da Construção do Projeto
-
Agora, a condição da instrução if else necessita de ser definida. Para utilizar o Sensor de Distância para detetar castelos, pode ser utilizado o comando found_object . Adicione o comando found_object à condição. O seu projeto deve agora ter este aspeto:
def main(): # O sensor de distância detecta um castelo? if front_distance.found_object(): # Castelo de colisão detectado por um passe do sensor de distância else: # Vire para encontrar um castelo usando o passe do sensor de distância -
Se o Sensor de Distância encontrar um objeto, o Robô de RV deve avançar para derrubar o castelo. Adicione um comando drive na ramificação 'if' da instrução if else e defina o parâmetro para impulsionar o robô VR. (Este comando deve substituir o 'passe').
def main(): # O sensor de distância detecta um castelo? if front_distance.found_object(): # Castelo de colisão detectado por um sensor de distância drivetrain.drive(FORWARD) else: # Vire para encontrar um castelo usando o passe do sensor de distância -
Quando o comando found_object reportar False, o ramo 'else' será executado, pelo que o Robot VR precisará de se virar para encontrar um castelo no Playground. Adicione um comando turn dentro da ramificação 'else' e defina os parâmetros para virar o robô VR para a direita.
def main(): # O sensor de distância detecta um castelo? if front_distance.found_object(): # Castelo de colisão detectado por um sensor de distância drivetrain.drive (FORWARD) else: # Vire para encontrar um castelo usando o sensor de distância drivetrain.turn(RIGHT)
Para sua informação
O ramo 'else' da instrução if else funciona apenas num projeto como parte de uma instrução if else . Embora possa ter uma instrução if independente, não existe uma instrução 'else' no VEXcode VR Python. A ramificação 'else' é executada quando a condição da ramificação 'if' não é atendida. Sem uma condição definida (a ramificação 'if'), a ramificação 'else' nunca seria executada. 
Adicionar um Loop e Testar o Projeto
- Antes do projeto ser testado, mais um comando precisa ser adicionado. As instruções if else verificarão a condição apenas uma vez antes de passar para o próximo comando fora da instrução. Na Unidade 7, foi adicionado um loop infinito enquanto ao projeto para instruir o robô VR a verificar repetidamente a condição do sensor de olho para baixo. Para garantir que a condição do sensor de distância está a ser verificada repetidamente, arraste ou digite um ciclo infinito while e, em seguida, copie a instrução if else dentro do ciclo infinito enquanto. O seu projeto deve agora ter este aspeto:
-
Lembre-se de estar atento à indentação ao copiar e colar comandos em um loop, para que o projeto funcione como pretendido quando for executado.
def main(): while True: # O sensor de distância detecta um castelo? if front_distance.found_object(): # Castelo de colisão detectado por um sensor de distância drivetrain.drive (FORWARD) else: # Vire para encontrar um castelo usando o sensor de distância drivetrain.turn (RIGHT) wait(5, MSEC)
-
- Abra a janela do playground se ainda não estiver aberta. Certifique-se de que o Dynamic Castle Crasher Playground abre e execute o projeto.

- Depois que o Robô de RV derrubar pelo menos dois castelos, recarregue o Playground e execute o projeto em outro layout do Dynamic Castle Crasher Playground.

- Em cada execução do projeto, o Robô de RV girará até que um castelo seja detectado pelo Sensor de Distância e, em seguida, dirigirá em direção a esse edifício para derrubá-lo.

- Durante a execução do projeto, o Robô de RV pode empurrar uma peça do castelo até a borda e cair do Playground. Isto acontece porque o comando found_object ainda está a informar que existe um objeto à frente do robô VR. Quando este comando relata Verdadeiro, o Robô VR avança, levando o Robô VR a cair do Playground.
Fluxo do projeto com uma instrução If Else
A instrução if else é utilizada para que o robô VR possa tomar uma decisão. Se a condição booleana for True, os comandos dentro da ramificação 'if' serão executados. Se a condição booleana for False, os comandos dentro da ramificação 'else' serão executados.
Por exemplo, nesta iteração do Dynamic Castle Crasher Playground, quando o projeto é iniciado, o Sensor de Distância deteta objeto – a condição do comando found_object reporta True. Agora a branch 'if' do projeto será executada e o VR Robot avançará. O VR Robot irá saltar o ramo 'else' do projeto.
- Observe que os dados do sensor de distância também são relatados no painel. Quando um objeto é detectado, o valor da distância será exibido.
No entanto, nesta iteração do Dynamic Castle Crasher Playground, quando o projeto é iniciado, o Sensor de Distância NÃO deteta um objeto – a condição do comando found_object reporta False. Agora o Robô VR irá saltar a ramificação 'if' do projeto, e a ramificação 'else' do projeto será executada, pelo que o Robô VR irá virar à direita.
- Observe que o valor do Sensor de Distância no Painel é relatado como > 3000 mm. O Sensor de Distância pode detectar objetos dentro de uma faixa de 3000 milímetros (mm), portanto, quando um objeto não é detectado, o valor é relatado como maior que (>) 3000 mm.
Porque a instrução if else é dentro de um ciclo infinito while , o projeto regressa ao topo do infinito while ciclo para verificar a condição da instrução if else repetidamente. Este ciclo continuará para sempre, instruindo o robô VR para verificar continuamente a condição if else centenas de vezes por segundo.
- Note que os comandos drive e turn dentro de if else Statement são comandos sem espera. Os comandos sem espera não interrompem o fluxo de um projeto enquanto estão a ser executados. Um comportamento sem espera que é executado numa instrução if else (como 'avançar se o objeto for detetado') continuará enquanto a condição for verificada e só mudará quando a condição mudar.
Para sua informação
É utilizada uma instrução if else para garantir que apenas uma ramificação do projeto é executada quando a condição é verificada. Apenas uma instância ou condição pode ser verdadeira a qualquer momento. Isso torna o projeto mais eficiente.

Compare o projeto atual com o projeto criado na Unidade 7. O projeto da Unidade 7 utiliza quatro instruções if .

Quando se executa um projeto com várias instruções if , pode ser possível que várias condições reportem Verdadeiro (ou Falso) à medida que o projeto executa os comandos no infinito while voltas . Conflitos como este podem fazer com que o projeto deixe de funcionar ou fique mais lento.
Por outras palavras, múltiplas instruções if num projeto é como viajar por uma estrada com múltiplas rampas de saída. Dependendo de para onde está a tentar ir, virar-se-ia em lugares diferentes. Por exemplo, se fosse para a escola, virava à esquerda; se fosse para a loja, virava à direita. Mas e se você não fosse à escola ou à loja? Ambas as condições relatariam Falso, e você permaneceria no caminho reto. Ou se fosse à escola e à loja? Ambas as condições relatariam Verdadeiro, mas você não pode virar em dois locais ao mesmo tempo. 
Para continuar a analogia, uma afirmação if else é como viajar para uma bifurcação na estrada – obriga-o a tomar uma decisão. Se estiver indo para a escola, vire à esquerda; caso contrário, vire à direita. Não importa para onde vai, vira à esquerda ou à direita. Usar uma instrução if else evitaria bugs como os anteriores, porque o obrigaria a tomar uma decisão, porque apenas uma condição pode ser Verdadeira num determinado momento.
Perguntas
Selecione uma ligação abaixo para aceder ao questionário da aula.
Google Doc / .docx / .pdf