// declara as variaveis dos leds e botoes
int button_green = 14;
int button_yellow = 12;
int button_red = 27;
int button_blue = 13;
int button_reset = 26;
int led_green = 22;
int led_yellow = 21;
int led_red = 23;
int led_blue = 19;
int sequence[4]; // cria um vetor para armazenar a sequencia aleatoria
int player_sequence[4]; // cria um vetor para armazenar a sequencia do jogador
int level = 0; // declara a varivel para controlar o nivel do jogador
void setup()
{
// define os LEDs como saídas
pinMode(led_green, OUTPUT);
pinMode(led_red, OUTPUT);
pinMode(led_yellow, OUTPUT);
pinMode(led_blue, OUTPUT);
// define os botões como entradas com resistores de pull-up internos ativados
pinMode(button_green, INPUT_PULLUP);
pinMode(button_red, INPUT_PULLUP);
pinMode(button_yellow, INPUT_PULLUP);
pinMode(button_blue, INPUT_PULLUP);
pinMode(button_reset, INPUT_PULLUP);
}
void loop()
{
// se o nível do jogador é 0, chama a função que cria uma sequencia nova
if(level == 0){
create_sequence();
}
// se o nível do jogador for 1 ou maior, chama as funções que mostram a sequencia e lê o input do jogador
if (level >= 1){
output_sequence();
read_player();
}
}
void create_sequence()
{
// define a o número aleatório para a função random()
randomSeed(millis());
// cria uma nova sequência de 4 números aleatórios de 1 a 4 para o vetor
for (int i = 0; i < 4; i++){
sequence[i] = random(1, 5);
// converte os números gerados para cada led específico
if(sequence[i] == 1){
sequence[i] = led_red;
}
if(sequence[i] == 2){
sequence[i] = led_green;
}
if(sequence[i] == 3){
sequence[i] = led_yellow;
}
if(sequence[i] == 4){
sequence[i] = led_blue;
}
level = 1; // define o nível do jogador com 1
}
}
void output_sequence()
{
// mostra a sequencia até o nível do jogador no momento
for(int i = 0; i < level; i++){
digitalWrite(sequence[i], HIGH);
delay(1000);
digitalWrite(sequence[i], LOW);
delay(400);
}
}
void define_player_sequence(int player_led, int i){
// executa o led que o jogador clicou
digitalWrite(player_led, HIGH);
delay(500);
digitalWrite(player_led, LOW);
// inclui na sequencia do jogador
player_sequence[i] = player_led;
}
void read_player()
{
int player_led;
int verify = 0;
// recebe os inputs do jogador até o nível que ele está
for(int i = 0; i < level; i++){
while(verify == 0){
// se o botão reset for clicado, volta para o início
if(digitalRead(button_reset) == LOW){
wrong(); // função que volta o jogo do início quando o jogador reseta ou erra a sequencia
return;
}
// verifica o led clicado e atribui para a sequencia do jogador
else if(digitalRead(button_red) == LOW){
player_led = led_red;
define_player_sequence(player_led, i);
// verifica se a sequencia do jogador é igual a sequencia correta
if(player_sequence[i] != sequence[i]){
wrong();
return;
}
break; // finaliza o loop para aguardar ó proximo input do jogador
}
else if(digitalRead(button_green) == LOW){
player_led = led_green;
define_player_sequence(player_led, i);
if(player_sequence[i] != sequence[i]){
wrong();
return;
}
break;
}
else if(digitalRead(button_yellow) == LOW){
player_led = led_yellow;
define_player_sequence(player_led, i);
if(player_sequence[i] != sequence[i]){
wrong();
return;
}
break;
}
else if(digitalRead(button_blue) == LOW){
player_led = led_blue;
define_player_sequence(player_led, i);
if(player_sequence[i] != sequence[i])
{
wrong();
return;
}
break;
}
}
}
right(); // função executada quando o jogador acerta a sequencia
}
void right()
{
int count = 1;
// se o nível do jogador é menor que 5, aumenta o nível
if(level < 5){
level++;
}
// se o nível do jogador é igual a 5, mostra que ele venceu o jogo
if(level == 5){
// executa os leds piscando 2 vezes
while(count <= 3){
digitalWrite(led_red, HIGH);
digitalWrite(led_green, LOW);
digitalWrite(led_yellow, LOW);
digitalWrite(led_blue, LOW);
delay(120);
digitalWrite(led_red, LOW);
digitalWrite(led_green, HIGH);
digitalWrite(led_yellow, LOW);
digitalWrite(led_blue, LOW);
delay(120);
digitalWrite(led_red, LOW);
digitalWrite(led_green, LOW);
digitalWrite(led_yellow, HIGH);
digitalWrite(led_blue, LOW);
delay(120);
digitalWrite(led_red, LOW);
digitalWrite(led_green, LOW);
digitalWrite(led_yellow, LOW);
digitalWrite(led_blue, HIGH);
count++;
}
level = 0; // volta o nível para 0 para iniciar um jogo novo
}
delay(120);
digitalWrite(led_red, LOW);
digitalWrite(led_green, LOW);
digitalWrite(led_yellow, LOW);
digitalWrite(led_blue, LOW);
delay(700);
}
void wrong(){
int error = 1; // variavel de controle
// executa os leds piscando 2 vezes
while(error <= 2){
digitalWrite(led_red, HIGH);
digitalWrite(led_green, HIGH);
digitalWrite(led_yellow, HIGH);
digitalWrite(led_blue, HIGH);
delay(350);
digitalWrite(led_red, LOW);
digitalWrite(led_green, LOW);
digitalWrite(led_yellow, LOW);
digitalWrite(led_blue, LOW);
delay(350);
error++;
}
level = 0; // define o nível do jogador para 0 para iniciar um novo jogo
// armazena um vetor vazio na sequencia do jogador
int zero[4];
for(int i = 0; i < 5; i++){
player_sequence[i] = zero[i];
}
}