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