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); }