/*
JOGO DA MEMORIA - COM ARDUINO E SERIAL
Arnaldo Viana @2021
inspirado em: http://jeknowledge.github.io/academy-articles/jogo-da-memoria
*/
// Variáveis Globais
String recebido;
String sequenciaNumerica = "";
const int LED_PINS[] = {8, 9, 10}; // Array de LEDs
const long SERIAL_TIMEOUT = 10000; // Timeout de 10 segundos para leitura do Serial
const int NUM_LEDS = sizeof(LED_PINS) / sizeof(LED_PINS[0]);
long numeroGerado;
int sequencia;
// Definindo o enum para os estados do jogo
enum GameState {
START_GAME,
LEVEL_1,
LEVEL_2,
GAME_OVER,
PLAY_AGAIN
};
GameState stateGame = START_GAME;
void setup() {
// Iniciar comunicacao serial
Serial.begin(9600);
// Definir LEDs como OUTPUTs pinos 8,9 e 10
for(int i = 0; i < NUM_LEDS; i++){
pinMode(LED_PINS[i], OUTPUT);
}
// Definir a seed do gerador de números aleatórios
randomSeed(analogRead(0));
}
void loop() {
switch (stateGame) {
case START_GAME:
Serial.println("* INICIO *");
Serial.println("Comecar? (s/n)");
leserial();
if (recebido.equalsIgnoreCase("s")){
stateGame = LEVEL_1;
Serial.println("Jogo começando...");
piscaled(1000,3);
} else {
stateGame = GAME_OVER;
Serial.println("Jogo não iniciado");
piscaled(300,5);
}
break;
case LEVEL_1:
Serial.println("* Nivel 1 *");
geraSequencia(1000, 3);
leserial();
if (recebido.equals(sequenciaNumerica)){
stateGame = LEVEL_2;
Serial.println("Parabens! proximo nivel.");
piscaled(1000,3);
} else {
stateGame = GAME_OVER;
Serial.println("Errooooo!!!");
piscaled(300,5);
}
break;
case LEVEL_2:
Serial.println("* Nivel 2 *");
geraSequencia(1000, 5);
leserial();
if (recebido.equals(sequenciaNumerica)){
// Aqui, vamos terminar o jogo após o LEVEL_2. Você pode adicionar mais níveis se desejar.
stateGame = GAME_OVER;
Serial.println("Parabens! Você venceu!");
piscaled(1000,3);
} else {
stateGame = GAME_OVER;
Serial.println("Errooooo!!!");
piscaled(300,5);
}
break;
case GAME_OVER:
Serial.println("Game Over");
piscaled(100,5);
stateGame = PLAY_AGAIN;
break;
case PLAY_AGAIN:
Serial.println("jogar novamente? (s/n)");
leserial();
if (recebido.equalsIgnoreCase("s")){
stateGame = LEVEL_1;
Serial.println("Jogo comecando...");
piscaled(1000,3);
} else {
stateGame = GAME_OVER;
Serial.println("Jogo nao iniciado");
piscaled(300,5);
}
break;
}
}
void leserial(){
Serial.println("* Insera sua resposta *");
// Aguardar a resposta do usuario pelo tempo definido em SERIAL_TIMEOUT
long startTime = millis();
while (Serial.available() == 0 && millis() - startTime < SERIAL_TIMEOUT)
{}
// guarda o valor digitado pelo usuario em recebido
if (Serial.available()) {
recebido = Serial.readString();
recebido.trim();
Serial.println(recebido);
} else {
Serial.println("Timeout! Resposta não recebida.");
}
}
void piscaled(int tempo, int vezes){
for(int i = 0; i < vezes; i++){
for(int j = 0; j < NUM_LEDS; j++){
digitalWrite(LED_PINS[j], HIGH);
}
delay(tempo);
for(int j = 0; j < NUM_LEDS; j++){
digitalWrite(LED_PINS[j], LOW);
}
delay(tempo);
}
}
void geraSequencia (int tempo, int sequencia){
// Criar uma lista de inteiros com o tamanho que e passado como argumento
int ordemLeds[sequencia];
// Gerar sequencia aleatoria
for (int i = 0; i < sequencia; i++){
ordemLeds[i] = random(1, NUM_LEDS + 1);
}
// Inicialmente, a String sequenciaNumerica é uma String vazia
sequenciaNumerica = "";
// Pisca os LEDs na sequencia gerada
for (int j = 0; j < sequencia; j++){
int ledIndex = ordemLeds[j] - 1;
digitalWrite(LED_PINS[ledIndex], HIGH);
delay(tempo);
digitalWrite(LED_PINS[ledIndex], LOW);
delay(tempo);
// Converte a lista numa String
sequenciaNumerica += String(ordemLeds[j]);
}
}
uno:A5.2
uno:A4.2
uno:AREF
uno:GND.1
uno:13
uno:12
uno:11
uno:10
uno:9
uno:8
uno:7
uno:6
uno:5
uno:4
uno:3
uno:2
uno:1
uno:0
uno:IOREF
uno:RESET
uno:3.3V
uno:5V
uno:GND.2
uno:GND.3
uno:VIN
uno:A0
uno:A1
uno:A2
uno:A3
uno:A4
uno:A5
led1:A
led1:C
btn1:1.l
btn1:2.l
btn1:1.r
btn1:2.r
r1:1
r1:2
led2:A
led2:C
btn2:1.l
btn2:2.l
btn2:1.r
btn2:2.r
r2:1
r2:2
led3:A
led3:C
btn3:1.l
btn3:2.l
btn3:1.r
btn3:2.r
r3:1
r3:2
led4:A
led4:C
btn4:1.l
btn4:2.l
btn4:1.r
btn4:2.r
r4:1
r4:2