O Genius é um jogo de memória, também conhecido como Simon. Este post mostra um projeto deste jogo com Arduino.
Como funciona o Genius?
Para quem não sabe, é um jogo onde você tem que memorizar a sequência que as luzes são acesas e apertar botões para repetir esta sequência. Quanto mais você acerta, maior se torna a sequência de luzes para memorizar. Se errar a ordem da sequência, você perde.

Lista de materiais
- Arduino Mega 2560.

- Buzzer.
- 5 LEDs, cada um das seguintes cores: vermelho, amarelo, verde, azul e branco.
- Resistores: 5 de 10kΩ, 2 de 220Ω, 2 de 150Ω e 3 de 100Ω.
- 5 botões push button.

- Um display de 7 segmentos com dois dígitos. Por ser cátodo comum, os pinos 13 e 14 são ligados ao GND com dois resistores de 220Ω.

Montando o circuito
Nesta versão do Genius, há 5 botões para 5 cores. Quando acerta uma sequência, o display de dois dígitos acrescenta um ponto.

Os botões ficam em uma configuração pull-up com os resistores de 10kΩ. Esta configuração é necessária para evitar valores flutuantes (entre 5V e 0).

O código e o vídeo de demonstração
Este código usa bastante vetores ou arrays, cujos números representam os pinos digitais no Arduino.
int sequency[32] = {};//Vetor que indica a sequência de rodadas. 32 é o número //máximo.
int buttons[5] = { 53, 51, 49, 47, 45 };//Vetor dos botões.
int leds[5] = { 52, 50, 48, 46, 44 };//Vetor dos leds.
int tones[5] = { 262, 294, 330, 349, 395 };//Vetor dos tons sonoros.
int stage = 0;
int step = 0;
int pressed_button = 0;
bool game_over = false;
int buzzer = 42;
//Vetores do display de 2 dígitos, cada número está ligado ao segmento //a, b, c, d, e, f e g, respectivamente.
const int segmentPinsU[] = {28, 26, 27, 31, 33, 30, 29};
const int segmentPinsD[]={34, 32, 35, 37, 39, 38, 36};
//Matriz para mostrar os números no display.
const byte digitSegments[10][7] = {
{1, 1, 1, 1, 1, 1, 0}, // 0
{0, 1, 1, 0, 0, 0, 0}, // 1
{1, 1, 0, 1, 1, 0, 1}, // 2
{1, 1, 1, 1, 0, 0, 1}, // 3
{0, 1, 1, 0, 0, 1, 1}, // 4
{1, 0, 1, 1, 0, 1, 1}, // 5
{1, 0, 1, 1, 1, 1, 1}, // 6
{1, 1, 1, 0, 0, 0, 0}, // 7
{1, 1, 1, 1, 1, 1, 1}, // 8
{1, 1, 1, 1, 0, 1, 1} // 9
};
//Variáveis globais para contar os pontos no display.
int count = 0;
int count2=0;
void setup() {
pinMode(52, OUTPUT); //Led vermelho.
pinMode(53, INPUT); //Botão vermelho.
pinMode(50, OUTPUT); //Led amarelo.
pinMode(51, INPUT); //Botão amarelo.
pinMode(48, OUTPUT); //Led verde.
pinMode(49, INPUT); //Botão verde.
pinMode(46, OUTPUT); //Led azul.
pinMode(47, INPUT); //Botão azul.
pinMode(44, OUTPUT); //Led branco.
pinMode(45, INPUT); //Botão branco.
pinMode(buzzer, OUTPUT);
// Inicia com todos os segmentos do display desligados.
for (int i = 0; i < 7; i++) {
pinMode(segmentPinsU[i], OUTPUT);
digitalWrite(segmentPinsU[i], LOW);
pinMode(segmentPinsD[i], OUTPUT);
digitalWrite(segmentPinsD[i], LOW);
}
}
void loop() {
for (int i = 0; i < 7; i++) {//Começa a contar os pontos.
digitalWrite(segmentPinsU[i], digitSegments[count][i]);
digitalWrite(segmentPinsD[i], digitSegments[count2][i]);
}
nextStage();
reproducesequency();
waitplayer();
//Se acabar o jogo, zera as variáveis.
if (game_over == true) {
sequency[32] = {};
stage = 0;
step = 0;
game_over = false;
}
delay(1000);
}
void nextStage() {
int choose = random(5);//Escolhe aleatoriamente um dos cinco leds.
sequency[stage] = choose;
stage++;
count++;
if(count==10){
count=0;
count2++;
}
if(count2==10){
count2=0;
}
}
void reproducesequency() {
for (int i = 0; i < stage; i++) {//Um tom para cada led.
tone(buzzer, tones[sequency[i]]);
digitalWrite(leds[sequency[i]], HIGH);
delay(500);
noTone(buzzer);
digitalWrite(leds[sequency[i]], LOW);
delay(100);
}
}
void waitplayer() {//Espera o jogador.
for (int i = 0; i < stage; i++) {
bool played = false;
while (!played) { //loop infinito.
for (int i = 0; i <= 4; i++) {
if(digitalRead(buttons[i])==LOW){
pressed_button=i;
tone(buzzer,tones[i]);
digitalWrite(leds[i],HIGH);
delay(300);
digitalWrite(leds[i],LOW);
noTone(buzzer);
played=true;
}
}
}
//Verifica se acertou a sequência.
if(sequency[step] != pressed_button){
for(int i=0;i<=4;i++){
digitalWrite(buzzer,HIGH);
digitalWrite(leds[i],HIGH);
delay(1000);
digitalWrite(leds[i],LOW);
digitalWrite(buzzer,LOW);
}
game_over=true;
count=0;
count2=0;
break;
}
step++;
}
step = 0;
}

