Tabla de contenido:
- Paso 1: todas las partes
- Paso 2: Cómo conectar las piezas al Arduino
- Paso 3: Diagrama de flujo del programa
- Paso 4: Programación del joystick
- Paso 5: el primer nivel
- Paso 6: detección de colisiones
- Paso 7: Los dos últimos niveles
Video: Recreando el juego más difícil del mundo en Arduino: 7 pasos
2024 Autor: John Day | [email protected]. Última modificación: 2024-01-30 08:42
Este proyecto se basa en un juego de computadora que puedes encontrar en línea. Su nombre es "El juego más difícil del mundo". Pude recrearlo en el Arduino usando una matriz de LED de cuatro módulos. En este instructivo te enseño cómo construirlo tú mismo. Antes de entrar en demasiados detalles, quiero dar una descripción general rápida de los pasos que seguí para crear este juego.
- Reuní todas las piezas necesarias.
- Conecté las partes juntas.
- Escribí un boceto que usaba el joystick para mover el LED de los jugadores a través de todos los módulos.
- Diseñé los primeros obstáculos y los agregué al boceto para que emularan el juego más difícil del mundo.
- Luego agregué un código para detectar una colisión con los obstáculos, lo que reiniciará el juego.
- Y luego diseñé dos niveles más de obstáculos.
Paso 1: todas las partes
Aquí hay una lista de todas las piezas que necesita:
- Un conector USB y Arduino UNO:
- Un módulo de cuatro 8x8: matriz de LED
- Un joystick:
- 10 cables macho a hembra:
Paso 2: Cómo conectar las piezas al Arduino
Cómo conectar la matriz LED al Arduino
- GND va a GND
- VCC pasa a 5V
- DataIn va al pin digital 12
- CLK pasa al pin digital 11
- CS o LOAD va al pin digital 10
Cómo conectar el joystick
- GND va a GND
- 5V pasa a 5V
- VRx va al pin analógico A0
- VRy va al pin analógico A1
- SW no se usa
La batería se conecta al conector de 9v para darle energía al Arduino
Paso 3: Diagrama de flujo del programa
El óvalo indica el inicio del programa.
El primer paso es definir todos los obstáculos.
Los siguientes dos pasos indican configurar las variables y encender todos los módulos.
El siguiente paso es configurar los LED en el primer nivel y cualquier otra variable.
A continuación, muestre el nivel en el que se encuentra actualmente el jugador.
El rombo indica la lectura del Joystick para ver en qué dirección se empuja.
Luego, mueva al jugador en la dirección en la que se empujó el joystick.
Compruebe y vea si el jugador chocó con un obstáculo.
Si el jugador choca contra un obstáculo, vuelve al primer nivel. De lo contrario, compruebe si el jugador llegó al final del nivel.
Si el jugador está al final del nivel, ajuste al siguiente nivel y luego vuelva a "Mostrar nivel actual". Si no están al final, mueva los obstáculos y vuelva a "Leer Joystick".
Paso 4: Programación del joystick
Por supuesto, para mover el puntito que es el jugador, necesitamos un joystick. y para permitir que el joystick mueva realmente al reproductor, necesitamos codificarlo en el IDE de Arduino. Debe incluir la biblioteca de LedControl que puede encontrar yendo al menú de bocetos> Incluir bibliotecas> administrar bibliotecas y busque LedControl. Así es como se ve el código del joystick.
#include "LedControl.h"
int DataIn = 12; int CLK = 11; int DIN = 10; LedControl lc = LedControl (Entrada de datos, CLK, DIN, 4); // Crea objeto para cuatro módulos int delaytime = 50; // velocidad a la que se ejecuta el juego int joystick_RtLt, joystick_UpDn; int players_x = 0; // posición horizontal de los jugadores de 0 a 31 int players_y = 3; // posición vertical de los jugadores de 0 a 7 int fila, columna, módulo; configuración vacía () {initialize_modules (); // enciende y configura los cuatro módulos led} void loop () {move_player (); // iniciar el ciclo comprobando si el jugador se mueve delay (delaytime); } void initialize_modules () {lc.shutdown (0, falso); // inicia el módulo 0 lc.setIntensity (0, 1); lc.shutdown (1, falso); // inicia el módulo 1 lc.setIntensity (1, 1); lc.shutdown (2, falso); // inicia el módulo 2 lc.setIntensity (2, 1); lc.shutdown (3, falso); // inicia el módulo 3 lc.setIntensity (3, 1); lc.clearDisplay (0); // borra el módulo 0} void move_player () {module = players_x / 8; // define en qué módulo está el jugador column = players_x% 8; // define la columna donde está el jugador en el módulo row = players_y; lc.setLed (módulo, fila, columna, falso); // apaga el led en la posición actual del jugador joystick_RtLt = analogRead (A0) / 204 - 2; // leer X-joystick y rango de mapa de 2 a -2 if (joystick_RtLt> 0) // cuando el joystick está a la derecha players_x ++; // ir a la derecha else if (joystick_RtLt 0) // si el joystick está a la izquierda y no al principio players_x--; // mover el joystick a la izquierda_UpDn = analogRead (A1) / 204 - 2; // lee el joystick Y y el rango del mapa de 2 a -2 if (joystick_UpDn 0) // si el joystick está abajo y el jugador no está abajo players_y--; // mover hacia abajo else if (joystick_UpDn> 0 && players_y <7) // si el joystick está arriba y el jugador no está arriba players_y ++; // subir módulo = jugadores_x / 8; // establece el módulo para los jugadores columna de nueva posición = jugadores_x% 8; // establecer la columna para los jugadores nueva posición fila = jugadores_y; // establece la fila en la nueva posición de los jugadores lc.setLed (módulo, fila, columna, verdadero); // enciende el led en la nueva posición del jugador}
Ahora que ha agregado el joystick, ¡trabajemos en el primer obstáculo!
Paso 5: el primer nivel
Muy bien, ahora es el momento de entrar en la parte principal del programa, ¡los obstáculos! Los obstáculos son los que realmente hacen de este el "Juego más difícil del mundo". Entonces, si realmente quieres jugar el juego, debes agregar esto a tu código:
obstáculo byte [NIVELES] [ESCENAS] [COLUMNAS] [FILAS] = {// tres niveles, 8 escenas, 8 columnas, 8 filas
{{{1, 1, 1, 1, 1, 1, 0, 0}, // primer nivel, primera escena {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 1, 1, 1, 1, 1, 1}, { 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}}, {{1, 1, 1, 1, 1, 0, 0, 1}, {0, 0, 0, 0, 0, 0, 0, 0}, // primer nivel, segunda escena {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {1, 0, 0, 1, 1, 1, 1, 1 }, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}}, {{1, 1, 1, 1, 0, 0, 1, 1}, {0, 0, 0, 0, 0, 0, 0, 0}, // primer nivel, tercer escena {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {1, 1, 0, 0, 1, 1, 1, 1}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}}, {{1, 1, 1, 0, 0, 1, 1, 1}, {0, 0, 0, 0, 0, 0, 0, 0}, // primero nivel, cuarta escena {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {1, 1, 1, 0, 0, 1, 1, 1}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}}, {{1, 1, 0, 0, 1, 1, 1, 1}, {0, 0, 0, 0, 0, 0, 0, 0}, // primer nivel, quinta escena {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {1, 1, 1, 1, 0, 0, 1, 1}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}}, {{1, 0, 0, 1, 1, 1, 1, 1}, {0, 0, 0, 0, 0, 0, 0, 0}, // primer nivel, sexta escena {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, { 1, 1, 1, 1, 1, 0, 0, 1}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}}, {{0, 0, 1, 1, 1, 1, 1, 1}, // primer nivel, séptima escena {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0 }, {1, 1, 1, 1, 1, 1, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}}, {{0, 1, 1, 1, 1, 1, 1, 1}, // primer nivel, octavo escena {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {1, 1, 1, 1, 1, 1, 1, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}}}, configuración vacía () {initialize_modules (); // enciende y configura los cuatro módulos led start_level (0); bucle vacío () {move_player (); // iniciar el ciclo comprobando si el jugador se mueve if (collision ()) {// comprobar el nivel de colisión = 0; // si la colisión es verdadera, restablecer el nivel start_level (nivel); // reiniciar el juego} else if (delay_count == obstacle_delay) {// si no hay colisión mover el obstáculo cada dos retrasos moveobstacle (); delay_count = 0; } más delay_count ++; delay (delaytime); // retraso por velocidad del juego}
¡Y ese es el primer obstáculo! Si te aburres de esto como tu primer nivel, entonces siempre puedes cambiar los bytes, ¡solo recuerda que necesitas tener ocho escenas diferentes! ¡Continuemos con el siguiente paso, detección de colisiones!
Paso 6: detección de colisiones
Este paso es otra parte importante del juego, ¡sin él no habría mucho desafío! ¡Podrías abrirte camino a través de los obstáculos sin ninguna consecuencia! eso no sería muy divertido, ¿verdad? así que hagamos el juego más desafiante (¡y mucho más entretenido!) agregando esta sección del programa:
bucle vacío () {
mover jugador(); // iniciar el ciclo comprobando si el jugador se mueve if (collision ()) {// comprobar el nivel de colisión = 0; // si la colisión es verdadera, restablecer el nivel start_level (nivel); // reiniciar el juego} else if (delay_count == obstacle_delay) {// si no hay colisión mover el obstáculo cada dos retrasos moveobstacle (); delay_count = 0; } más delay_count ++; delay (delaytime); // retraso por velocidad del juego} int collision () {// verifica si el jugador chocó con un obstáculo en la escena module = players_x / 8; columna = jugadores_x% 8; fila = jugadores_y; if (módulo> 0) if (obstáculo [nivel] [escena] [columna] [fila] == 1) // si la posición del jugador es la misma que la de retorno de obstáculo (1); // colisión detectada return true return (0); // sin colisión devuelve falso}
¡Y ahí tienes! ¡Ahora puedes disfrutar mucho más del juego! ¡Ahora voy a mostrarte cómo programar los dos últimos niveles del juego! Ya casi has terminado con este instructivo, ¡y estoy seguro de que estás listo para probarlo!
Paso 7: Los dos últimos niveles
Estamos llegando al final del instructable, estos dos últimos niveles son todo lo que necesitas para terminar este juego. ¡Entonces puedes probarlo por ti mismo! aquí está el código:
obstáculo byte [NIVELES] [ESCENAS] [COLUMNAS] [FILAS] = {// segundo y tercer nivel, 8 escenas, 8 columnas, 8 filas
{{{1, 0, 0, 0, 0, 0, 0, 1}, // segundo nivel, primera escena {0, 1, 0, 0, 0, 0, 1, 0}, {0, 0, 1, 0, 0, 1, 0, 0}, {0, 0, 0, 1, 1, 0, 0, 0}, {0, 0, 0, 1, 1, 0, 0, 0}, { 0, 0, 1, 0, 0, 1, 0, 0}, {0, 1, 0, 0, 0, 0, 1, 0}, {1, 0, 0, 0, 0, 0, 0, 1}}, {{1, 1, 0, 0, 0, 0, 0, 1}, // segundo nivel, segunda escena {0, 0, 1, 0, 0, 0, 0, 1}, {0, 0, 0, 1, 0, 0, 1, 0}, {0, 0, 0, 1, 1, 1, 0, 0}, {0, 0, 1, 1, 1, 0, 0, 0 }, {0, 1, 0, 0, 1, 0, 0, 0}, {1, 0, 0, 0, 0, 1, 0, 0}, {1, 0, 0, 0, 0, 0, 1, 1}}, {{0, 1, 0, 0, 0, 0, 0, 0}, // segundo nivel, tercera escena {0, 0, 1, 1, 0, 0, 0, 1}, {0, 0, 0, 1, 0, 0, 1, 0}, {0, 0, 0, 1, 1, 1, 1, 0}, {0, 1, 1, 1, 1, 0, 0, 0}, {0, 1, 0, 0, 1, 0, 0, 0}, {0, 1, 0, 0, 0, 1, 1, 0}, {0, 0, 0, 0, 0, 0, 1, 0}}, {{0, 0, 1, 0, 0, 0, 0, 0}, // cuarta escena de segundo nivel {0, 0, 0, 1, 1, 0, 0, 0}, {0, 0, 0, 0, 1, 0, 0, 1}, {0, 1, 1, 1, 1, 0, 1, 0}, {0, 1, 0, 1, 1, 1, 1, 0}, {1, 0, 0, 1, 0, 0, 0, 0}, {0, 0, 0, 1, 1, 0, 0, 0}, {0, 0, 0, 0, 0, 1, 0, 0}}, {{0, 0, 0, 1, 0, 0, 0, 0}, // segundo nivel, quince a escena {0, 0, 0, 0, 1, 0, 0, 0}, {0, 0, 1, 0, 0, 1, 0, 0}, {0, 1, 0, 1, 1, 0, 0, 1}, {1, 0, 0, 1, 1, 0, 1, 0}, {0, 0, 0, 1, 0, 0, 1, 0}, {0, 0, 0, 1, 0, 0, 0, 0}, {0, 0, 0, 0, 1, 0, 0, 0}}, {{0, 0, 0, 0, 1, 0, 0, 0}, // segundo nivel, sexta escena {0, 0, 0, 0, 0, 1, 0, 0}, {0, 1, 1, 0, 0, 1, 0, 0}, {1, 0, 0, 1, 1, 0, 0, 0}, {0, 0, 0, 1, 1, 0, 1, 1}, {0, 0, 1, 0, 0, 1, 1, 0}, {0, 0, 1, 0, 0, 0, 0, 0}, {0, 0, 0, 1, 0, 0, 0, 0}}, {{0, 0, 0, 0, 0, 1, 0, 0}, // segundo nivel, séptima escena {0, 0, 0, 0, 0, 1, 0, 0}, {1, 1, 1, 0, 0, 1, 0, 0}, {0, 0, 0, 1, 1, 0, 0, 0}, {0, 0, 0, 1, 1, 0, 0, 0}, {0, 0, 1, 0, 0, 1, 1, 1}, {0, 0, 1, 0, 0, 0, 0, 0}, {0, 0, 1, 0, 0, 0, 0, 0}}, {{0, 0, 0, 0, 0, 0, 1, 0}, // octava escena de segundo nivel {1, 1, 0, 0, 0, 0, 1, 0}, {0, 0, 1, 0, 0, 1, 0, 0}, {0, 0, 0, 1, 1, 0, 0, 0}, {0, 0, 0, 1, 1, 0, 0, 0}, {0, 0, 1, 0, 0, 1, 0, 0}, {0, 1, 0, 0, 0, 0, 1, 1}, {0, 1, 0, 0, 0, 0, 0, 0}}}, {{{0, 1, 0, 0, 0, 0, 0, 1}, // tercer nivel, primera escena {0, 0, 0, 1, 0, 0, 1, 0}, {0, 0, 1, 0, 0, 1, 0, 0}, {0, 1, 0, 0, 0, 1, 0, 0}, {1, 0, 0, 1, 0, 0, 1, 0}, {0, 0, 1, 0, 0, 1, 0, 0}, {0, 1, 0, 0, 1, 0, 0, 1}, {0, 0, 0, 1, 0, 0, 0, 0} }, {{0, 0, 0, 0, 1, 0, 0, 1}, // tercer nivel, segunda escena {1, 0, 0, 0, 0, 0, 1, 0}, {0, 0, 1, 0, 0, 1, 0, 0}, {0, 1, 0, 0, 1, 0, 0, 1}, {1, 0, 0, 1, 0, 0, 0, 0}, {0, 0, 1, 0, 0, 1, 0, 0}, {0, 0, 0, 0, 1, 0, 0, 0}, {1, 0, 0, 1, 0, 0, 1, 0}}, {{0, 1, 0, 0, 1, 0, 0, 1}, // tercer nivel, tercera escena {0, 0, 0, 1, 0, 0, 1, 0}, { 0, 0, 0, 0, 0, 1, 0, 0}, {0, 1, 0, 0, 1, 0, 0, 1}, {1, 0, 0, 1, 0, 0, 1, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 1, 0, 0, 0, 0, 0, 1}, {1, 0, 0, 1, 0, 0, 0, 0}}, {{0, 0, 0, 0, 1, 0, 0, 1}, // tercer nivel, cuarta escena {1, 0, 0, 1, 0, 0, 1, 0 }, {0, 0, 1, 0, 0, 1, 0, 0}, {0, 0, 0, 0, 1, 0, 0, 1}, {1, 0, 0, 0, 0, 0, 1, 0}, {0, 0, 1, 0, 0, 1, 0, 0}, {0, 1, 0, 0, 0, 0, 0, 0}, {1, 0, 0, 1, 0, 0, 1, 0}}, {{0, 1, 0, 0, 1, 0, 0, 1}, // tercer nivel, quinta escena {0, 0, 0, 1, 0, 0, 1, 0}, {0, 0, 1, 0, 0, 1, 0, 0}, {0, 1, 0, 0, 0, 0, 0, 1}, {0, 0, 0, 1, 0, 0, 1, 0}, {0, 0, 1, 0, 0, 1, 0, 0}, {0, 1, 0, 0, 1, 0, 0, 1}, {1, 0, 0, 0, 0, 0, 0, 0}}, {{0, 0, 0, 0, 1, 0, 0, 1}, // tercer nivel, sexta escena {1, 0, 0, 1, 0, 0, 1, 0}, {0, 0, 1, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 1, 0, 0, 1}, {1, 0, 0, 1, 0, 0, 1, 0}, {0, 0, 1, 0, 0, 1, 0, 0}, {0, 1, 0, 0, 0, 0, 0, 0}, {1, 0, 0, 1, 0, 0, 1, 0}}, {{0, 1, 0, 0, 1, 0, 0, 1}, // tercer nivel, séptima escena {0, 0, 0, 1, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 1, 0, 0}, {0, 1, 0, 0, 1, 0, 0, 1}, {1, 0, 0, 1, 0, 0, 1, 0}, {0, 0, 1, 0, 0, 0, 0, 0}, {0, 1, 0, 0, 1, 0, 0, 1}, {1, 0, 0, 1, 0, 0, 0, 0}}, {{0, 0, 0, 0, 1, 0, 0, 0}, // tercer nivel, octava escena { 1, 0, 0, 0, 0, 0, 1, 0}, {0, 0, 1, 0, 0, 1, 0, 0}, {0, 1, 0, 0, 1, 0, 0, 1}, {1, 0, 0, 1, 0, 0, 0, 0}, {0, 0, 1, 0, 0, 1, 0, 0}, {0, 1, 0, 0, 1, 0, 0, 0}, {1, 0, 0, 1, 0, 0, 1, 0}}}};
¡Y eso es! ya está todo listo para intentar completar el juego más difícil del mundo. Además, el código completo de Arduino se adjunta a continuación.
Recomendado:
El inversor solar fuera de la red más eficiente del mundo: 3 pasos (con imágenes)
El inversor solar sin conexión a la red más eficiente del mundo: la energía solar es el futuro. Los paneles pueden durar muchas décadas. Digamos que tiene un sistema solar fuera de la red. Tiene un refrigerador / congelador y un montón de otras cosas para ejecutar en su hermosa cabina remota. ¡No puede darse el lujo de desperdiciar energía
El altavoz Bluetooth más pequeño del mundo de las piezas antiguas: 8 pasos (con imágenes)
El altavoz Bluetooth más pequeño del mundo de las piezas antiguas: si le gustó este proyecto, considere votar por él para ganar el concurso Trash to Treasure aquí: https://www.instructables.com/contest/trashytreasure2020/ En este instructivo, aprenderá cómo hacer un altavoz bluetooth casero ultrapequeño que pac
La linterna recargable más diminuta del mundo (ultrabrillante): 4 pasos
La linterna recargable más diminuta del mundo (ultrabrillante): Hola chicos, me encanta trabajar con leds, así que en este tutorial les mostraré cómo construir la linterna recargable más diminuta. Las dimensiones de esta linterna son aproximadamente 14 × 12 × 10 mm. Usé leds Piranha que son Ultrabrillantes y no se calientan
¡Voltearlo! - ¿El juego más tonto del mundo ?: 7 pasos (con imágenes)
¡Voltearlo! - ¿El juego más tonto del mundo ?: Orígenes: este es un juego que desarrollé durante un par de años 2018-2019. Originalmente se llamaba " Stupid Flip " y surgió de mi interés en crear juegos interactivos simples y divertidos que también pudieran usarse para enseñar codificación. Esto es sobre
TinyPi: el dispositivo de juego basado en Raspberry Pi más pequeño del mundo: 8 pasos (con imágenes)
TinyPi: el dispositivo de juegos basado en Raspberry Pi más pequeño del mundo: así que he estado jugando con la fabricación de PCB personalizados para Raspberry Pi durante un tiempo, y lo que comenzó como una broma se convirtió en un desafío para ver cuán pequeño podía llegar a ser. , se basa en una Raspberry Pi Zero y casi encaja dentro de la sa