//Criação de Aline Carmona Doria para 2a1
#define do3 130
#define dox3 138
#define re3 146
#define rex3 155
#define mi3 164
#define fa3 174
#define fax3 185
#define sol3 196
#define solx3 207
#define la3 220
#define lax3 233
#define si3 242
int tons[12] = {do3, re3, mi3, fa3};
int sequencia[100] = {};
int rodada_atual = 0;
int passo_atual_na_sequencia = 0;
int pinoAudio = 4;
int pinoLed[4] = {13, 12, 11, 10};
int pinoBotao[4] = {8, 7, 6, 5};
int botao_pressionado = 0;
int perdeu_o_jogo = false;
int fim_de_jogo = false;
int level[5] = {3, 4, 2, 3, 1};
int level_atual = 0;
int i = 0;
void setup(){
for (int i = 0; i<= 3; i++){
pinMode(pinoLed[i], OUTPUT);
}
for (int i = 0; i<= 3; i++){
pinMode(pinoBotao[i], INPUT);
}
pinMode(pinoAudio, OUTPUT);
int i;
}
void loop() {
if (perdeu_o_jogo) {
int sequencia[100] = {};
rodada_atual = 0;
passo_atual_na_sequencia = 0;
perdeu_o_jogo = false;
}
if (rodada_atual == 0) {
tocarSomDeInicio();
delay(500);
}
if (rodada_atual == 3){
completo();
delay(1000);
}
if (fim_de_jogo) {
int sequencia[100] = {};
rodada_atual = 0;
passo_atual_na_sequencia = 0;
fim_de_jogo = false;
}
proximaRodada();
reproduzirSequencia();
aguardarJogador();
delay(500);
}
void proximaRodada() {
int proximo_level = level[i++];
sequencia[rodada_atual++] = proximo_level;
for (i = 0; i <= level_atual; i++) {
level[i++];
}
}
void reproduzirSequencia() {
for (int i = 0; i < rodada_atual; i++) {
tone(pinoAudio, tons[sequencia[i]]);
digitalWrite(pinoLed[sequencia[i]], HIGH);
delay(500);
noTone(pinoAudio);
delay(100);
}
noTone(pinoAudio);
}
void aguardarJogador() {
for (int i = 0; i < rodada_atual; i++) {
aguardarJogada();
verificarJogada();
if (perdeu_o_jogo) {
break;
}
passo_atual_na_sequencia++;
}
passo_atual_na_sequencia = 0;
}
void aguardarJogada() {
boolean jogada_efetuada = false;
while (!jogada_efetuada) {
for (int i = 0; i <= 3; i++) {
if (digitalRead(pinoBotao[i]) == HIGH) {
botao_pressionado = i;
tone(pinoAudio, tons[i]);
digitalWrite(pinoLed[i], HIGH);
delay(300);
digitalWrite(pinoLed[i], LOW);
noTone(pinoAudio);
jogada_efetuada = true;
}
}
delay(10);
}
}
void verificarJogada() {
if (sequencia[passo_atual_na_sequencia] != botao_pressionado) {
// GAME OVER.
for (int i = 0; i <= 3; i++) {
tone(pinoAudio, tons[i]);
digitalWrite(pinoLed[i], HIGH);
delay(200);
digitalWrite(pinoLed[i], LOW);
noTone(pinoAudio);
}
tone(pinoAudio, tons[3]);
for (int i = 0; i <= 3; i++) {
digitalWrite(pinoLed[0], HIGH);
digitalWrite(pinoLed[1], HIGH);
digitalWrite(pinoLed[2], HIGH);
digitalWrite(pinoLed[3], HIGH);
delay(100);
digitalWrite(pinoLed[0], LOW);
digitalWrite(pinoLed[1], LOW);
digitalWrite(pinoLed[2], LOW);
digitalWrite(pinoLed[3], LOW);
delay(100);
}
noTone(pinoAudio);
perdeu_o_jogo = true;
}
}
void tocarSomDeInicio() {
tone(pinoAudio, tons[0]);
digitalWrite(pinoLed[0], HIGH);
digitalWrite(pinoLed[1], HIGH);
digitalWrite(pinoLed[2], HIGH);
digitalWrite(pinoLed[3], HIGH);
delay(500);
digitalWrite(pinoLed[0], LOW);
digitalWrite(pinoLed[1], LOW);
digitalWrite(pinoLed[2], LOW);
digitalWrite(pinoLed[3], LOW);
delay(500);
noTone(pinoAudio);
}
void completo(){
tone(pinoAudio, tons[0]);
digitalWrite(pinoLed[0], HIGH);
digitalWrite(pinoLed[1], HIGH);
digitalWrite(pinoLed[2], HIGH);
digitalWrite(pinoLed[3], HIGH);
delay(500);
digitalWrite(pinoLed[0], LOW);
digitalWrite(pinoLed[1], LOW);
digitalWrite(pinoLed[2], LOW);
digitalWrite(pinoLed[3], LOW);
delay(500);
noTone(pinoAudio);
delay(1000);
fim_de_jogo = true;
}