Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

PROBLEMA NO CÓDIGO - CURSO DE ARDUINO JOGO GENIUS

Estou com um problema neste código do jogo e não vejo onde está. Por já ter um pouco de familiaridade com linguagem C, tomei iniciativa de escrever o código do jogo segundo a minha própria lógica de acordo com a proposta do jogo Genius.

Este é o meu código:

#define LED_VERMELHO 2
#define LED_BRANCO 3
#define LED_AZUL 4
#define LED_AMARELO 5
#define BOTAO_VERMELHO 10
#define BOTAO_BRANCO 11
#define BOTAO_AZUL 12
#define BOTAO_AMARELO 13

int tempo=500;
int sequenciaLed[4];
int botoes[4];

void setup() {
Serial.begin(9600);

iniciaPortas();
iniciaJogo();

}

void iniciaJogo(){
  sequenciaLed[0] = LED_VERMELHO;
  sequenciaLed[1] = LED_BRANCO;
  sequenciaLed[2] = LED_AZUL;
  sequenciaLed[3] = LED_AMARELO;

  botoes[0] = BOTAO_VERMELHO;
  botoes[1] = BOTAO_BRANCO;
  botoes[2] = BOTAO_AZUL;
  botoes[3] = BOTAO_AMARELO;

  int leitura_aleatoria = analogRead(0);
  randomSeed(leitura_aleatoria);
}

int estado;
#define N 6
int sequencia[N+1];
int jogada=1;
int resposta;
int acertou = 1;

void loop() {

  if(jogada > 1) {
    for(int j=0; j<jogada-1; j++) {
      resposta = checaRespostaJogador();
      Serial.println(resposta);
      if(resposta == sequencia[j]){
      acertou++;
      Serial.println("acertou");
      }
      else {
        piscaLedDerrota();
        Serial.println("perdeu");
        }
    }
  }
    if(jogada < N+1 && acertou == jogada){
      Serial.println("entrou");
      int led_aleatorio = random(sequenciaLed[0], sequenciaLed[3]+1);
      for(int i=0; i<jogada; i++) {
        sequencia[jogada - 1] = led_aleatorio;
        piscaLed(sequencia[i], tempo);
      }
      jogada++;
      acertou=0;
     }

 }



int checaRespostaJogador(){
  for(int j=0; j<1; j=0) {
   for(int i=0; i<4; i++){
      estado = digitalRead(botoes[i]);
      if(estado == 0){
        return sequenciaLed[i];
    }
  }
 }
}

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

pinMode(BOTAO_VERMELHO, INPUT_PULLUP);
pinMode(BOTAO_BRANCO, INPUT_PULLUP);
pinMode(BOTAO_AZUL, INPUT_PULLUP);
pinMode(BOTAO_AMARELO, INPUT_PULLUP);
}


void piscaLed(int led, int tempo) {

digitalWrite(led, HIGH);
delay(tempo);
digitalWrite(led, LOW); 
}

void piscaLedDerrota() {
for(int i=0; i<10; i++) {
digitalWrite(sequenciaLed[0], HIGH);
digitalWrite(sequenciaLed[3], HIGH);
delay(300);
digitalWrite(sequenciaLed[0], LOW);
digitalWrite(sequenciaLed[3], LOW);
delay(500);
}
}

A ordem que eu dei no loop() foi para que o primeiro LED piscasse quando jogada = 1 e a seguir entrasse neste trecho aqui:

if(jogada > 1) {
    for(int j=0; j<jogada-1; j++) {
      resposta = checaRespostaJogador();
      Serial.println(resposta);
      if(resposta == sequencia[j]){
      acertou++;
      Serial.println("acertou");
      }
      else {
        piscaLedDerrota();
        Serial.println("perdeu");
        }
    }
  }

Ao conferir o primeiro botão com o primeiro LED que piscou, o código confere e exibe "acertou" na telinha do Serial, mas o problema é que o "acertou" é exibido duas vezes consecutivas e não estou enxergando o porquê.

Tem como dar uma conferida pra mim, por favor? Obrigado.

2 respostas

Olá Juan, tudo bom?

Primeiro deixa eu ver se entendi direito o que está acontecendo...

No início do primeiro loop temos:

jogada = 1
acertou = 1

Assim, o código pula o primeiro if e entra no segundo, onde ao seu final temos:

jogada = 2 (código: jogada++)
acertou = 0 (código: acertou = 0)

Assim, no segundo loop entramos no primeiro if, imprimimos "acertou" e no final do if temos:

jogada = 2
acertou = 1 (código: acertou++)

Como jogada!=acertou, não entramos no segundo if e terminamos o loop.

Por fim, entramos no terceiro loop e entramos no primeiro if, onde é impresso mais um "acertou" depois do checaRespostaJogador()

Isso acontece pois o digitalRead não "espera" pela entrada do usuário, ele apenas lê o valor atual daquele pino. Creio que na sua situação você precisa fazer um código que não faz nada enquanto o usuário não aperta algum botão específico.

Se não for esse o problema, coloca um Serial.println("entrou no for"); no início do for pra conseguir fazer um "debug" do código na hora da execução e me diz qual foi a saída...

solução!

Olá, Alessandro. Obrigado por me responder.

A saída que eu encontrei foi deletar todo esse loop() e recomeçar a lógica kkkk e no final deu certo. Outro problema que eu estava tendo que exibia duas vezes consecutivas o "acertou" no Serial justamente por causa do que você falou que o digitalRead não espera pela entrada, então eu coloquei um delay com intervalo suficiente pra dar tempo de pressionar o botão sem que seja lido duas vezes consecutivas.

No mais, consegui finalizar o projetinho como queria. Agradeço pela atenção mesmo assim.