Skip to content

Instantly share code, notes, and snippets.

@Gunisalvo
Last active August 31, 2015 16:27
Show Gist options
  • Save Gunisalvo/c6b177abbbe9e100d754 to your computer and use it in GitHub Desktop.
Save Gunisalvo/c6b177abbbe9e100d754 to your computer and use it in GitHub Desktop.
#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
};
enum estadosDoJogo {
JOGO_EM_ANDAMENTO,
JOGO_FINALIZANDO,
JOGO_COM_ERRO
};
int chave[TAMANHO_MAXIMO_DO_SEGREDO];
int rodada = 1;
void setup() {
//inicia monitor serial
Serial.begin(9600);
iniciaLeds();
iniciaBotoes();
iniciaJogo();
}
void iniciaLeds() {
pinMode(ledVerde, OUTPUT);
pinMode(ledAmarelo, OUTPUT);
pinMode(ledVermelho, OUTPUT);
pinMode(ledBranco, OUTPUT);
}
void iniciaBotoes() {
pinMode(botaoVerde, INPUT_PULLUP);
pinMode(botaoAmarelo, INPUT_PULLUP);
pinMode(botaoVermelho, INPUT_PULLUP);
pinMode(botaoBranco, INPUT_PULLUP);
}
void iniciaJogo(){
// 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);
}
void loop() {
int estado = estadoDoJogo();
if(estado == JOGO_EM_ANDAMENTO){
novaRodada();
}
if(estado == JOGO_FINALIZANDO){
finalizadoComSucesso();
}
}
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() {
picsaLedsDaRodada(chave, rodada);
if(responde(chave, rodada)){
rodada++;
} else {
finalizadoComFalha();
rodada = TAMANHO_MAXIMO_DO_SEGREDO + 2;
}
}
int geraCor() {
int cor = random(1, 5);
return cor;
}
void geraSequencia(int *chave){
Serial.println("Gerando Sequencia...");
for (int i = 0; i < TAMANHO_MAXIMO_DO_SEGREDO; i++) {
chave[i] = geraCor();
Serial.print("posicao [");
Serial.print(i);
Serial.print("]: ");
Serial.println(chave[i]);
}
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(){
picsaLed(ledVerde);
return VERDE;
}
int piscaAmarelo(){
picsaLed(ledAmarelo);
return AMARELO;
}
int piscaVermelho(){
picsaLed(ledVermelho);
return VERMELHO;
}
int piscaBranco(){
picsaLed(ledBranco);
return BRANCO;
}
void picsaLed(int porta){
digitalWrite(porta,HIGH);
delay(TEMPO_LUZ);
digitalWrite(porta,LOW);
delay(TEMPO_PAUSA);
}
/*
* OUTPUT DE LUZES
*/
void picsaLedsDaRodada(int *chave, int rodada){
Serial.print("Tocando leds para a rodada: ");
Serial.println(rodada);
for (int i = 0; i < rodada; i++) {
Serial.print(chave[i]);
if(chave[i] == VERDE){
picsaLed(ledVerde);
}
if(chave[i] == AMARELO){
picsaLed(ledAmarelo);
}
if(chave[i] == VERMELHO){
picsaLed(ledVermelho);
}
if(chave[i] == BRANCO){
picsaLed(ledBranco);
}
}
Serial.println();
Serial.println();
}
void finalizadoComSucesso(){
Serial.println("Jogo finalizado com sucesso.");
for(int i = 0; i < REPETICOES_ESTADO_FINAL; i++){
picsaLed(ledVerde);
picsaLed(ledAmarelo);
picsaLed(ledVermelho);
picsaLed(ledBranco);
}
}
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