Desafio Genius

! Desafio

Os dois últimos projetos têm a intenção de colocar em prática tudo o que aprendemos até agora.

!Conheça o Genius

O Genius foi um jogo muito popular na década de 80 no Brasil, utilizando uma mecânica bastante simples. O objetivo no jogo é acompanhar e repetir sem errar a sequência de luzes e sons durante o tempo que puder...

Para simplificar o jogo, decidimos apenas usar os sons.

!Faça você mesmo!

Pesquise sobre o Genius e veja como ele funciona. Um bom ponto de partida é o link da Wikipedia.

Pense como você poderia fazer este projeto explorando os recursos do seu kit, e então elabore um programa para isso!

!Dicas para o projeto:

Para este projeto, você precisará:

  • Pensar em como conferir se o botão pressionado corresponde ao som correto
  • Indicar se o jogador acertou ou não precionado
  • Fazer uma sequência diferente cada vez que o jogo é iniciado
  • Fazer um botão de reset
  • Fazer com que a sequência, caso o jogador acerte, seja composta por todos os sons anteriores mais um novo som
  • Você precisará fazer um debounce para evitar múltiplos cliques ao apertar o botão

Abaixo é possível encontrar o nosso código para esse projeto, mas recomendamos que você faça você mesmo, pois assim você conseguirá aprender de verdade! Se tiver muita dificuldade, utilize o nosso código para tirar dúvidas ou descobrir como resolver problemas mais específicos.

Nosso código

#define MAX 75

// Pino ligado ao push-button
int buttonPin = A0;

// Pino ligado ao buzzer
int buzzer = 5;

// Variavel para fazer a checagem
int buttonState;

// Variavel para facilitar a identificação de qual botão foi apertado
int pressed_button;

// Definindo a saida do pino para maior clareza ( LED Amarelo)
int led1 = A1;

// Definindo a saida do pino para maior clareza ( LED Verde)
int led2 = A2;

int count = 0;
int compareSound = 0;
int playSound;
int wait = 1;
int timer = 0;
int result;
int variable;
int sequence[MAX];
int typed_sequence[MAX];

int readButton(int buttonState)
{
  int last, now;
  last = buttonState;
  now = analogRead(buttonPin);

  if (now != last) {
    delay(25);
    last = now;
  }
  if (now == last) {
    if (now < 69) {
      return 1;
    } else if (now >= 69 && now <= 230) {
      return 2;
    } else if (now >= 231 && now <= 407) {
      return 3;
    } else if (now >= 408 && now <= 630) {
      return 4;
    } else if (now >= 631 && now <= 896) {
      return 5;
    }
  }
}

void error_display()
{
  digitalWrite(led1, HIGH);
  //Se o botao está pressionado, aciona o Buzzer na frequencia relativa ao Erro
  buzzer_sound(95, 700, 1);
  digitalWrite(led1, LOW);
  delay(100);
}

void buzzer_sound(int frequency, int time_delay, int times)
{
  tone(buzzer, frequency);
  delay(time_delay);
  noTone(buzzer);
}

void blink_led(int exit, int time_delay, int times)
{
  for (int how_many = 0; how_many < times; how_many++) {
    digitalWrite(exit, HIGH);
    delay(time_delay);
    digitalWrite(exit, LOW);
    delay(time_delay);
  }
}

void alternace_blink_led(int time_delay, int times)
{
  for (int how_many_2 = 0; how_many_2 < times; how_many_2++) {
    digitalWrite(led1, HIGH);
    delay(time_delay);
    digitalWrite(led1, LOW);
    delay(time_delay);
    digitalWrite(led2, HIGH);
    delay(time_delay);
    digitalWrite(led2, LOW);
    delay(time_delay);
  }
}

void setup()
{
  // Define o pino do botao como entrada
  pinMode(buttonPin, INPUT);
  // Define o pino do Led Amarelo como Saida
  pinMode(led1, OUTPUT);
  // Define o pino do Led Verde como Saida
  pinMode(led2, OUTPUT);
  // Define o pino do Buzzer como Saida
  pinMode(buzzer, OUTPUT);
  randomSeed(analogRead(A7));
}

void loop()
{
  boolean finish = false;
  // Verifica se o estado do botao foi alterado
  int buttonState = analogRead(buttonPin);

  memset(typed_sequence, 0, MAX);
  variable = random(1, 5);
  sequence[count] = variable;
  compareSound = 0;

  for (int i = 0; i <= count; i++) {
    playSound = sequence[i];

    switch (playSound) {
      case 1 :
        buzzer_sound(261, 200, 1);
        break;

      case 2 :
        buzzer_sound(293, 200, 1);
        break;

      case 3 :
        buzzer_sound(329, 200, 1);
        break;

      case 4 :
        buzzer_sound(349, 200, 1);
        break;
    }
  }

  buttonState = 1023;

  while (buttonState >= 897) {
    buttonState = analogRead(buttonPin);
  }

  if (buttonState < 897) {
    while (compareSound <= count) {
      pressed_button = readButton(buttonState);

      if (pressed_button == 1) {
        buzzer_sound(261, 200, 1);
        typed_sequence[compareSound++] = 1;
      }

      if (pressed_button == 2) {
        buzzer_sound(293, 200, 1);
        typed_sequence[compareSound] = 2;
        compareSound++;
      }

      if (pressed_button == 3) {
        buzzer_sound(329, 200, 1);
        typed_sequence[compareSound] = 3;
        compareSound++;
      }

      if (pressed_button == 4) {
        buzzer_sound(349, 200, 1);
        typed_sequence[compareSound] = 4;
        compareSound++;
      }

      if (pressed_button == 5) {
        alternace_blink_led(100, 2);
        count = 0;
        compareSound++;
        finish = true;
      }
    }
  }

  boolean isCorrect = true;

  if (!finish) {
    for (int k = 0; k <= count; k++) {
      if (typed_sequence[k] != sequence[k]) {
        isCorrect = false;
        break;
      }
    }

    if (isCorrect) {
      blink_led(led2, 100, 2);
      count++;
    } else {
      error_display();
      count = 0;
    }
  }
  delay(100);
}