![]() |
RECUERDA: Este post fue originalmente escrito usando la primera versión de Bitbloq. Si estás buscando el contenido y los programas del post original, podrás encontrarlos en la sección de descargas. |
¿Tienes lo que hay que tener para mantener la calma delante de una bomba? ¿Vencerás a tu contrincante en este juego de sangre fría? ¿Y si aprendemos programación creando un juego súper chulo?
En este post vamos a construir un juego en el que ganará el último que desactive la bomba. Sí sí, el último en desactivarla; competimos para ver quién tiene más aplomo y quién sabe contar mejor de memoria.
Reglas del juego
- La bomba explotará en 30 segundos, a no ser que ambos la desactivéis.
- Cada jugador tiene delante un “Death Panel”, que consta de un sensor (pulsador o IR) que al pulsarlo desactivará la bomba y un LED que se encenderá si has ganado la partida
- Puedes desactivar la bomba cuando quieras (antes de que explote), pero solo puedes pulsar una vez. Después, ninguna pulsación tuya tendrá efecto.
- Si solo un jugador la desactiva, habrá ganado ese jugador.
- Si ambos jugadores la desactivan, ganará el jugador que más se haya arriesgado y le haya dado al botón más tarde.
- Además, para hacerlo más interesante, cuando pulsas el botón bloqueas el botón del contrario durante 1,5 segundos (haciendo sonar el zumbador para indicarlo). Hazlo en el momento preciso para ganar la partida con estilo
Manos a la obra. Lo primero que tenemos que hacer es construir el invento y luego programar el juego.
Guía de montaje
Necesitarás:
Paso 1: Imprimir la plantilla.
Paso 2: Recortar la plantilla.
Recorta por las líneas blancas lisas y no olvides los círculos interiores de los “Death Panel”. Ambos tienen el diseño de un pulsador por si tienes dos, pero nosotros vamos a poner en uno de ellos el IR.
Si tienes goma EVA roja, queda muy bien hacer la dinamita con ella.
Paso 3: Construir la bomba
Dobla las dinamitas hacia dentro e introduce las 4 pestañas tal y como se ve en la imagen. Dobla también la “Death Box” y pega las pestañas para que quede como la imagen de abajo a la derecha. ¡No la cierres todavía, que hay que meter los componentes electrónicos!
Ahora toca embellecerla con la cinta adhesiva roja o negra. Fíjate en la ilustración de la plantilla y haz que quede igual.
Paso 4: Colocar los componentes.
Coloca los componentes pasándolos por las aberturas de la “Death Box” como aparece en la imagen.
Paso 5: Colocar los “Death Panel” y montaje final.
Ahora queda colocar por detrás los componentes en los “Death Panel” y fijar todo con cinta adhesiva (o similares)
Ya tenemos montado nuestro juego. Ahora queda lo más interesante, la programación.
Programación
En la programación de este juego vamos a enfrentarnos a dos nuevos conceptos: Los “Flags” y el “Manejo del tiempo” en un programa
Flags: También llamadas “banderas”. Son variables binarias (es decir, solo admiten dos valores “0-1″ o “Falso-Verdadero”) que sirven para guardar estados o recordar si ha pasado algo o no. Por ejemplo, si me interesa saber si ya se ha pulsado un botón, usaré una flag que guardará falso cuando no se ha pulsado y Verdadero cuando sí. Esto me permitirá más tarde usar como condición en un bloque Si…Ejecutar la variable flag para comprobar si se pulsó el botón o no.
El programa está constituido por el bucle principal y tres funciones:
Lo primero que hacemos en el bucle principal es crear un montón de variables globales, de las cuales varias son flags. Es necesario que sean globales para que no vuelvan a su estado original en cada repetición del bucle ya que, recordamos, los bloques de las variables globales solo se inicializan una vez.
- La variable global Tiempo_bomba guarda el tiempo que debe tardar en explotar la bomba. Si cambias esta variable podrás modificar el tiempo que tarda en explotar la dinamita.
- Tiempo_actual guarda el tiempo que lleva activo el juego en cada momento.
- Jugador_ganador recordará qué jugador ha ganado.
- Boton_1_pulsado y Boton_2_pulsado son flags que recuerdan si ya se ha pulsado el botón del jugador 1 y del 2, puesto que solo pueden pulsarse una vez según las reglas del juego.
- fin_de_juego es otra flag que se activará cuando se acabe el juego.
También al inicio de cada ciclo del bloque loop guardaremos en 2 variables los estados de los botones/sensores IR:
- Boton_1 y Boton_2 sirven para almacenar el valor del botón, como ya estáis acostumbrados.
Muchas variables, ¿verdad? Pero eso no es malo. Cuanto más organizado tengamos el programa, mejor. Las variables, y en concreto las flags, son herramientas muy útiles para un programador.
Vamos ahora con la parte larga del programa, el bucle Mientras que marca el tiempo:
Lo primero que vemos es que tiene 3 condiciones. Mientras ningún jugador pulse su botón y, si el juego todavía no se ha acabado, el programa se va a quedar dentro del bucle. Es decir, casi todo el rato, ¿no? Solo saldremos del bucle cuando un jugador pulse el botón, y una vez acabado el juego, no volveremos a entrar (porque ya se ha acabado la partida).
¿Y qué es lo que hacemos dentro del bucle? Pues contar cuánto tiempo lleva la bomba encendida (¡cuidado que explota!). Mediante los dos bloques que ves abajo, llevamos la cuenta del tiempo sin bloquear el resto del programa.
Cada 100 ms que esperamos, sumamos 100 a la variable del tiempo actual y dejamos que el programa continúe. Así, el valor que esté dentro de la variable corresponderá al tiempo que hemos esperado en el programa. No hay que preocuparse de todos los demás bloques, ya que se ejecutan muy rápido.
Si por el contrario, para esperar 30 segundos, usáramos un bloque Esperar de 30000 ms estaríamos contando de forma muy precisa, pero no podríamos hacer nada más, puesto que bloquea completamente el programa mientras cuenta.
Además de contar, en este bucle Mientras estamos comprobando los botones y si se ha dado alguna de las dos condiciones de “Fin de juego” para llamar a las funciones que correspondan:
- Que la bomba explote: Si el tiempo actual es mayor que el tiempo de la bomba.
- Que los dos jugadores desactiven la bomba: Ambos jugadores han pulsado el botón.
Vamos ahora a lo que no es el bucle Mientras. Si hemos salido del bucle es porque alguien ha pulsado el botón. En ese caso, dependiendo de quién lo haya pulsado, haremos una u otra cosa mediante los bloques condicionales.
Si lo pulsa el jugador 1 y es la primera vez que lo pulsa (boton_1_pulsado = falso), cambiaremos el estado de boton_1_pulsado a verdadero y diremos (por el momento) que ha ganado el jugador 1. De esta forma, el último jugador que pulse el botón será quien gane, ya que el último que lo pulse será quien guarde en la variable su número de jugador. Además, cada vez que un jugador pulse, avisaremos con un pitido del zumbador durante 1,5 segundos (como decía en las reglas) y sumaremos este tiempo a la variable de tiempo_actual para llevar bien la cuenta del tiempo.
Solo queda ver las funciones.
Desactivar bomba y Explosión bomba son simplemente sonidos, pero Comprobar ganador comprueba quién ha ganado, enciende el LED de su “Death Panel” y cambia el flag de fin_de_juego a verdadero, indicando que el juego ha acabado.
Si lo has entendido todo… ¡es el momento de jugar! Y recuerda, para empezar una nueva partida, presiona el botón de reset de la placa.
Si no sabes cuál es, pincha aquí
En este post hemos creado juntos un invento para jugar con nuestros amigos, hemos aprendido qué son las flags y lo útiles que son para que nuestra placa recuerde cosas, y también hemos aprendido cómo contar tiempo sin detener el programa.
Si quieres mejorar tu invento a la versión “deluxe”, porque no pruebas a:
- Hacer que la manecilla del reloj se mueva de forma aleatoria con el servo de rotación continua.
- Hacer una versión para más jugadores.
- Usar el potenciómetro para elegir el tiempo de estallido.
- Añadir al juego alguna otra divertida norma.
¡Es hora de demostrar quién tiene más nervios de estaño!