1
resposta

Mensagem "Jogo Finalizado com sucesso".

Considerando que a didática do curso inteira não é muito boa, aqui segue minha dúvida. Meu código está retornando "Jogo Finalizado com Sucesso" mesmo sem incrementar a linha

void preparaNovaRodada(){
   rodada++;
   leds_respondidos = 0;
   if(rodada < TAMANHO_SEQUENCIA){
     tocaLedsRoadada();
   }
}

então gostaria de saber pq está retornando certo mesmo sem essa condição if. Segue meu código inteiro,

//int ledVerm = 2;
#define LED_VERDE 2
#define LED_AMARELO 3
#define LED_VERMELHO 4 
#define LED_AZUL 5
#define INDEFINIDO -1

#define BOTAO_VERDE 8
#define BOTAO_AMARELO 9
#define BOTAO_VERMELHO 10
#define BOTAO_AZUL 11

#define UM_SEGUNDO 1000
#define MEIO_SEGUNDO 500

#define TAMANHO_SEQUENCIA 4

enum Estados{
    PRONTO_PARA_PROX_RODADA,
    USUARIO_RESPONDENDO,
    JOGO_FINALIZADO_SUCESSO,
    JOGO_FINALIZADO_FALHA,
  };

int sequenciaLuzes [TAMANHO_SEQUENCIA];

int rodada = 0;

int leds_respondidos = 0;

void setup() {
  // put your setup code here, to run once:
  Serial.begin (9600);
  iniciaPortas ();
  iniciaJogo ();
}
void iniciaJogo (){
  int jogo = analogRead(0);
  randomSeed (jogo);
  for (int i = 0; i <TAMANHO_SEQUENCIA; i++){
     sequenciaLuzes [i] = sorteiaCor ();
    }
 }

int sorteiaCor (){
  return random (LED_VERDE, LED_AZUL +1);
  }

void iniciaPortas (){
  pinMode(LED_VERDE, OUTPUT);
  pinMode (LED_AMARELO, OUTPUT);
  pinMode (LED_VERMELHO, OUTPUT);
  pinMode (LED_AZUL, OUTPUT);

  pinMode(BOTAO_VERDE, INPUT_PULLUP);
  pinMode (BOTAO_AMARELO, INPUT_PULLUP);
  pinMode (BOTAO_VERMELHO, INPUT_PULLUP);
  pinMode (BOTAO_AZUL, INPUT_PULLUP);


}


void loop() {

    //Serial.println (checaRespostaJogador());
  switch(estadoAtual()) {
  case PRONTO_PARA_PROX_RODADA:
    Serial.println("pronto para próxima rodada");
    preparaNovaRodada();
    break;
  case USUARIO_RESPONDENDO:
    Serial.println("usuário respondendo");
    processaRespostaUsuario();
    break;
  case JOGO_FINALIZADO_SUCESSO:
    Serial.println("jogo finalizado sucesso");
    break;
  case JOGO_FINALIZADO_FALHA:
    Serial.println("jogo finalizado falha");
    break;
  }
  delay (UM_SEGUNDO);

}

int piscaLed (int portaLed){
    digitalWrite (portaLed, HIGH);
    delay (UM_SEGUNDO);
    digitalWrite (portaLed, LOW);
    delay (MEIO_SEGUNDO);
    return portaLed;
}
void tocaLedsRodada (){
    for  (int i = 0; i < rodada; i++) {
          piscaLed (sequenciaLuzes [i]);
      }
  }
void preparaNovaRodada (){
  rodada++;
  leds_respondidos = 0;
  tocaLedsRodada();
  }

void processaRespostaUsuario(){
  leds_respondidos++;
}

int estadoAtual (){
  if (rodada <= TAMANHO_SEQUENCIA) {
    if (leds_respondidos == rodada) {
    return PRONTO_PARA_PROX_RODADA;
    } else {
       return USUARIO_RESPONDENDO;
      }
    } else {
      return JOGO_FINALIZADO_SUCESSO;
      }
    return JOGO_FINALIZADO_FALHA;
  }



int checaRespostaJogador (){
      if (digitalRead (BOTAO_VERDE)== LOW) {
        return piscaLed (LED_VERDE);
      }
      if (digitalRead (BOTAO_AMARELO)== LOW) {
        return LED_AMARELO;
      }
      if (digitalRead (BOTAO_VERMELHO)== LOW) {
        return LED_VERMELHO;
      }
      if (digitalRead (BOTAO_AZUL)== LOW) {
        return LED_AZUL;
      }
      return INDEFINIDO;
  }
void sequencia1 () {
    piscaLed (LED_VERDE);
    piscaLed (LED_AMARELO);
    piscaLed (LED_VERMELHO);
    piscaLed (LED_AZUL);
    delay (UM_SEGUNDO);
}

void acendeTodos () {
   digitalWrite (LED_VERDE, HIGH);
   digitalWrite (LED_AMARELO, HIGH);
   digitalWrite (LED_VERMELHO, HIGH);
   digitalWrite (LED_AZUL, HIGH);
   delay (UM_SEGUNDO);
   digitalWrite (LED_VERDE, LOW);
   digitalWrite (LED_AMARELO, LOW);
   digitalWrite (LED_VERMELHO, LOW);
   digitalWrite (LED_AZUL, LOW);
   delay (MEIO_SEGUNDO);

  }
1 resposta

Oi Thimóteo, como vai? Espero que esteja bem ^-^

Sinto muito pela demora em obter um retorno.

Isso ocorre porque na função estadoAtual possui um if que verifica uma condição similar a condição colocada na função preparaNovaRodada. Veja:

int estadoAtual (){
  if (rodada <= TAMANHO_SEQUENCIA) {
    if (leds_respondidos == rodada) {
    return PRONTO_PARA_PROX_RODADA;
    } else {
       return USUARIO_RESPONDENDO;
      }
    } else {
      return JOGO_FINALIZADO_SUCESSO;
      }
    return JOGO_FINALIZADO_FALHA;
  }

Com isso, caso a rodada não seja menor ou igual ao tamanho da sequência , será retornado a variável JOGO_FINALIZADO_SUCESSO, fazendo com que seja printado que o jogo foi finalizado com sucesso. Com isso, o if que existe em preparaNovaRodada chega a ser dispensável, mas se torna importante para leitura do código, onde saberemos que o led só será aceso quando a rodada atual for menor que o tamanho da sequência.

Qualquer dúvida estou por aqui, a gente vai conversando.

Abraços e bons estudos!