![](/media/cache/group/default_image.jpg.50x50_q85.jpg)
Simon
Dependencies: mbed
Diff: main.cpp
- Revision:
- 2:f45bd4655817
- Parent:
- 1:78297550b459
- Child:
- 3:1610e2f8803b
diff -r 78297550b459 -r f45bd4655817 main.cpp --- a/main.cpp Mon May 27 11:41:23 2019 +0000 +++ b/main.cpp Tue May 28 11:41:17 2019 +0000 @@ -35,22 +35,22 @@ DigitalOut Verde(LED2); DigitalOut Azul(LED3); -void invierte(); +void invierte(); void simon(); char Pulsador (); void leds(int num); // led(0b000) = apagados, led(0b100) = rojo, led(0b010) = Verde, led(0b001) = Azul, led(0b111) = Blanco, + char sec[50] = {0}; -char r = 1; -char t = 0; -char pos = 0; -int times = 0, espera = 0;; +char nivelSec = 1; +char posSec = 0; +char posJuego = 0; +int times = 0, espera = 0;; bool flagPulsador = 0; char pulsador = 0; char estado = ESTADO_COMENZAR; -bool timer1 = 0, timer2 = 0, timer3 = 0; bool pulsador1 = 1, pulsador2 = 1, pulsador3 = 1; -bool st1= 0, st2 = 0, st3 = 0, l = 1, apagado = 0; +bool st1= 0, st2 = 0, st3 = 0, loop = 1, apagado = 0; DebouncedIn PV(PTB1); @@ -73,11 +73,13 @@ //Prendemos los LEDS leds(0b111); printf("Toque cualquier pulsador para comenzar: \r\n"); -//Ejecutar onCharReceived por cada entrada por puerto while(true) { + //Cambio el estado de los pulsadores Pulsador(); + //Ejecuto la funcion principal simon(); + //Aseguro el reset de la habilitacion del pulsador flagPulsador = 0; } } @@ -86,6 +88,7 @@ static int i; switch(estado) { case ESTADO_COMENZAR: + //Espero que pulsen un pulsador para empezar times = 0; if(pulsador != 0 && flagPulsador == 1) { leds(0b000); @@ -96,60 +99,67 @@ break; case ESTADO_REINICIO: - //Reinicio la secuencia + //Seteo la semilla srand (semilla*4920*1912); + //Genero la secuencia for(i = 0; i <= NIVELES ; i ++) { sec[i] = rand() % 3 + 1; } - r = 1; - t = 0; - pos = 0; + nivelSec = 1; + posJuego = 0; + posJuego = 0; estado = ESTADO_MUESTREO; times = 0; - l = 0; + loop = 0; break; case ESTADO_MUESTREO: - //Muestro la secuencia - if(l) { + //Muestro la secuencia generada + if(loop) { + //Cada vez que termino de mostrar un LED if (apagado == 0) { - if(t >= r) { + //Evaluo si mostre la cantidad de LEDs segun el nivel + if(posSec >= nivelSec) { estado = ESTADO_JUEGO; printf("\nA jugar Bro :) \r"); printf("\r\n\n"); espera = 0; break; } - switch(sec[t]) { + switch(sec[posSec]) { case 1: + //Muestro LED rojo leds(0b100); if(times > 5) { times = 0; printf("ROJO\r\n"); apagado = 1; - t++; + posSec++; } break; case 2: + //Muestro LED verde leds(0b010); if(times > 5) { apagado = 1; times = 0; printf("VERDE\r\n"); - t++; + posSec++; } break; case 3: + //Muestro LED azul leds(0b001); if(times > 5) { apagado = 1; times = 0; printf("AZUL\r\n"); - t++; + posSec++; } break; } } else { + //Dejo un espacio apagado entre los colores de las secuencias leds(0b000); if (times > 5) { times = 0; @@ -157,24 +167,29 @@ } } } else { + //Espero 5 times el ultimo LED encendido y lo apago if (times > 5) leds(0b000); + //Espero 5 times mas para separar el final de muestreo con el inicio del Juego if (times > 10) { - l = 1; + loop = 1; times = 0; } } break; case ESTADO_JUEGO: + //Detecto si el jugador tarda mucho tiempo en apretar un boton if (espera > 50) { printf("Tardaste demaciado tiempo en elegir\r\n"); estado = ESTADO_PERDER; break; } + //Detecto un cambio en los pulsadores if(flagPulsador) { espera = 0; flagPulsador = 0; times = 0; + //Detecto que pulsador precionaron y enciendo el LED switch(pulsador) { case 1: printf("ROJO \r\n"); @@ -189,32 +204,39 @@ leds(0b001); break; } - if(pulsador == sec[pos]) { - pos++; - if(pos == r) { - r++; + //Comparo si el pulsador apretado es el correcto segun la secuencia + if(pulsador == sec[posJuego]) { + posJuego++; + //Si alcancé el nivel en el que estoy paso de nivel + if(posJuego == nivelSec) { + nivelSec++; printf("\n\t--------------------------------\r"); - if (r == NIVELES + 1) { + //Si alcancé el máximo nivel paso al estado GANAR + if (nivelSec == NIVELES + 1) { estado = ESTADO_GANAR; } else { + //Si no llegué al máximo nivel paso de nivel printf("\nPasaste al nivel %d!\r\n\n", r); - t = 0; - pos = 0; + posSec = 0; + posJuego = 0; estado = ESTADO_MUESTREO; - l = 0; + loop = 0; times = 0; } } } else { + //Si el pulsador no corresponde con la secuencia paso al estado PERDER estado = ESTADO_PERDER; } } + //Espero 5 times el LED encendido if (times > 5) { leds(0b000); } break; case ESTADO_PERDER: + //Prendo el LED blanco para mostrar que termino el juego y vuelvo al estado COMENZAR printf("\nPerdiste Bro :(\r\n"); printf("Apreta cualquier boton para reiniciar!\r\n\n"); leds(0b111); @@ -222,6 +244,7 @@ break; case ESTADO_GANAR: + //Mustro el LED blanco para mostrar que termino el juego y aviso que completo la secuencia printf("\nGANASTE!!! :)\r\n\n"); printf("Apreta cualquier boton para reiniciar!\r\n\n"); leds(0b111); @@ -231,6 +254,7 @@ } void leds(int num) { + //Funcion que codifica el encendido y apagado de los LEDs switch(num) { case 0: Rojo = 1; @@ -262,6 +286,7 @@ char Pulsador() { + //Funcion que aciva un flag con el cambio del pulsador y guarda el pulsado en una variable pulsador = 0; if (PV.rising()) { @@ -287,6 +312,7 @@ void invierte() { + //Funcion que detecta las interrupciones del timer times++; semilla ++; espera++;