Skip to content

Instantly share code, notes, and snippets.

@guilhermesilveira
Forked from Gunisalvo/GeniusAlura.ino
Last active August 31, 2015 17:42
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save guilhermesilveira/503b27838ecce6a1fcb1 to your computer and use it in GitHub Desktop.
Save guilhermesilveira/503b27838ecce6a1fcb1 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
};
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);
}
}
#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