Solución al último Reto propuesto

Solución del RETO 4:

Antes de ayer nos quedamos con las 2 (dos) ampliación que proponía el reto diario. La primera parte del reto consistía en simplificar el bucle loop() y dejarlo así:

void loop(){
 if (escaparon < 5){
    jugar();       
  } else{
    game_over();
  }
} 

Para eso tenemos que crear dos funciones, jugar() y game_over(), y dentro de cada función poner el código que había en su lugar.

Dentro de jugar():

void jugar(){
  disparando();  
    if (contador > 5000)  {
      contador = 0;
      encenderapagarLEDaleatorio();
      }
}  

Dentro de game_over():

void game_over(){
  apagarLED(led0);
  apagarLED(led1);
  apagarLED(led2);
  apagarLED(led3);
  //Más la música de la derrota!
}

La segunda parte del reto consistía en programar la victoria, de forma similar a como hemos programado la derrota.

Para ello, y siguiendo con la lógica de las funciones, vamos a crear la función win():

void win(){
  encenderLED(led0);
  encenderLED(led1);
  encenderLED(led2);
  encenderLED(led3);
  //Más la música de la victoria!
} 

¿Cuándo llamamos a esta función? Cuando una nueva variable llamada bajas, que cuente el numero de disparos que hemos acertado, llegue a 20.

Cada vez que disparemos y consigamos apagar un led hay que aumentar el contador de bajas. A la vez que aumentamos el contador de bajas en la función disparando() vamos a aprovechar para solucionar un problema que tenía y que hasta este momento no era importante:

Cuando disparamos a una fotoresistencia con el laser, el valor de la fotoresistencia pasa el límite que le hemos fijado y automáticamente se apaga el LED:

//Dentro de void disparando():

if (analogRead(foto0) > limite){
       apagarLED(led0);
       encendido0 = false;
    }

¿Qué pasaría si el LED ya estuviera apagado? Que el programa entraría de todas formas en la función e intentaría apagarlo de nuevo, añadiendo una baja cuando realmente no se a producido.

Para solucionar esto hay que añadir la condición de que el LED esté encendido, además de la condición de que la fotoresistencia supere el límite, para no apagar un LED que ya está apagado.

Quedando de esta forma la función disparando():

void disparando(){
  if (analogRead(foto0) > limite && encendido0){
       apagarLED(led0);
       encendido0 = false;
       bajas++;
    }
  if (analogRead(foto1) > limite && encendido1){
       apagarLED(led1);
       encendido1 = false;
       bajas++;
    }
  if (analogRead(foto2) > limite && encendido2){
       apagarLED(led2);
       encendido2 = false;
       bajas++;
    }
  if (analogRead(foto3) > limite && encendido3){
      apagarLED(led3);
      encendido3 = false;
      bajas++;
    }
  contador++;
}

Podemos poner cualquier valor en el lugar del 20 (veinte), que dice el enunciado que son el número de enemigos que hay que derrotar para ganar el juego. Y para que sea más fácil modificar el código, podemos crear una variable bajas_para_ganar. De esta forma, si queremos aumentar el número de bajas necesarias para ganar solo tenemos que modificar ese número sin tener que buscarlo en el código.

NOTA: Esto también se puede hacer con la derrota y escaparon_para_perder en lugar del número 5 (cinco) que pusimos ayer.

//Recordatorio: Las variable se inicializan al principio. Antes del setup().
.
.
.

const int bajas_para_ganar = 20;
const int escaparon_para_perder = 5;

int contador = 0;
int escaparon = 0;
int bajas = 0;

.
.
.

void loop(){
  if (bajas >= bajas_para_ganar){
    win();
  } else if (escaparon <= escaparon_para_perder){
    jugar();       
  } else{
    game_over();
  }
} 

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.