1. Definições de Hardware
As definições abaixo mapeiam os pinos do Arduino para os LEDs, botões e buzzers usados no jogo Genius:
#define LED_RED 10
#define LED_GREEN 5
#define LED_BLUE 3
#define LED_YELLOW 13
#define BUTTON_RED 9
#define BUTTON_GREEN 11
#define BUTTON_BLUE 2
#define BUTTON_YELLOW 12
#define BUZZER1 4
#define BUZZER2 7
Essas configurações garantem que cada componente físico esteja corretamente conectado ao
microcontrolador.
2. Variáveis Globais
Essas variáveis armazenam o estado atual do jogo e o progresso das rodadas:
byte gameBoard[32];
byte gameRound = 0;
unsigned long lastActionTime = 0;
boolean gameActive = false;
Elas controlam se o jogo está ativo, qual rodada o jogador está e quais cores compõem a sequência atual.
3. Função de Inicialização (setup)
Responsável por configurar os pinos de entrada e saída e preparar o sistema para começar o jogo:
void setup() {
pinMode(BUTTON_RED, INPUT_PULLUP);
pinMode(BUTTON_GREEN, INPUT_PULLUP);
pinMode(BUTTON_BLUE, INPUT_PULLUP);
pinMode(BUTTON_YELLOW, INPUT_PULLUP);
pinMode(LED_RED, OUTPUT);
pinMode(LED_GREEN, OUTPUT);
pinMode(LED_BLUE, OUTPUT);
pinMode(LED_YELLOW, OUTPUT);
pinMode(BUZZER1, OUTPUT);
pinMode(BUZZER2, OUTPUT);
gameActive = false;
}
Esta etapa garante que todos os componentes estejam prontos antes do início do jogo.
4. Lógica Principal (loop)
O loop principal executa continuamente a lógica do jogo: inicia, toca a sequência e verifica acertos ou
erros.
void loop() {
if (!gameActive) {
attractMode(); // modo de espera
gameActive = true;
}
if (play_memory()) {
play_winner();
} else {
play_loser();
}
gameActive = false;
}
Essa estrutura é o coração do jogo, responsável por iniciar e reiniciar as partidas automaticamente.
5. Função play_memory()
A função central do jogo, responsável por gerar a sequência aleatória e verificar se o jogador acerta:
boolean play_memory(void) {
randomSeed(millis());
gameRound = 0;
while (gameRound < ROUNDS_TO_WIN) {
add_to_moves();
playMoves();
for (byte currentMove = 0; currentMove < gameRound; currentMove++) {
byte choice = wait_for_button();
if (choice != gameBoard[currentMove]) return false;
}
delay(1000);
}
return true;
}
Essa função define a mecânica do jogo Genius — o jogador deve repetir a sequência de luzes e sons
corretamente.
6. Controle de LEDs e Sons
As funções abaixo acendem os LEDs e produzem os sons correspondentes a cada cor pressionada:
void setLEDs(byte leds) {
digitalWrite(LED_RED, (leds & CHOICE_RED) != 0);
digitalWrite(LED_GREEN, (leds & CHOICE_GREEN) != 0);
digitalWrite(LED_BLUE, (leds & CHOICE_BLUE) != 0);
digitalWrite(LED_YELLOW, (leds & CHOICE_YELLOW) != 0);
}
void toner(byte which, int buzz_length_ms) {
setLEDs(which);
switch (which) {
case CHOICE_RED: buzz_sound(buzz_length_ms, 1136); break;
case CHOICE_GREEN: buzz_sound(buzz_length_ms, 568); break;
case CHOICE_BLUE: buzz_sound(buzz_length_ms, 851); break;
case CHOICE_YELLOW: buzz_sound(buzz_length_ms, 638); break;
}
setLEDs(CHOICE_OFF);
}
Essas funções coordenam o som e a luz para cada botão, criando o efeito visual e auditivo característico
do Genius.