Federico D'Andrea
/
TP-Simon
EJERCICIO 2 -TERMINADO - SOTELO - D´ANDREA
main.cpp
- Committer:
- feede_dandrea
- Date:
- 2019-06-18
- Revision:
- 0:852f9baab783
File content as of revision 0:852f9baab783:
//TRABAJO PRACTICO 1 - SIMON #include "mbed.h" #include <stdlib.h> /* srand, rand */ #include <time.h> /* time */ #include "tsi_sensor.h" /* This defines will be replaced by PinNames soon */ #if defined (TARGET_KL25Z) || defined (TARGET_KL46Z) #define ELEC0 9 #define ELEC1 10 #elif defined (TARGET_KL05Z) #define ELEC0 9 #define ELEC1 8 #else #error TARGET NOT DEFINED #endif TSIAnalogSlider tsi(ELEC0, ELEC1, 40); AnalogIn aleatorio(PTB0); DigitalOut rojo(LED_RED); //Definimos como salidas los leds DigitalOut azul(LED_BLUE); DigitalOut verde(LED_GREEN); Ticker resultado; Ticker gameplay; Ticker sensor; void juego(); //Esta funcion va a manejar el juego void indicador_fin_funcion(); //Esta funcion es para el control de leds void llenado_vector(); //Esta funcion va a guardar los diferentes colores para el juego int llenado_vector_estado=0,indicador_fin_estado=0,game_over=0,juego_estado,luces_color=0,tiempo_On=0,incremento=0,nivel_max=24,espera=0; char luces[23]; //Vector donde se guardan todos los colores del juego enum {INICIO,ALEATORIO,LLENADO}; enum {R,G,B}; enum {NO_PIERDO, PERDISTE,SIGUIENTE_NIVEL, GANASTE}; enum {APAGADO,ENCENDIDO}; char indicador_fin; enum {DEFAULT, ACTUAL, RESPUESTA}; enum {COMIENZO,GANADOR,PERDEDOR}; enum {NO_TOCO,TOCO}; int titileo=0,tocaste_tsi=0; int nivel; volatile int u=0; int n=0,c=0, k=0, j=0,lose=0,comienzo_slider=0; int main() { rojo=1; azul=1; verde=1; juego_estado = DEFAULT; //Seteamos en el estado de Default ya que es el reset del juego while(1) { float d = tsi.readPercentage(); //Lee el tsi para iniciar el juego if(comienzo_slider<3){ //Para comenzar el juego se desliza el dedo sobre el tsi,entonces va detectando de a rangos if((d>(float)0.1)&&(d<(float)0.3)){ //Mientras se desliza el dedo hay un juego e luces con los colores del led rojo=0; verde=1; azul=1; } else if((d>(float)0.3)&&(d<(float)0.6)){ rojo=1; verde=0; azul=1; } else if((d>(float)0.6)&&(d<(float)0.9)){ rojo=1; verde=1; azul=0; } else if((d>=(float)0.9)){ rojo=1; verde=1; azul=1; } } if(d==(float)0 && (comienzo_slider==0)){ comienzo_slider=1; } if((d>(float)0.3) && (d<(float)0.7) && (comienzo_slider==1)){ comienzo_slider=2; } if((d>(float)0.9) && (d<(float)0.99) && (comienzo_slider==2)){ rojo=1; verde=1; azul=1; printf("QUE COMIENCE EL JUEGO!\r\n\n"); d=0; comienzo_slider=3; } if(comienzo_slider==3){ juego(); } if(titileo==4) { resultado.detach(); comienzo_slider=0; titileo=0; game_over=COMIENZO; nivel=0; } } } void llenado_vector() //elije un numero aleatorio del 0 al 2 y crea un vector con una secuencia de colores { switch(llenado_vector_estado) { case INICIO: srand(int(aleatorio * 1000)); if(n<nivel_max) { llenado_vector_estado = ALEATORIO; //se van creando numeros aleatorios hasta que el vector se llene } break; case ALEATORIO: c=rand()%3; llenado_vector_estado = LLENADO; break; case LLENADO: luces_color=c; if(n<nivel_max) {//se lo diferencia entre los 3 colores y se lo asigna al vector if(luces_color==R) { luces[n]='R'; } if(luces_color==G) { luces[n]='G'; } if(luces_color==B) { luces[n]='B'; } n++;//lleva la cuenta de la posicion del vector llenado_vector_estado = ALEATORIO; } else { llenado_vector_estado = INICIO; } break; } } void indicador_fin_funcion() { switch(indicador_fin_estado) { case APAGADO: if(indicador_fin=='R') { rojo=1; } if(indicador_fin=='G') { verde=1; } indicador_fin_estado=ENCENDIDO; titileo++; break; case ENCENDIDO: if(indicador_fin=='R') { rojo=0; } if(indicador_fin=='G') { verde=0; } indicador_fin_estado=APAGADO; break; } } void muestra()//lee el vector hasta el nivel asignado { tiempo_On++;//se utiliza para contabilizar el tiempo y poder apagar los leds al finalizar if(tiempo_On==2) { rojo=1; verde=1; azul=1; tiempo_On=0; } if((u<(nivel+2))&&(tiempo_On==1)) { if(luces[u]=='R') { rojo=0; verde=1; azul=1; } if(luces[u]=='G') { rojo=1; verde=0; azul=1; } if(luces[u]=='B') { rojo=1; verde=1; azul=0; } u++; } if(u==(nivel+1)) { rojo=1; verde=1; azul=1; } } void leer_tsi() { float v = tsi.readPercentage(); if(j==nivel) { if(nivel==nivel_max) { lose=GANASTE;//si el nivel es maximo se gana } else { lose=SIGUIENTE_NIVEL;//j que es quien detecta color por color detecta que llego al nivel actual, envia al siguiente nivel incremento=1; } } if((v>=(float)0.05 )&& (v<=(float)0.33) && (tocaste_tsi==NO_TOCO)) { //Rojo, si el color que se toca es rojo y no coincide con el vector significa que esta mal y perdio, de lo contrario es correcto y sigue con el juego if(luces[j]=='R') { j++; printf("COLOR SELECCIONADO ROJO \r\n\n"); v=0; azul=1; rojo=0; verde=1; espera=0; tocaste_tsi=TOCO; } else { azul=1; rojo=0; verde=1; lose=PERDISTE; printf("HAZ PERDIDO. EL ROJO NO ERA, LO 100TO\n\r"); } } else if((v>=(float)0.40 )&& (v<=(float)0.60) && (tocaste_tsi==NO_TOCO)) { //Verde, si el color que se toca es verde y no coincide con el vector significa que esta mal y perdio, de lo contrario es correcto y sigue con el juego if(luces[j]=='G') { j++; printf("COLOR SELECCIONADO VERDE \r\n\n"); v=0; azul=1; rojo=1; verde=0; espera=0; tocaste_tsi=TOCO; } else { azul=1; rojo=1; verde=0; printf("HAZ PERDIDO. EL VERDE NO ERA, LO 100TO\n\r"); lose=PERDISTE; } } else if((v>=(float)0.70 )&& (v<=(float)0.98) && (tocaste_tsi==NO_TOCO)) { //Azul, si el color que se toca es azul y no coincide con el vector significa que esta mal y perdio, de lo contrario es correcto y sigue con el juego if(luces[j]=='B') { j++; printf("COLOR SELECCIONADO AZUL \r\n\n"); v=0; azul=0; rojo=1; verde=1; espera=0; tocaste_tsi=TOCO; } else { azul=0; rojo=1; verde=1; printf("HAZ PERDIDO. EL AZUL NO ERA, LO 100TO\n\r"); lose=PERDISTE; } } else if(v==(float)0){ tocaste_tsi=NO_TOCO; } if(lose==NO_PIERDO){ if(espera==1){ azul=1; rojo=1; verde=1; espera=0; } else{ espera++; } } else if(lose==PERDISTE) { azul=1; rojo=1; verde=1; j=0; sensor.detach();//deja de leer el tsi game_over=PERDEDOR; juego_estado=DEFAULT;//vuelve al inicio lose=NO_PIERDO; printf("FIN DE LA PARTIDA\r\n\n"); } else if(lose==SIGUIENTE_NIVEL) { azul=1; rojo=1; verde=1; u=0; gameplay.attach(&muestra, 0.35);//muestra los colores hasta el nivel actual sensor.detach();//deja de leer el tsi juego_estado=ACTUAL;//lleva a incrementar el nivel j=0; lose=NO_PIERDO; printf("\nASCIENDES AL NIVEL %d!\r\n", (nivel+1)); } else if(lose==GANASTE) { azul=1; rojo=1; verde=1; j=0; sensor.detach();//deja de leer el tsi game_over=GANADOR; juego_estado=DEFAULT;//vuelve al inicio lose=NO_PIERDO; printf("\n\nGANASTE!\r\n\n"); } } void juego() { switch(juego_estado) { case DEFAULT: if(game_over==COMIENZO) { nivel=0; llenado_vector(); if(n==nivel_max) {//cuando se llega al nivel maximo juego_estado=ACTUAL; u=0; gameplay.attach(&muestra, 0.35); incremento=1; } } if(game_over==GANADOR) { titileo=0; indicador_fin='G';//indica el led verde resultado.attach(&indicador_fin_funcion, 0.5);//activa el indicador game_over=6; } if(game_over==PERDEDOR) { titileo=0; indicador_fin='R';//indica el led rojo resultado.attach(&indicador_fin_funcion, 0.5);//activa el indicador game_over=6; } break; case ACTUAL: if(incremento==1) { nivel++;//aumenta de nivel incremento=0; } if(u==(nivel+1)) {//continua con el nivel siguiente y espera la espuesta gameplay.detach(); sensor.attach(&leer_tsi,0.05); juego_estado=RESPUESTA; } break; case RESPUESTA: //estado de reposo break; } }