Sergio Nigeria / Mbed 2 deprecated Ejercicio_Simon_ARIAS

Dependencies:   mbed

Committer:
mateuss
Date:
Sat Jun 04 20:21:05 2022 +0000
Revision:
1:b02bf2b1b242
Parent:
0:f46786ed4c3a
Ejercicio Juego Simon ARIAS - MARAS;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mateuss 0:f46786ed4c3a 1 //ARIAS - MARAS 6°B Tec
mateuss 0:f46786ed4c3a 2 #include "mbed.h"
mateuss 0:f46786ed4c3a 3 #define CANT_PULSADORES 5
mateuss 0:f46786ed4c3a 4 #define BASE_TIEMPO 0.001
mateuss 0:f46786ed4c3a 5
mateuss 0:f46786ed4c3a 6 enum
mateuss 0:f46786ed4c3a 7 {
mateuss 0:f46786ed4c3a 8 SUELTO, QUIZA_PRESIONADO, PRESIONADO, QUIZA_SUELTO
mateuss 0:f46786ed4c3a 9 };
mateuss 0:f46786ed4c3a 10 BusIn pulsadores(PTA13, PTD5, PTD0, PTD2, PTD3);
mateuss 0:f46786ed4c3a 11 int salidas[CANT_PULSADORES];
mateuss 0:f46786ed4c3a 12
mateuss 0:f46786ed4c3a 13 BusOut led(PTC12, PTC13, PTC16, PTC17);
mateuss 0:f46786ed4c3a 14
mateuss 0:f46786ed4c3a 15 Serial pc(USBTX, USBRX);
mateuss 0:f46786ed4c3a 16
mateuss 0:f46786ed4c3a 17 DigitalOut ledR(PTD6);
mateuss 0:f46786ed4c3a 18 DigitalOut ledV(PTD7);
mateuss 0:f46786ed4c3a 19
mateuss 0:f46786ed4c3a 20 Ticker tim;
mateuss 0:f46786ed4c3a 21 int time_puls[CANT_PULSADORES] = {0};
mateuss 0:f46786ed4c3a 22 int trand=1234;
mateuss 0:f46786ed4c3a 23 int tled=1000;
mateuss 0:f46786ed4c3a 24
mateuss 0:f46786ed4c3a 25 void juego(void);
mateuss 0:f46786ed4c3a 26
mateuss 0:f46786ed4c3a 27 int Debounce(int index);
mateuss 0:f46786ed4c3a 28
mateuss 0:f46786ed4c3a 29 void TimerDecremento(void)
mateuss 0:f46786ed4c3a 30 {
mateuss 0:f46786ed4c3a 31 if(tled > 0)
mateuss 0:f46786ed4c3a 32 tled--;
mateuss 0:f46786ed4c3a 33
mateuss 0:f46786ed4c3a 34 for(int i = 0; i < CANT_PULSADORES; i++)
mateuss 0:f46786ed4c3a 35 if (time_puls[i] > 0)
mateuss 0:f46786ed4c3a 36 time_puls[i]--;
mateuss 0:f46786ed4c3a 37 trand++;//tiempo para que al usar rand cambie la semilla
mateuss 0:f46786ed4c3a 38 if(trand>=12345)
mateuss 0:f46786ed4c3a 39 trand=1234;
mateuss 0:f46786ed4c3a 40 }
mateuss 0:f46786ed4c3a 41
mateuss 0:f46786ed4c3a 42 int sec[24]= {0}; //secuancia para el juego
mateuss 0:f46786ed4c3a 43 int nivel=0;//cantidad de niveles completados
mateuss 0:f46786ed4c3a 44 int x=1;
mateuss 0:f46786ed4c3a 45 int main()
mateuss 0:f46786ed4c3a 46 {
mateuss 0:f46786ed4c3a 47 ledR=1;
mateuss 0:f46786ed4c3a 48 ledV=1;
mateuss 0:f46786ed4c3a 49 tim.attach(&TimerDecremento, BASE_TIEMPO);
mateuss 1:b02bf2b1b242 50
mateuss 0:f46786ed4c3a 51 pulsadores[0].mode(PullNone);
mateuss 0:f46786ed4c3a 52 pulsadores[1].mode(PullNone);
mateuss 0:f46786ed4c3a 53 pulsadores[2].mode(PullNone);
mateuss 0:f46786ed4c3a 54 pulsadores[3].mode(PullNone);
mateuss 0:f46786ed4c3a 55 pulsadores[4].mode(PullNone);
mateuss 0:f46786ed4c3a 56
mateuss 0:f46786ed4c3a 57 while(1)
mateuss 0:f46786ed4c3a 58 {
mateuss 0:f46786ed4c3a 59 juego();
mateuss 0:f46786ed4c3a 60 for(int i = 0; i < CANT_PULSADORES; i++)
mateuss 0:f46786ed4c3a 61 {
mateuss 0:f46786ed4c3a 62 salidas[i] = Debounce(i);
mateuss 0:f46786ed4c3a 63 }
mateuss 0:f46786ed4c3a 64 }
mateuss 0:f46786ed4c3a 65 }
mateuss 0:f46786ed4c3a 66
mateuss 0:f46786ed4c3a 67
mateuss 0:f46786ed4c3a 68 void juego(void)
mateuss 0:f46786ed4c3a 69 {
mateuss 0:f46786ed4c3a 70 static int i=0;//nivel actual
mateuss 0:f46786ed4c3a 71 static int estadoled = 5;
mateuss 0:f46786ed4c3a 72 static int a = 0;//valor del nivel actual
mateuss 0:f46786ed4c3a 73 switch(estadoled)
mateuss 0:f46786ed4c3a 74 {
mateuss 0:f46786ed4c3a 75 case 0://INICIO
mateuss 0:f46786ed4c3a 76 ledR=1;
mateuss 0:f46786ed4c3a 77 nivel++;
mateuss 0:f46786ed4c3a 78 estadoled=1;
mateuss 0:f46786ed4c3a 79 tled=500;
mateuss 0:f46786ed4c3a 80 pc.printf("----------------\n");
mateuss 1:b02bf2b1b242 81 if(nivel==25)//DETECTA SI HICIMOS LOS 24 PUNTOS
mateuss 0:f46786ed4c3a 82 estadoled=6;
mateuss 0:f46786ed4c3a 83 break;
mateuss 0:f46786ed4c3a 84
mateuss 0:f46786ed4c3a 85 case 1://led apagado
mateuss 0:f46786ed4c3a 86 led = 0;//apaga el led despues de mostrarlo durante 500ms
mateuss 0:f46786ed4c3a 87 if(tled==0)
mateuss 0:f46786ed4c3a 88 {
mateuss 0:f46786ed4c3a 89 tled=500;
mateuss 0:f46786ed4c3a 90 estadoled=2;
mateuss 0:f46786ed4c3a 91 }
mateuss 0:f46786ed4c3a 92 break;
mateuss 0:f46786ed4c3a 93
mateuss 0:f46786ed4c3a 94 case 2://muestra led
mateuss 0:f46786ed4c3a 95 a = sec[i];
mateuss 0:f46786ed4c3a 96 led[a]=1;//muestra la secuencia a pulsar, el led se enciende por 500ms
mateuss 0:f46786ed4c3a 97 if(x==0)//para que solo se envie 1 vez al hercules
mateuss 0:f46786ed4c3a 98 {
mateuss 0:f46786ed4c3a 99 if(a==0)
mateuss 0:f46786ed4c3a 100 pc.printf("ROJO\n");
mateuss 0:f46786ed4c3a 101 if(a==1)
mateuss 0:f46786ed4c3a 102 pc.printf("VERDE\n");
mateuss 0:f46786ed4c3a 103 if(a==2)
mateuss 0:f46786ed4c3a 104 pc.printf("AZUL\n");
mateuss 0:f46786ed4c3a 105 if(a==3)
mateuss 0:f46786ed4c3a 106 pc.printf("AMARILLO\n");
mateuss 0:f46786ed4c3a 107 x=1;
mateuss 0:f46786ed4c3a 108 }
mateuss 0:f46786ed4c3a 109 if(tled==0)
mateuss 0:f46786ed4c3a 110 {
mateuss 0:f46786ed4c3a 111 tled=500;
mateuss 0:f46786ed4c3a 112 i++;
mateuss 0:f46786ed4c3a 113
mateuss 0:f46786ed4c3a 114 if(i==nivel)//si ya mostro todos los colores pasa al siguiente estado
mateuss 0:f46786ed4c3a 115 {
mateuss 0:f46786ed4c3a 116 estadoled=3;
mateuss 0:f46786ed4c3a 117 i=0;
mateuss 0:f46786ed4c3a 118 x=0;
mateuss 0:f46786ed4c3a 119 }
mateuss 0:f46786ed4c3a 120
mateuss 0:f46786ed4c3a 121 else//si le falta algun o varios colores pasa al estado anterior para mostrar el siguiente
mateuss 0:f46786ed4c3a 122 {
mateuss 0:f46786ed4c3a 123 estadoled=1;
mateuss 0:f46786ed4c3a 124 x=0;
mateuss 0:f46786ed4c3a 125 }
mateuss 0:f46786ed4c3a 126
mateuss 0:f46786ed4c3a 127 }
mateuss 0:f46786ed4c3a 128 break;
mateuss 0:f46786ed4c3a 129
mateuss 0:f46786ed4c3a 130
mateuss 0:f46786ed4c3a 131 case 3://Ingresa secuencia
mateuss 0:f46786ed4c3a 132 led = 0;
mateuss 0:f46786ed4c3a 133 a = sec[i];
mateuss 0:f46786ed4c3a 134
mateuss 0:f46786ed4c3a 135 if(Debounce(a)==1)//si se presiona el boton correcto el programa sigue
mateuss 0:f46786ed4c3a 136 {
mateuss 0:f46786ed4c3a 137 i++;
mateuss 0:f46786ed4c3a 138 estadoled=4;
mateuss 0:f46786ed4c3a 139 tled=500;
mateuss 0:f46786ed4c3a 140 }
mateuss 0:f46786ed4c3a 141
mateuss 0:f46786ed4c3a 142 if((Debounce(0)==1 || Debounce(1)==1 || Debounce(2)==1 || Debounce(3)==1)&&Debounce(a)==0)//si falla vuelve al estado apagado
mateuss 0:f46786ed4c3a 143 {
mateuss 0:f46786ed4c3a 144 estadoled=5;
mateuss 0:f46786ed4c3a 145 }
mateuss 0:f46786ed4c3a 146
mateuss 0:f46786ed4c3a 147 break;
mateuss 0:f46786ed4c3a 148
mateuss 0:f46786ed4c3a 149
mateuss 0:f46786ed4c3a 150 case 4://Indica led Pulsado
mateuss 0:f46786ed4c3a 151 led[a] = 1;//el led pulsado se enciende durante 500ms
mateuss 0:f46786ed4c3a 152 if(tled==0)
mateuss 0:f46786ed4c3a 153 {
mateuss 0:f46786ed4c3a 154 if(i==nivel)//si se ingreso toda la secuencia correctamente vuelve al estado inicial
mateuss 0:f46786ed4c3a 155 {
mateuss 0:f46786ed4c3a 156 estadoled=0;
mateuss 0:f46786ed4c3a 157 i=0;
mateuss 0:f46786ed4c3a 158 }
mateuss 0:f46786ed4c3a 159
mateuss 0:f46786ed4c3a 160 else//si falta ingresar algun color de la secuencia vuelve al paso anterior
mateuss 0:f46786ed4c3a 161 estadoled=3;
mateuss 0:f46786ed4c3a 162 }
mateuss 0:f46786ed4c3a 163 break;
mateuss 0:f46786ed4c3a 164
mateuss 0:f46786ed4c3a 165 case 5: //CASO OFF/PIERDE
mateuss 0:f46786ed4c3a 166 ledV=1;
mateuss 0:f46786ed4c3a 167 ledR=0;
mateuss 0:f46786ed4c3a 168 led=0;
mateuss 0:f46786ed4c3a 169 i=0;
mateuss 0:f46786ed4c3a 170 nivel=0;
mateuss 0:f46786ed4c3a 171 a=0;
mateuss 0:f46786ed4c3a 172
mateuss 0:f46786ed4c3a 173 if(x==0)
mateuss 0:f46786ed4c3a 174 {
mateuss 0:f46786ed4c3a 175 pc.printf("\n");
mateuss 0:f46786ed4c3a 176 pc.printf("Usted Perdio, presione en pulsador de inicio para volver a jugar\n");
mateuss 0:f46786ed4c3a 177 x=1;
mateuss 0:f46786ed4c3a 178 }
mateuss 0:f46786ed4c3a 179
mateuss 0:f46786ed4c3a 180 if(Debounce(4)==1 && tled==0)//SI PRESIONAMOS EL 5° PULSADOR
mateuss 0:f46786ed4c3a 181 {
mateuss 0:f46786ed4c3a 182 srand((unsigned)trand);//CAMBIA LA SEMILLA DEL RAND EN BASE A UN CONTADOR QUE VA CONTANDO CONSTANTEMENTE, POR LO QUE SIEMPRE SERA DIFERENTE
mateuss 0:f46786ed4c3a 183 for(int r=0; r<24; r++)
mateuss 0:f46786ed4c3a 184 {
mateuss 0:f46786ed4c3a 185 sec[r]=(rand() % 4);//GENRA LOS 24 NÚMEROS ALEATORIOS
mateuss 0:f46786ed4c3a 186 }
mateuss 0:f46786ed4c3a 187 estadoled=0;
mateuss 0:f46786ed4c3a 188 x=0;
mateuss 0:f46786ed4c3a 189 }
mateuss 0:f46786ed4c3a 190 break;
mateuss 0:f46786ed4c3a 191
mateuss 0:f46786ed4c3a 192 case 6: //CASO GANA
mateuss 0:f46786ed4c3a 193 led=0;
mateuss 0:f46786ed4c3a 194 ledV=0;
mateuss 0:f46786ed4c3a 195 if(x==0)
mateuss 0:f46786ed4c3a 196 {
mateuss 0:f46786ed4c3a 197 pc.printf("Usted a Ganado, lo felicitamos\n");
mateuss 0:f46786ed4c3a 198 pc.printf("Presione para volver al estado inicial\n");
mateuss 0:f46786ed4c3a 199 x=1;
mateuss 0:f46786ed4c3a 200 }
mateuss 0:f46786ed4c3a 201 if(Debounce(4)==1)//si presionamos el pulsador 5 vuelve al estado apagado
mateuss 0:f46786ed4c3a 202 {
mateuss 0:f46786ed4c3a 203 estadoled=5;
mateuss 0:f46786ed4c3a 204 tled=100;
mateuss 0:f46786ed4c3a 205 }
mateuss 0:f46786ed4c3a 206 break;
mateuss 0:f46786ed4c3a 207 }
mateuss 0:f46786ed4c3a 208 }
mateuss 0:f46786ed4c3a 209
mateuss 0:f46786ed4c3a 210
mateuss 0:f46786ed4c3a 211 // ANTIRREBOTE //
mateuss 0:f46786ed4c3a 212
mateuss 0:f46786ed4c3a 213 int Debounce(int index)
mateuss 0:f46786ed4c3a 214 {
mateuss 0:f46786ed4c3a 215
mateuss 0:f46786ed4c3a 216 int Estado = 0;
mateuss 0:f46786ed4c3a 217 static int DEBOUNCE_estado[CANT_PULSADORES] = {SUELTO};
mateuss 0:f46786ed4c3a 218 switch (DEBOUNCE_estado[index])
mateuss 0:f46786ed4c3a 219 {
mateuss 0:f46786ed4c3a 220 case SUELTO:
mateuss 0:f46786ed4c3a 221 Estado = 0;
mateuss 0:f46786ed4c3a 222 if (pulsadores[index] == 1)
mateuss 0:f46786ed4c3a 223 {
mateuss 0:f46786ed4c3a 224 DEBOUNCE_estado[index] = QUIZA_PRESIONADO;
mateuss 0:f46786ed4c3a 225 time_puls[index] = 30;
mateuss 0:f46786ed4c3a 226 }
mateuss 0:f46786ed4c3a 227 break;
mateuss 0:f46786ed4c3a 228 case QUIZA_PRESIONADO:
mateuss 0:f46786ed4c3a 229 if (time_puls[index] == 0)
mateuss 0:f46786ed4c3a 230 {
mateuss 0:f46786ed4c3a 231 if (pulsadores[index] == 1)
mateuss 0:f46786ed4c3a 232 {
mateuss 0:f46786ed4c3a 233 DEBOUNCE_estado[index] = PRESIONADO;
mateuss 0:f46786ed4c3a 234 }
mateuss 0:f46786ed4c3a 235 if (pulsadores[index] == 0)
mateuss 0:f46786ed4c3a 236 {
mateuss 0:f46786ed4c3a 237 DEBOUNCE_estado[index] = SUELTO;
mateuss 0:f46786ed4c3a 238 }
mateuss 0:f46786ed4c3a 239 }
mateuss 0:f46786ed4c3a 240 break;
mateuss 0:f46786ed4c3a 241 case PRESIONADO:
mateuss 0:f46786ed4c3a 242 Estado = 1;
mateuss 0:f46786ed4c3a 243 if (pulsadores[index] == 0)
mateuss 0:f46786ed4c3a 244 {
mateuss 0:f46786ed4c3a 245 DEBOUNCE_estado[index] = QUIZA_SUELTO;
mateuss 0:f46786ed4c3a 246 time_puls[index] = 30;
mateuss 0:f46786ed4c3a 247 }
mateuss 0:f46786ed4c3a 248 break;
mateuss 0:f46786ed4c3a 249 case QUIZA_SUELTO:
mateuss 0:f46786ed4c3a 250 if (time_puls[index] == 0)
mateuss 0:f46786ed4c3a 251 {
mateuss 0:f46786ed4c3a 252 if (pulsadores[index] == 0)
mateuss 0:f46786ed4c3a 253 {
mateuss 0:f46786ed4c3a 254 DEBOUNCE_estado[index] = SUELTO;
mateuss 0:f46786ed4c3a 255 }
mateuss 0:f46786ed4c3a 256 if (pulsadores[index] == 1)
mateuss 0:f46786ed4c3a 257 {
mateuss 0:f46786ed4c3a 258 DEBOUNCE_estado[index] = PRESIONADO;
mateuss 0:f46786ed4c3a 259 }
mateuss 0:f46786ed4c3a 260 }
mateuss 0:f46786ed4c3a 261 break;
mateuss 0:f46786ed4c3a 262 }
mateuss 0:f46786ed4c3a 263 return Estado;
mateuss 0:f46786ed4c3a 264 }