-
-
Save guilhermesilveira/503b27838ecce6a1fcb1 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#define TAMANHO_MAXIMO_DO_SEGREDO 4 | |
#define REPETICOES_ESTADO_FINAL 3 | |
#define TEMPO_LUZ 1000 | |
#define TEMPO_PAUSA 500 | |
#define ledVerde 2 | |
#define ledAmarelo 3 | |
#define ledVermelho 4 | |
#define ledBranco 5 | |
#define botaoVerde 8 | |
#define botaoAmarelo 9 | |
#define botaoVermelho 10 | |
#define botaoBranco 11 | |
enum cores { | |
VERDE = 1, | |
AMARELO = 2, | |
VERMELHO = 3, | |
BRANCO = 4 | |
}; | |
int chave[TAMANHO_MAXIMO_DO_SEGREDO]; | |
int rodada; | |
void setup() { | |
//inicia monitor serial | |
Serial.begin(9600); | |
iniciaPortas(); | |
iniciaJogo(); | |
} | |
void iniciaPortas(){ | |
pinMode(ledVerde, OUTPUT); | |
pinMode(ledAmarelo, OUTPUT); | |
pinMode(ledVermelho, OUTPUT); | |
pinMode(ledBranco, OUTPUT); | |
//inicia botoes | |
pinMode(botaoVerde, INPUT_PULLUP); | |
pinMode(botaoAmarelo, INPUT_PULLUP); | |
pinMode(botaoVermelho, INPUT_PULLUP); | |
pinMode(botaoBranco, INPUT_PULLUP); | |
} | |
void iniciaJogo(){ | |
rodada = 1; | |
// TODO nao precisa desse comentario no codigo pra valer certo? | |
//inicia gerador de numeros pseudo-aleatorios para que cada jogo seja diferente | |
//a porta analogica esta em estado indefinido ja que e um circuito aberto logo a voltagem do ambiente sera lida e convertida para um numero de 0 ate 1023 | |
randomSeed(analogRead(0)); | |
geraSequencia(chave); | |
} | |
enum estadosDoJogo { | |
JOGO_EM_ANDAMENTO, | |
JOGO_FINALIZANDO, | |
JOGO_COM_ERRO | |
}; | |
int estadoDoJogo() { | |
if(rodada <= TAMANHO_MAXIMO_DO_SEGREDO) { | |
return JOGO_EM_ANDAMENTO; | |
} | |
if(rodada == TAMANHO_MAXIMO_DO_SEGREDO + 1) { | |
return JOGO_FINALIZANDO; | |
} | |
return JOGO_COM_ERRO; | |
} | |
void novaRodada() { | |
tocaSequencia(chave, rodada); | |
if(responde(chave, rodada)){ | |
rodada++; | |
} else { | |
finalizadoComFalha(); | |
rodada = TAMANHO_MAXIMO_DO_SEGREDO + 2; | |
} | |
} | |
void loop() { | |
int estado = estadoDoJogo(); | |
if(estado == JOGO_EM_ANDAMENTO){ | |
novaRodada(); | |
} | |
if(estado == JOGO_FINALIZANDO){ | |
finalizadoComSucesso(); | |
} | |
} | |
/* | |
* GERACAO DE SEQUENCIA DE SEGREDO | |
*/ | |
int geraCor() { | |
int cor = random(1, 5); | |
Serial.print("posicao ["); | |
Serial.print(i); | |
Serial.print("]: "); | |
Serial.println(cor); | |
} | |
void geraSequencia(int *chave){ | |
Serial.println("Gerando Sequencia..."); | |
for (int i = 0; i < TAMANHO_MAXIMO_DO_SEGREDO; i++) { | |
chave[i] = geraCor(); | |
} | |
Serial.println(); | |
} | |
int responde(int *chave, int rodada){ | |
// retorno: | |
// 1 (TRUE) rodada respondida corretamente | |
// 0 (FALSE) rodada respondida incorretamente | |
int passoAtual = 0; | |
//para nao poluir o monitor serial | |
int esperaComunicada = 0; | |
while(passoAtual < rodada){ | |
if(esperaComunicada == 0){ | |
Serial.print("Esperando resposta posicao["); | |
Serial.print(passoAtual); | |
Serial.println("]"); | |
esperaComunicada = 1; | |
} | |
int resposta = checaBotaoPressionado(); | |
if(resposta != 0){ | |
if(chave[passoAtual]== resposta){ | |
Serial.println("Resposta Certa!"); | |
esperaComunicada = 0; | |
passoAtual ++; | |
}else{ | |
Serial.println("Resposta Errada!"); | |
return 0; | |
} | |
} | |
} | |
return 1; | |
} | |
int JOGADOR_NAO_RESPONDEU = 0; | |
// TODO ainda nao sou fa desse e dos outros codigos onde temos quatro ifs, mas atacamos ele depois dessa priemira batida | |
int checaBotaoPressionado(){ | |
// TODO se em arduino nao precisa declarar tudo antes, declarar cada uma dessas variaveis somente a medida do necessario. nao sei dizer isso pq em compilador C moderno nao precisa, isso? ansi precisa? nao sei dizer, so conferir. | |
int estadoVerde = digitalRead(botaoVerde); | |
int estadoAmarelo = digitalRead(botaoAmarelo); | |
int estadoVermelho = digitalRead(botaoVermelho); | |
int estadoBranco = digitalRead(botaoBranco); | |
if(estadoVerde == LOW){ | |
return piscaVerde(); | |
} | |
if(estadoAmarelo == LOW){ | |
return piscaAmarelo(); | |
} | |
if(estadoVermelho == LOW){ | |
return piscaVermelho(); | |
} | |
if(estadoBranco == LOW){ | |
return piscaBranco(); | |
} | |
return JOGADOR_NAO_RESPONDEU; | |
} | |
int piscaVerde(){ | |
piscaLED(ledVerde); | |
return VERDE; | |
} | |
int piscaAmarelo(){ | |
piscaLED(ledAmarelo); | |
return AMARELO; | |
} | |
int piscaVermelho(){ | |
piscaLED(ledVermelho); | |
return VERMELHO; | |
} | |
int piscaBranco(){ | |
piscaLED(ledBranco); | |
return BRANCO; | |
} | |
void piscaLED(int porta){ | |
digitalWrite(porta,HIGH); | |
delay(TEMPO_LUZ); | |
digitalWrite(porta,LOW); | |
delay(TEMPO_PAUSA); | |
} | |
/* | |
* OUTPUT DE LUZES | |
*/ | |
void tocaSequencia(int *chave, int rodada){ | |
Serial.print("Tocando sequência para a rodada: "); | |
Serial.println(rodada); | |
for (int i = 0; i < rodada; i++) { | |
Serial.print(chave[i]); | |
if(chave[i] == VERDE){ | |
ativaVerde(); | |
} | |
if(chave[i] == AMARELO){ | |
ativaAmarelo(); | |
} | |
if(chave[i] == VERMELHO){ | |
ativaVermelho(); | |
} | |
if(chave[i] == BRANCO){ | |
ativaBranco(); | |
} | |
} | |
Serial.println(); | |
Serial.println(); | |
} | |
void finalizadoComSucesso(){ | |
Serial.println("Jogo finalizado com sucesso."); | |
for(int i = 0; i < REPETICOES_ESTADO_FINAL; i++){ | |
digitalWrite(ledVerde,HIGH); | |
delay(TEMPO_PAUSA); | |
digitalWrite(ledVerde,LOW); | |
digitalWrite(ledAmarelo,HIGH); | |
delay(TEMPO_PAUSA); | |
digitalWrite(ledAmarelo,LOW); | |
digitalWrite(ledVermelho,HIGH); | |
delay(TEMPO_PAUSA); | |
digitalWrite(ledVermelho,LOW); | |
digitalWrite(ledBranco,HIGH); | |
delay(TEMPO_PAUSA); | |
digitalWrite(ledBranco,LOW); | |
} | |
} | |
void finalizadoComFalha(){ | |
Serial.println("Jogo finalizado com falha."); | |
for(int i = 0; i < REPETICOES_ESTADO_FINAL; i++){ | |
digitalWrite(ledVerde,HIGH); | |
digitalWrite(ledAmarelo,HIGH); | |
digitalWrite(ledVermelho,HIGH); | |
digitalWrite(ledBranco,HIGH); | |
delay(TEMPO_PAUSA); | |
digitalWrite(ledVerde,LOW); | |
digitalWrite(ledAmarelo,LOW); | |
digitalWrite(ledVermelho,LOW); | |
digitalWrite(ledBranco,LOW); | |
delay(TEMPO_PAUSA); | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#define TAMANHO_MAXIMO_DO_SEGREDO 4 | |
#define REPETICOES_ESTADO_FINAL 3 | |
#define TEMPO_LUZ 1000 | |
#define TEMPO_PAUSA 500 | |
#define ledVerde 2 | |
#define ledAmarelo 3 | |
#define ledVermelho 4 | |
#define ledBranco 5 | |
#define botaoVerde 8 | |
#define botaoAmarelo 9 | |
#define botaoVermelho 10 | |
#define botaoBranco 11 | |
enum cores { | |
VERDE = 1, | |
AMARELO = 2, | |
VERMELHO = 3, | |
BRANCO = 4 | |
}; | |
int chave[TAMANHO_MAXIMO_DO_SEGREDO]; | |
int rodada; | |
void setup() { | |
//inicia monitor serial | |
Serial.begin(9600); | |
iniciaPortas(); | |
iniciaJogo(); | |
} | |
void iniciaPortas(){ | |
pinMode(ledVerde, OUTPUT); | |
pinMode(ledAmarelo, OUTPUT); | |
pinMode(ledVermelho, OUTPUT); | |
pinMode(ledBranco, OUTPUT); | |
//inicia botoes | |
pinMode(botaoVerde, INPUT_PULLUP); | |
pinMode(botaoAmarelo, INPUT_PULLUP); | |
pinMode(botaoVermelho, INPUT_PULLUP); | |
pinMode(botaoBranco, INPUT_PULLUP); | |
} | |
void iniciaJogo(){ | |
rodada = 1; | |
// TODO nao precisa desse comentario no codigo pra valer certo? | |
//inicia gerador de numeros pseudo-aleatorios para que cada jogo seja diferente | |
//a porta analogica esta em estado indefinido ja que e um circuito aberto logo a voltagem do ambiente sera lida e convertida para um numero de 0 ate 1023 | |
randomSeed(analogRead(0)); | |
geraSequencia(); | |
} | |
enum estadosDoJogo { | |
JOGO_EM_ANDAMENTO, | |
JOGO_FINALIZANDO, | |
JOGO_COM_ERRO | |
}; | |
int estadoDoJogo() { | |
if(rodada <= TAMANHO_MAXIMO_DO_SEGREDO) { | |
return JOGO_EM_ANDAMENTO; | |
} | |
if(rodada == TAMANHO_MAXIMO_DO_SEGREDO + 1) { | |
return JOGO_FINALIZANDO; | |
} | |
return JOGO_COM_ERRO; | |
} | |
void novaRodada() { | |
if(responde()){ | |
rodada++; | |
if(estadoDoJogo() == JOGO_FINALIZANDO) { | |
finalizadoComSucesso(); | |
} else { | |
tocaSequencia(); | |
} | |
} | |
} | |
void loop() { | |
if(estadoDoJogo() == JOGO_EM_ANDAMENTO){ | |
novaRodada(); | |
} | |
} | |
/* | |
* GERACAO DE SEQUENCIA DE SEGREDO | |
*/ | |
int geraCor() { | |
int cor = random(1, 5); | |
Serial.print("posicao ["); | |
Serial.print(i); | |
Serial.print("]: "); | |
Serial.println(cor); | |
} | |
void geraSequencia(){ | |
Serial.println("Gerando Sequencia..."); | |
for (int i = 0; i < TAMANHO_MAXIMO_DO_SEGREDO; i++) { | |
chave[i] = geraCor(); | |
} | |
Serial.println(); | |
tocaSequencia(chave); | |
} | |
int responde(){ | |
int resposta = checaBotaoPressionado(); | |
if(resposta == 0) return 0; | |
if(chave[rodada]== resposta){ | |
Serial.println("Resposta Certa!"); | |
return 0; | |
}else{ | |
Serial.println("Resposta Errada!"); | |
return 0; | |
} | |
} | |
int JOGADOR_NAO_RESPONDEU = 0; | |
// TODO ainda nao sou fa desse e dos outros codigos onde temos quatro ifs, mas atacamos ele depois dessa priemira batida | |
int checaBotaoPressionado(){ | |
// TODO se em arduino nao precisa declarar tudo antes, declarar cada uma dessas variaveis somente a medida do necessario. nao sei dizer isso pq em compilador C moderno nao precisa, isso? ansi precisa? nao sei dizer, so conferir. | |
int estadoVerde = digitalRead(botaoVerde); | |
int estadoAmarelo = digitalRead(botaoAmarelo); | |
int estadoVermelho = digitalRead(botaoVermelho); | |
int estadoBranco = digitalRead(botaoBranco); | |
if(estadoVerde == LOW){ | |
return piscaVerde(); | |
} | |
if(estadoAmarelo == LOW){ | |
return piscaAmarelo(); | |
} | |
if(estadoVermelho == LOW){ | |
return piscaVermelho(); | |
} | |
if(estadoBranco == LOW){ | |
return piscaBranco(); | |
} | |
return JOGADOR_NAO_RESPONDEU; | |
} | |
int piscaVerde(){ | |
piscaLED(ledVerde); | |
return VERDE; | |
} | |
int piscaAmarelo(){ | |
piscaLED(ledAmarelo); | |
return AMARELO; | |
} | |
int piscaVermelho(){ | |
piscaLED(ledVermelho); | |
return VERMELHO; | |
} | |
int piscaBranco(){ | |
piscaLED(ledBranco); | |
return BRANCO; | |
} | |
void piscaLED(int porta){ | |
digitalWrite(porta,HIGH); | |
delay(TEMPO_LUZ); | |
digitalWrite(porta,LOW); | |
delay(TEMPO_PAUSA); | |
} | |
/* | |
* OUTPUT DE LUZES | |
*/ | |
void tocaSequencia(){ | |
Serial.print("Tocando sequência para a rodada: "); | |
Serial.println(rodada); | |
for (int i = 0; i < rodada; i++) { | |
Serial.print(chave[i]); | |
if(chave[i] == VERDE){ | |
ativaVerde(); | |
} | |
if(chave[i] == AMARELO){ | |
ativaAmarelo(); | |
} | |
if(chave[i] == VERMELHO){ | |
ativaVermelho(); | |
} | |
if(chave[i] == BRANCO){ | |
ativaBranco(); | |
} | |
} | |
Serial.println(); | |
Serial.println(); | |
} | |
void finalizadoComSucesso(){ | |
Serial.println("Jogo finalizado com sucesso."); | |
for(int i = 0; i < REPETICOES_ESTADO_FINAL; i++){ | |
digitalWrite(ledVerde,HIGH); | |
delay(TEMPO_PAUSA); | |
digitalWrite(ledVerde,LOW); | |
digitalWrite(ledAmarelo,HIGH); | |
delay(TEMPO_PAUSA); | |
digitalWrite(ledAmarelo,LOW); | |
digitalWrite(ledVermelho,HIGH); | |
delay(TEMPO_PAUSA); | |
digitalWrite(ledVermelho,LOW); | |
digitalWrite(ledBranco,HIGH); | |
delay(TEMPO_PAUSA); | |
digitalWrite(ledBranco,LOW); | |
} | |
} | |
void finalizadoComFalha(){ | |
Serial.println("Jogo finalizado com falha."); | |
for(int i = 0; i < REPETICOES_ESTADO_FINAL; i++){ | |
digitalWrite(ledVerde,HIGH); | |
digitalWrite(ledAmarelo,HIGH); | |
digitalWrite(ledVermelho,HIGH); | |
digitalWrite(ledBranco,HIGH); | |
delay(TEMPO_PAUSA); | |
digitalWrite(ledVerde,LOW); | |
digitalWrite(ledAmarelo,LOW); | |
digitalWrite(ledVermelho,LOW); | |
digitalWrite(ledBranco,LOW); | |
delay(TEMPO_PAUSA); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment