Nicolás Almaraz
/
TP1_Ejer2
Almaraz Bettig TP1_Ejer2: Simon
main.cpp
- Committer:
- nicoalmaraz
- Date:
- 2019-06-16
- Revision:
- 3:26b1c880c092
- Parent:
- 2:243d75fd5132
File content as of revision 3:26b1c880c092:
//Almaraz y Bettig //TP1 Ejercicio 2: Simon #include "mbed.h" char elementos=0; //Cada elemento es cada posicion del vector del patron char patron[23]; //vector con el patron que hay que seguir char repeticiones_secuencia_inicio=0; //cuenta las veces que repeti la secuencia antes de que comience el juego char leds[4]= {0,0,0,0}; //leds de salida char nivel=1; //Indica por que nivel vas. En total hay 23 niveles char usuario[23]; //vector con los datos que ingresa el usuario char mostrado=0; //cuenta cuantos elementos del vector "patron" mostre char ingreso=0; //es el numero de elemento que ingresó el usuario char pulsador_rojo=1; //pulsador sin rebote char pulsador_azul=1; //pulsador sin rebote char pulsador_verde=1; //pulsador sin rebote char pulsador_amarillo=1; //pulsador sin rebote char lectura_pulsador_valida=0; //flag que indica si se guardó un dato ingresado por el usuario correctamente char ruido=0; //flag que indica que la medicion fue ruido int tiempo_pulsadores=0; //variable de tiempo int tiempo_secuencia_inicio=0; //variable de tiempo int tiempo_patron=0; //variable de tiempo int tiempo_mostrar=0; //variable de tiempo void reset_leds(); void timer(); void secuencia_inicio(); void generar_patron(); void mostrar(); void pulsadores(); void ingresar(); DigitalOut led_rojo(PTB0); DigitalOut led_azul(PTB1); DigitalOut led_verde(PTB2); DigitalOut led_amarillo(PTB3); DigitalIn pulsador_rojo_con_rebote(PTE23); DigitalIn pulsador_azul_con_rebote(PTE22); DigitalIn pulsador_verde_con_rebote(PTE21); DigitalIn pulsador_amarillo_con_rebote(PTE20); DigitalIn reset(PTC1); Ticker ticker; int main() { ticker.attach(&timer, 0.001); char simon=0; char fin=0; long i=0; printf("Presione el pulsador Inicio para iniciar el juego\r\n"); while(1) { switch(simon) { default: case 0: i++; if(reset==0) { srand(i); simon=1; tiempo_secuencia_inicio=0; } break; case 1: //Hago la secuencia que hace el simon antes de arrancar 4 veces y genero el patron secuencia_inicio(); if(repeticiones_secuencia_inicio==4) { simon=2; tiempo_mostrar=0; reset_leds(); generar_patron(); repeticiones_secuencia_inicio=0; } break; case 2: //Tomo el "patron" y muestro la cantidad de colores que indica "nivel" mostrar(); if(mostrado==nivel) { simon=3; mostrado=0; printf("\r\nRealice la secuencia\r\n"); } break; case 3: //Espero a que el usuario ingrese un color ingresar(); if(lectura_pulsador_valida==1) { simon=4; lectura_pulsador_valida=0; } break; case 4: //Analizo el datoingresado if(usuario[ingreso]!=patron[ingreso]) { //me fijo si ingresé algo distintinto a lo que corresponde y lo indico con el flag "fin" printf("Perdiste!\r\n"); fin=1; } if ((usuario[ingreso]==patron[ingreso])&&(ingreso<nivel)) {//Si ingresé un valor correcto vuelvo al estado de ingresar datos y sumo la variable "ingreso" ingreso++; simon=3; } if((ingreso==nivel)&&(ingreso<24)) { //me fijo si llegué a ingresar la cantidad de cosas que mostré (sin completar el patrón completo) ingreso=0; printf("Nivel %d completado!\r\n",nivel); tiempo_mostrar=0; nivel++; simon=2; } if(ingreso==23) { //me fijo si llegué a ingresar 23 cosas y lo indico con el flag "fin" printf("Ganaste!\r\n"); fin=1; } if(fin) { //Si perdí o gané reinicio las variables para comenzar un juego nuevo simon=0; ingreso=0; nivel=1; fin=0; printf("Presione el pulsador Inicio para reiniciar el juego\r\n"); printf("\r\n---------------------------------------------------\r\n"); } break; } //Enciendo los leds correspondientes led_rojo=leds[0]; led_azul=leds[1]; led_verde=leds[2]; led_amarillo=leds[3]; } } void reset_leds() //Apaga todos los leds { leds[0]=0; leds[1]=0; leds[2]=0; leds[3]=0; } void timer() //Incrementa los contadores cada 1ms { tiempo_pulsadores++; tiempo_secuencia_inicio++; tiempo_patron++; tiempo_mostrar++; } void secuencia_inicio() //Hace una secuencia introductoria al juego { static char estado_secuencia_inicio=0; switch(estado_secuencia_inicio) { default: case 0: //rojo reset_leds(); leds[0]=1; if(tiempo_secuencia_inicio==300) { estado_secuencia_inicio=1; tiempo_secuencia_inicio=0; } break; case 1: //azul reset_leds(); leds[1]=1; if(tiempo_secuencia_inicio==300) { estado_secuencia_inicio=2; tiempo_secuencia_inicio=0; } break; case 2: //verde reset_leds(); leds[2]=1; if(tiempo_secuencia_inicio==300) { estado_secuencia_inicio=3; tiempo_secuencia_inicio=0; } break; case 3: //amarillo reset_leds(); leds[3]=1; if(tiempo_secuencia_inicio==300) { estado_secuencia_inicio=0; tiempo_secuencia_inicio=0; repeticiones_secuencia_inicio++; } break; } } void generar_patron() //Genera el patron de 23 colores y los guarda en el vector "patron" { for(elementos=0; elementos<24; elementos++) { patron[elementos]=rand()%4; } } void mostrar() //Muestra la secuencia guardada en "patron" y la variable "mostrado" indica cuantos colores mostré { static char estado_mostrar; switch (estado_mostrar) { default: case 0: if(tiempo_mostrar==400) {//espero 0.4s para volver a encender los leds estado_mostrar=1; tiempo_mostrar=0; leds[patron[mostrado]]=1; //enciendo el led que corresponde } break; case 1: if(tiempo_mostrar==1000) {//espero 1s para apagar los leds estado_mostrar=0; tiempo_mostrar=0; mostrado++; //indico que mostré un elemento más reset_leds(); } break; } } void pulsadores(char pulsador_con_rebote, char valor_salida) // leo el pulsador, le quito el rebote y guardo el dato ingresado en el vector "usuario". Además distingo entre ruido o una lectura valida { static char estado_pulsadores; switch(estado_pulsadores) { default: case 0: //Espero a que se apreten pulsadores y los prendo cuando lo hacen reset_leds(); if(pulsador_con_rebote==0) { tiempo_pulsadores=0; estado_pulsadores=1; } break; case 1: //Espero 50ms para quitar el rebote rise y analizo si fue ruido o realmente presionaron if(tiempo_pulsadores>=50) { if(pulsador_con_rebote==0) { estado_pulsadores=2; usuario[ingreso]=valor_salida; leds[valor_salida]=1; } else { estado_pulsadores=0; ruido=1; } } break; case 2: //Si se habia apretado espero a que se suelte if(pulsador_con_rebote==1) { reset_leds(); tiempo_pulsadores=0; estado_pulsadores=3; } break; case 3: //Espero 50ms para quitar el rebote fall y analizo si ya se fue o debo darle más tiempo if(tiempo_pulsadores>=50) { if(pulsador_con_rebote==1) { estado_pulsadores=0; lectura_pulsador_valida=1; } else tiempo_pulsadores=0; // si todavia no se fue el rebote espero más tiempo } break; } } void ingresar() //Espera a que un pulsador se presione y analiza el dato ingresado con la función "pulsadores" { static char estado_ingresar; switch(estado_ingresar) { default: case 0: if(pulsador_rojo_con_rebote==0) estado_ingresar=1; if(pulsador_azul_con_rebote==0) estado_ingresar=2; if(pulsador_verde_con_rebote==0) estado_ingresar=3; if(pulsador_amarillo_con_rebote==0) estado_ingresar=4; break; case 1: pulsadores(pulsador_rojo_con_rebote,0); break; case 2: pulsadores(pulsador_azul_con_rebote,1); break; case 3: pulsadores(pulsador_verde_con_rebote,2); break; case 4: pulsadores(pulsador_amarillo_con_rebote,3); break; } if(lectura_pulsador_valida==1) { estado_ingresar=0; printf("Ingreso valido\r\n"); } if(ruido==1) { estado_ingresar=0; ruido=0; printf("Deteccion de ruido\r\n"); } }