/*
  Arduino | coding-help
  Code help
  paraquedista2_ — 10/31/24 at 1:48 PM
  this is my circuit (code modified for pin numbers)
*/

//Definir pinos para o botao e leds
const int buttonPin = 5;
const int ledPin7 = 6;
const int ledPin8 = 7;
const int ledPin9 = 8;
const int ledPin10 = 9;
const int ledPin11 = 10;
const int ledPin12 = 11;
const int ledPin13 = 12;

//Variaveis para controlar o tempo em que o botao é pressionado e o estado do botao
unsigned long tempopressionado;
bool botaocarregado = false;

//variaveis para o estado do jogo e leds
bool comecoujogo = false; //indica se o jogo começou
bool ledspiscando = false; //indica se os leds estao a piscar
unsigned long delayLED = 500; //Variavel para guardar o intervalo de tempo entre os leds acenderem e apagarem, meio segundo, 500ms

unsigned long tempoultimoledligado = 0; //guarda o ultimo tempo em que o led foi ligado
int ligarLed = -1; //armazena o numero do led que esta acesso (uso o -1 pois nao ha nenhum pino -1, logo o programa nao se confunde)
bool estadodoled = false; //indica se um led esta acesso
int piscadas = 0; //conta as vezes que os leds piscam

//variaveis para o debouncing
unsigned long debouncingdelay = 50; //tempo para evitar leituras inconsistentes do botao
unsigned long ultimotoquebotao = 0; //guarda o ultimo tempo que o botao foi pressionado


//Declarar as funçoes
void comecarjogo();
void reiniciarjogo();

void setup() {
  pinMode(ledPin7, OUTPUT);
  pinMode(ledPin8, OUTPUT);
  pinMode(ledPin9, OUTPUT);
  pinMode(ledPin10, OUTPUT);
  pinMode(ledPin11, OUTPUT);
  pinMode(ledPin12, OUTPUT);
  pinMode(ledPin13, OUTPUT);
  pinMode(buttonPin, INPUT_PULLUP);
}

void loop() {
  //Lê o estado do botao e inverte O HIGH para LOW e vice versa, pois está em pull up
  int buttonState = !digitalRead(buttonPin);
  //Se o botao esta pressionado e se a variavel botaocarregado é falsa
  if (buttonState == HIGH && !botaocarregado && (millis() - ultimotoquebotao > debouncingdelay)) {
    tempopressionado = millis(); //regista o momento em que o botao é pressionado
    botaocarregado = true; //o botao está pressionado
    ultimotoquebotao = millis();
  }
  //Se o botao está pressionado e se a variavel botaopressionado é verdadeira e se o tempo que o botao esta carregado é maior ou igual a 2 segundos
  if (buttonState == HIGH && botaocarregado && (millis() - tempopressionado >= 2000)) {
    //se o jogo ainda nao comecou
    if (!comecoujogo) {
      int piscadas = 0;
      while (piscadas < 3) { //piscar 3 vezes os leds
        //acende os leds
        digitalWrite(ledPin7, HIGH);
        digitalWrite(ledPin8, HIGH);
        digitalWrite(ledPin9, HIGH);
        digitalWrite(ledPin10, HIGH);
        digitalWrite(ledPin11, HIGH);
        digitalWrite(ledPin12, HIGH);
        digitalWrite(ledPin13, HIGH);
        delay(500);
        //apaga os leds
        digitalWrite(ledPin7, LOW);
        digitalWrite(ledPin8, LOW);
        digitalWrite(ledPin9, LOW);
        digitalWrite(ledPin10, LOW);
        digitalWrite(ledPin11, LOW);
        digitalWrite(ledPin12, LOW);
        digitalWrite(ledPin13, LOW);
        delay(500);
        piscadas = piscadas + 1;
      }
      comecarjogo(); //chama a funçao para começar o jogo
      comecoujogo = true; //marca que o jogo começou
    } else {
      reiniciarjogo();
    }
    botaocarregado = false; //reinicia o estado do botao
  }
  //Se o botao for solto, a variavel botaocarregado volta a ser falso
  if (buttonState = LOW) {
    botaocarregado = false;
    tempopressionado = 0;
  }
  // Se o jogo começou e os leds nao estao a piscar
  if (comecoujogo && !estadodoled) {
    ligarLed = random(6, 13); //escolhe um led aleatorio entre 7 e 13
    digitalWrite(ligarLed, HIGH); //acende o led escolhido
    tempoultimoledligado = millis(); //guarda o tempo que o led foi ligado
    estadodoled = true; //led esta acesso
  }
  //Se um led esta acesso e o tempo desde que foi ligado ultrapassou o intervalo definido
  if (estadodoled && (millis() - tempoultimoledligado >= delayLED)) {
    digitalWrite(ligarLed, LOW); //apaga o led
    estadodoled = false; //indica nao existe nenhum led acesso
  }

}

void comecarjogo() {
}

void reiniciarjogo() {
  int piscadas = 0;
  while (piscadas < 2) { // Piscar LEDs 2 vezes para reiniciar
    digitalWrite(ledPin7, HIGH);
    digitalWrite(ledPin8, HIGH);
    digitalWrite(ledPin9, HIGH);
    digitalWrite(ledPin10, HIGH);
    digitalWrite(ledPin11, HIGH);
    digitalWrite(ledPin12, HIGH);
    digitalWrite(ledPin13, HIGH);
    delay(500);
    digitalWrite(ledPin7, LOW);
    digitalWrite(ledPin8, LOW);
    digitalWrite(ledPin9, LOW);
    digitalWrite(ledPin10, LOW);
    digitalWrite(ledPin11, LOW);
    digitalWrite(ledPin12, LOW);
    digitalWrite(ledPin13, LOW);
    delay(500);
    piscadas = piscadas + 1;
  }
  comecoujogo = false;
}

$abcdeabcde151015202530fghijfghij