![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
TP1 Ej 3 Bomba Cobas, Montero
Revision 1:d99665a519ed, committed 2019-06-06
- Comitter:
- cobasjuan
- Date:
- Thu Jun 06 13:58:23 2019 +0000
- Parent:
- 0:9d8c86972a9d
- Commit message:
- TP 1 Ej 3 Bomba
Changed in this revision
main.cpp | Show annotated file Show diff for this revision Revisions of this file |
diff -r 9d8c86972a9d -r d99665a519ed main.cpp --- a/main.cpp Wed May 22 20:58:56 2019 +0000 +++ b/main.cpp Thu Jun 06 13:58:23 2019 +0000 @@ -18,121 +18,267 @@ #define PIERDE 3 #define ESPERO_CABLES 4 #define COMPARACION 5 +#define GEN_SEC 6 // Funciones void CABLES(); void MAQUINA_GENERAL(); +void CONTADOR(); +void displays(); +void t(); + //Timer Ticker timer; -void t(); + //Salidas DigitalOut ledr(LED1); DigitalOut ledg(LED2); DigitalOut ledb(LED3); +BusOut Unidades (PTE5,PTE4,PTE3,PTE2); +BusOut Decenas (PTB11,PTB10,PTB9,PTB8); + +//Entradas TSIAnalogSlider tsi(ELEC0, ELEC1, 40); +DigitalIn C1(A1); +DigitalIn C2(A2); +DigitalIn C3(A3); +DigitalIn C4(A4); // Variables -unsigned int n=0, habcables=0, perdiste=0, finsec=0, tiempo=0; -int secuencia[4]= {1,3,4,2}; +volatile unsigned int tiempo=0; +unsigned int n=0, habcables=0, gen=0, perdiste=0, finsec=0, reed_time=0, segundos=20, fin_tiempo=0; +unsigned int variacion=0; +unsigned int uni=0, dec=0; +int vector[4]; +int jugador[4]; + int main(void) { + C1.mode(PullUp); // Le seteo PullUp a las entradas de los cables para que cuando esten al aire detecte un 1 + C2.mode(PullUp); + C3.mode(PullUp); + C4.mode(PullUp); ledg=1; ledr=1; ledb=1; timer.attach(&t,0.01); while (true) { + gen++; // SEMILLA CABLES(); MAQUINA_GENERAL(); + CONTADOR(); + displays(); } } -void MAQUINA_GENERAL() +void MAQUINA_GENERAL() // Maquina de estados: funcionamiento general del programa { static unsigned int paso_general=ESPERO_ARRANQUE; - unsigned int flag=0; + unsigned int num=0; switch(paso_general) { - case ESPERO_ARRANQUE: + case ESPERO_ARRANQUE: // RESET n=0; tiempo=0; - flag=0; + num=0; + variacion=0; perdiste=0; if(tsi.readPercentage() != 0) { - paso_general=COMPARO_CABLES; + paso_general=GEN_SEC; + printf("Comienzo\n\r"); } break; - case COMPARO_CABLES: + case GEN_SEC: // Genero una secuencia aleatoria encargandome de que no se repitan + for(num=0; num<4; num++) { + srand(++gen); + vector[num]=1+rand()%4; + if(num==1) { + while(vector[1]==vector[0]) { + srand(++gen); + vector[1]=1+rand()%4; + } + } else if(num==2) { + while(vector[2]==vector[1]|| vector[2]==vector[0]) { + srand(++gen); + vector[2]=1+rand()%4; + } + } else if(num==3) { + while(vector[3]==vector[2]|| vector[3]==vector[1] || vector[3]==vector[0]) { + srand(++gen); + vector[3]=1+rand()%4; + } + } + printf("%d\r\n", vector[num]); + } + paso_general=COMPARO_CABLES; + break; + case COMPARO_CABLES: // Habilito la maquina de estados de comparacion de cables con secuencia habcables=1; - if(perdiste == 1) { + if(perdiste == 1 || fin_tiempo==1) { //Si se levanta el flag de perdida paso al caso "PIERDE" + perdiste=0; + printf("Perdiste\r\n"); + tiempo=150; paso_general=PIERDE; } - if(finsec == 1) { + if(finsec == 1) { //Si se levanta el flag de perdida paso al caso "GANA" + finsec=0; + printf("Ganaste\r\n"); + tiempo=150; paso_general=GANA; } break; - case GANA: - if(flag == 0) { - flag=1; - tiempo=100; - ledg=0; - } else if(tiempo==0 && flag == 1) { + case GANA: // Enciendo el led verde y titilo displays hasta reiniciar el juego + ledg=0; + if(tiempo == 100) { + Unidades=uni; + Decenas=dec; + } + if(tiempo == 50) { + Unidades=15; + Decenas=15; + } + if(tiempo == 0) { + tiempo=120; + } + if(tsi.readPercentage() != 0 && C1 == 0 && C2 == 0 && C3 == 0 && C4 == 0 ) { + n=0; ledg=1; - paso_general=ESPERO_ARRANQUE; + tiempo=0; + perdiste=0; + finsec=0; + fin_tiempo=0; + segundos=20; + num=0; + variacion=0; + paso_general=GEN_SEC; + printf("Comienzo\n\r"); } break; - case PIERDE: + case PIERDE: // Titilo el led rojo y los displays hasta reiniciar el juego + if(tiempo == 100) { + ledr=0; + Unidades=uni; + Decenas=dec; + } + if(tiempo == 50) { + ledr=1; + Unidades=15; + Decenas=15; + } + if(tiempo == 0) { + tiempo=120; + } + if(tsi.readPercentage() != 0 && C1 == 0 && C2 == 0 && C3 == 0 && C4 == 0 ) { + n=0; + ledg=1; + ledr=1; + tiempo=0; + perdiste=0; + finsec=0; + fin_tiempo=0; + segundos=20; + num=0; + variacion=0; + paso_general=GEN_SEC; + printf("Comienzo\n\r"); + } break; } } -void CABLES() +void CABLES() // Maquina de estados: comparo la secuencia generada con el cable desconectado { static unsigned int paso_cables=ESPERO_CABLES; - unsigned int fail=0; + static unsigned int fail=0, bloqueo_cable1=0, bloqueo_cable2=0, bloqueo_cable3=0, bloqueo_cable4=0; switch(paso_cables) { case ESPERO_CABLES: if(habcables == 1) { paso_cables=COMPARACION; } break; - case COMPARACION: - if(n == 0) { - if((C1 || C2 || C3 || C4) == 1) { - if((secuencia[n] == 1 && C1 == 1) || (secuencia[n] == 2 && C2 == 1) || (secuencia[n] == 3 && C3 == 1) || (secuencia[n] == 4 && C4 == 1)) { - n++; - } else fail=1; - } - } else if(n == 1) { - if() { - if((secuencia[n] == 1 && C1 == 1) || (secuencia[n] == 2 && C2 == 1) || (secuencia[n] == 3 && C3 == 1) || (secuencia[n] == 4 && C4 == 1)) { - n++; - } else fail=1; - } - } else if(n == 2) { - if() { - if((secuencia[n] == 1 && C1 == 1) || (secuencia[n] == 2 && C2 == 1) || (secuencia[n] == 3 && C3 == 1) || (secuencia[n] == 4 && C4 == 1)) { - n++; - } else fail=1; - } - } else if(n == 3) { - if() { - if((secuencia[n] == 1 && C1 == 1) || (secuencia[n] == 2 && C2 == 1) || (secuencia[n] == 3 && C3 == 1) || (secuencia[n] == 4 && C4 == 1)) { - finsec=1; - habcables=0; - paso_cables=ESPERO_CABLES; - } else fail=1; - } + case COMPARACION: // Si se desconecta un cable se levanta un flag de variacion y se bloquea ese cable para que no se vuelva a detectar + if(C1 == 1 && bloqueo_cable1 == 0) { + bloqueo_cable1=1; + variacion=1; + jugador[n]=1; + } else if(C2 == 1 && bloqueo_cable2 == 0) { + bloqueo_cable2=1; + variacion=1; + jugador[n]=2; + } else if(C3 == 1 && bloqueo_cable3 == 0) { + bloqueo_cable3=1; + variacion=1; + jugador[n]=3; + } else if(C4 == 1 && bloqueo_cable4 == 0) { + bloqueo_cable4=1; + variacion=1; + jugador[n]=4; } - if(fail == 1) { + if(variacion == 1) { // Si se levanta el flag de variacion comparo el cable con la secuencia + if(jugador[n] == vector[n]) { + printf("Bien hecho!\n\r"); // Si coincide pasa de nivel + n++; + } else fail=1; // Si difiere levanto el flag de partida perdida + variacion=0; + } + if(fail == 1) { //reinicio las variables y levanto el flag de perdida perdiste=1; habcables=0; + bloqueo_cable1=0; + bloqueo_cable2=0; + bloqueo_cable3=0; + bloqueo_cable4=0; + fail=0; + paso_cables=ESPERO_CABLES; + } else if(n == 4) { // Si llego al nivel 4 quiere decir que termino el juego y ganaste. Levanto el flag de victoria + finsec=1; + bloqueo_cable1=0; + bloqueo_cable2=0; + bloqueo_cable3=0; + bloqueo_cable4=0; + variacion=0; + habcables=0; paso_cables=ESPERO_CABLES; } break; } } +void CONTADOR() // Decremento una variable cada 1 segundo que corresponde al tiempo de juego. La variable comienza en 30 +{ + static unsigned int comienzo=0; + if(habcables == 1) { + if(comienzo == 0) { + tiempo=0; + comienzo=1; + } + if(tiempo == 0 && fin_tiempo == 0) { + segundos--; + reed_time=0; + tiempo=100; + } + if(segundos == -1 && fin_tiempo == 0) { + fin_tiempo=1; + segundos++; + printf("Se acabo el tiempo!\n\r"); + } + } +} + +void displays() // Envio de informacion de tiempo de juego a displays +{ + dec=segundos/10; + uni=segundos%10; + if(reed_time == 0 && fin_tiempo == 0) { + Unidades=uni; + Decenas=dec; + reed_time=1; + } +} + + + void t() { if (tiempo > 0)