Você acha que tem boa memória? Que tal testar suas habilidades e ainda aprender a montar um projeto usando Arduino? Se está disposto, você irá aprender aqui como montar o jogo “Genius” no Arduino!
Já conhecia esse jogo antes? Se não, aqui está uma explicação rápida. Basicamente, o jogo consiste em memorizar uma sequência de cores que irão piscar aleatoriamente. No início, apenas uma cor irá piscar, mas, a cada rodada, mais uma cor é adicionada a sequência, tornando cada vez mais difícil para o jogador guardar a ordem das cores.
Eu mesmo tentei conseguir a maior pontuação possível nesse jogo. Será que você consegue bater meu recorde? Leia o post até o final e confira!
Os materiais utilizados nesse projeto são os seguintes:
A montagem do projeto está representada a seguir:

O código utilizado nesse projeto foi o seguinte:
#include <LiquidCrystal.h>
// Definição de variáveis
#define buz 7
#define ledG 8
#define ledR 9
#define ledY 10
#define ledB 13
#define pushG A0
#define pushR A1
#define pushY A2
#define pushB A3
// Declaração das variáveis do Display LCD
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
void setup() {
// Declaração dos pinos usados
pinMode(pushG, INPUT);
pinMode(pushR, INPUT);
pinMode(pushY, INPUT);
pinMode(pushB, INPUT);
pinMode(ledG, OUTPUT);
pinMode(ledR, OUTPUT);
pinMode(ledY, OUTPUT);
pinMode(ledB, OUTPUT);
pinMode(buz, OUTPUT);
randomSeed(analogRead(0)); // Garante que os números serão aleatórios quando o jogo é reiniciado
}
void loop() {
lcd.begin(16, 2);
int inicio = 1; // Botão de iniciar
lcd.print("Vamos jogar?"); // Escreve no LCD
// Inicia o jogo quando o botão do led verde for pressionado
while(inicio!=1023){ // Como os botão estão ligados em portas analógicas, quando eles são pressionados, o valor de retorno é 1023
inicio = analogRead(pushG); // Lê o botão
digitalWrite(ledG, HIGH); // Liga leds
digitalWrite(ledR, HIGH);
digitalWrite(ledY, HIGH);
digitalWrite(ledB, HIGH);
}
lcd.clear(); // Apaga LCD
digitalWrite(ledG, LOW); // Apaga leds
digitalWrite(ledR, LOW);
digitalWrite(ledY, LOW);
digitalWrite(ledB, LOW);
delay(1000); // Pausa de 1 segundo
int acertou = 1; // Variável usada para determinar se o jogador acertou a sequência de cores ou não
int luzes[200]; // Variável para guardar a sequência de cores
int quant = 0; // Quantidade de cores na sequência
int pont = 0; // Pontuação do jogador
while(acertou == 1){ // Enquanto o jogador continuar acertando...
// Escreve no LCD a pontuação do jogador
lcd.print("Taca-lhe pau!!");
lcd.setCursor(0,1);
lcd.print("Pontuacao: ");
lcd.print(pont);
lcd.setCursor(0,0);
luzes[quant] = random(1, 5); // Escolhe aleatoriamente qual luz será a próxima a acender
quant = quant + 1; // Adiciona 1 a quantidade de cores na sequência
for(int i = 0; i < quant; i++){ // Loop para acender a sequência de luzes uma a uma
if(luzes[i] == 1){ // Verifica se é esta a luz que deve acender
digitalWrite(ledG, HIGH); // Se sim, liga o led correspondente
tone(buz, 262, 500); // Toca o buzzer na frequência pré-determinada para essa cor
delay(500);
digitalWrite(ledG, LOW); // Depois de um tempo, apaga a luz
delay(200);
} // A mesma lógica é implementada para as demais luzes
if(luzes[i] == 2){
digitalWrite(ledR, HIGH);
tone(buz, 294, 500);
delay(500);
digitalWrite(ledR, LOW);
delay(200);
}
if(luzes[i] == 3){
digitalWrite(ledY, HIGH);
tone(buz, 330, 500);
delay(500);
digitalWrite(ledY, LOW);
delay(200);
}
if(luzes[i] == 4){
digitalWrite(ledB, HIGH);
tone(buz, 349, 500);
delay(500);
digitalWrite(ledB, LOW);
delay(200);
}
}
int aux = 0; // Variável para apontar qual luz deve acender dentro do vetor
int terminou = 0; // Variável para verificar se o jogador já terminou a sequência de luzes
while(terminou == 0 && acertou == 1){ // Enquanto ainda faltarem luzes para serem pressionadas e o jogador ainda não tiver perdido...
int pg = analogRead(pushG); // Lê o botões de cada luz
int pr = analogRead(pushR);
int py = analogRead(pushY);
int pb = analogRead(pushB);
if(pg == 1023){ // Se o botão dessa luz for pressionado...
digitalWrite(ledG, HIGH); // O led acende
tone(buz, 262, 500); // O buzzer toca
if(luzes[aux] == 1){ // Verifica se o jogador acertou a luz correta
aux++; // Se sim, a próxima luz é apontada
}
else{
acertou = 0; // Se não, o jogador errou
}
while(pg == 1023){pg = analogRead(pushG);} // Enquanto o jogador estiver pressionando o botão da luz, o programa estaciona nesse ponto
delay(500);
digitalWrite(ledG, LOW); // A luz se apaga
delay(500);
} // A mesma lógica é implementada para todas as luzes
if(pr == 1023){
digitalWrite(ledR, HIGH);
tone(buz, 294, 500);
if(luzes[aux] == 2){
aux++;
}
else{
acertou = 0;
}
while(pr == 1023){pr = analogRead(pushR);}
delay(500);
digitalWrite(ledR, LOW);
delay(500);
}
if(py == 1023){
digitalWrite(ledY, HIGH);
tone(buz, 330, 500);
if(luzes[aux] == 3){
aux++;
}
else{
acertou = 0;
}
while(py == 1023){py = analogRead(pushY);}
delay(500);
digitalWrite(ledY, LOW);
delay(500);
}
if(pb == 1023){
digitalWrite(ledB, HIGH);
tone(buz, 349, 500);
if(luzes[aux] == 4){
aux++;
}
else{
acertou = 0;
}
while(pb == 1023){pb = analogRead(pushB);}
delay(500);
digitalWrite(ledB, LOW);
delay(500);
}
if(aux >= quant){ // Se o jogador já terminou a sequência...
terminou = 1;
pont++; // Sua pontuação sobe
}
}
}
// Se o jogador errou...
tone(buz, 415, 3000); // O buzzer toca numa frequência diferente das luzes
// Escreve-se no LCD que o jogador errou e sua pontuação final
lcd.clear();
lcd.print("ERROU!!!");
lcd.setCursor(0,1);
lcd.print("Resultado: ");
lcd.print(pont);
delay(3000);
}
O código em si é autoexplicativo, porém acho interessante dar uma contextualização geral ao leitor. Basicamente, o código seleciona aleatoriamente uma das quatro luzes para acender, em seguida o jogador deve pressionar o botão correspondente àquela luz. Caso o jogador acerte a luz piscada, uma nova luz escolhida aleatoriamente pisca em seguida da primeira, e o jogador deve acertar a sequência de luzes novamente. O jogo continua adicionando uma nova luz a sequência até que o jogador erre, e nesse momento, o jogo se encerra e a pontuação máxima do jogador é mostrada.
Tá na hora de colocar o projeto pra rodar. Vamos ver qual foi minha maior pontuação. Será que você consegue me superar?
Espero que tenha se divertido com esse game. Exercitar a memória é fundamental, assim como exercitar seus conhecimentos sobre o Arduino, que, além de ter várias funcionalidades importantes, também pode e deve ser utilizado em momentos de descontração.
Quer aprender a desenvolver mais jogos em Arduino? Confira nosso post relacionado e descubra mais!
Gostou do post? Avalie e deixe um comentário para sabermos o que achou.
Siga-nos também no Instagram e receba informações diárias sobre Arduino e eletrônica: @eletrogate.
Até a próxima!
|
A Eletrogate é uma loja virtual de componentes eletrônicos do Brasil e possui diversos produtos relacionados à Arduino, Automação, Robótica e Eletrônica em geral.
Tenha a Metodologia Eletrogate dentro da sua Escola! Conheça nosso Programa de Robótica nas Escolas!