Instrucciones
En esta actividad vamos a recrear el popular juego del dinosaurio de Google Chrome utilizando Arduino, una pantalla LCD y un pulsador. El objetivo es programar un juego simple, pero divertido en el que el jugador debe saltar obstáculos presionando el pulsador, mientras se muestra el puntaje en la pantalla LCD. Aprenderemos a usar los pines de entrada y salida de Arduino, y a programar la lógica del juego. ¡Prepárate para saltar y divertirte mientras aprendes a programar en Arduino!
Del mismo modo reutilizaremos la baquelita que se ha realizado en la primera actividad. ¡Empecemos! ➡️
Para entender programar como funciona el código del juego del dinosaurio en Chrome debemos tener en cuenta lo siguiente:
- Se incluyen las librerías LiquidCrystal.h, Wire.h y LiquidCrystal_I2C.h.
- Se crean ocho variables tipo byte que representan cada una de las partes gráficas del dinosaurio, las ramas y el ave.
- Se definen algunas variables para ser usadas durante el programa, tales como las coordenadas del dinosaurio y de las ramas, los periodos de tiempo, los contadores de puntos, entre otros.
- En la función setup se inicia la comunicación con el LCD, se definen los caracteres personalizados y se limpia la pantalla.
- En la función loop se establecen los retardos para los movimientos del dinosaurio y las ramas.
- Se limpia la pantalla y se muestran los caracteres que representan las partes gráficas del dinosaurio en la posición inicial.
- Se muestran las ramas y el ave en la posición inicial.
- Se lee el estado del botón y se detectan colisiones con las ramas y el ave.
- Se actualiza la posición de las ramas y el ave y se incrementa la velocidad del juego.
- Se actualizan los puntos y se muestran en el LCD.
A continuación, te mostramos el código ya comentado para que se pueda entender de una mejor manera:
#include <LiquidCrystal.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
byte DINO_PARADO_PARTE_1[8] = {B00000, B00000, B00010, B00010, B00011, B00011, B00001, B00001};
byte DINO_PARADO_PARTE_2[8] = {B00111, B00111, B00111, B00100, B11100, B11100, B11000, B01000};
byte DINO_PIE_DERE_PART_1[8] = {B00000, B00000, B00010, B00010, B00011, B00011, B00001, B00001};
byte DINO_PIE_DERE_PART_2[8] = {B00111, B00111, B00111, B00100, B11100, B11100, B11000, B00000};
byte DINO_PIE_IZQU_PART_1[8] = {B00000, B00000, B00010, B00010, B00011, B00011, B00001, B00000};
byte DINO_PIE_IZQU_PART_2[8] = {B00111, B00111, B00111, B00100, B11100, B11100, B11000, B01000};
byte DOS_RAMAS_PART_1[8] = {B00000, B00100, B00100, B10100, B10100, B11100, B00100, B00100};
byte DOS_RAMAS_PART_2[8] = {B00100, B00101, B00101, B10101, B11111, B00100, B00100, B00100};
byte AVE_ALAS_PART1[8] = {B00001, B00001, B00001, B00001, B01001, B11111, B00000, B00000};
byte AVE_ALAS_PART2[8] = {B00000, B10000, B11000, B11100, B11110, B11111, B00000, B00000};
//defino variables
int columna_dino1 = 1;
int columna_dino2 = 2;
int fila_dino = 1;
unsigned long reloj=0; //para usar la funcion millis envez de delay
int periodo=100; //es el periodo en milisegundo
int flag=1;
int fila_rama=0;
int columna_rama=13;
int periodo2=100;
unsigned long reloj2=0;
int a=0;
int b=1;
int c=2;
int d=0;
unsigned long reloj3=0;
int periodo3=100;
int puntos =0;
int punto2 =0;
int numerorandom=0;
int columnaave= 13;
int e=0;
int fila_ave=1;
int senalactual=0;
int senalantigua=0;
int f=13;
int aceleracion=1;
void setup() {
lcd.begin(16, 2);
lcd.createChar(0,DINO_PARADO_PARTE_1);
lcd.createChar(1,DINO_PARADO_PARTE_2);
lcd.createChar(2,DINO_PIE_DERE_PART_1);
lcd.createChar(3,DINO_PIE_DERE_PART_2);
lcd.createChar(4,DINO_PIE_IZQU_PART_1);
lcd.createChar(5,DINO_PIE_IZQU_PART_2);
lcd.createChar(6,DOS_RAMAS_PART_1);
lcd.createChar(7,DOS_RAMAS_PART_2);
}
void loop() {
if(millis()>reloj+periodo){ //retardo para el pies del dinosaurio
reloj=millis();
if(flag==1){
flag=2;
}
else if(flag==2){
flag=1;
}
}
if(millis()>reloj2+periodo2){ //retardo para la velocidad de las ramas
reloj2=millis();
columna_rama=columna_rama-1;
if(columna_rama<0){
columna_rama=13;
periodo2=periodo2-aceleracion;//aceleracion
numerorandom=random(0,3);//aca debe estar el random ya que es cada vez que regresa a la columna 13
}
f=columna_rama+1;
lcd.setCursor(f,1); //limpio abajo
lcd.print(" ");
f=columna_rama+1;
lcd.setCursor(f,0); //limpio arriba
lcd.print(" ");
lcd.setCursor(0,1); //limpio arriba
lcd.print(" ");
lcd.setCursor(0, 0);
lcd.print(" ");
a=1;
}
if(d==0){
if(flag==1){
lcd.setCursor(columna_dino1,fila_dino);
lcd.write(byte(2));
lcd.setCursor(columna_dino2,fila_dino);
lcd.write(byte(3));
}
if(flag==2){
lcd.setCursor(columna_dino1,fila_dino);
lcd.write(byte(4));
lcd.setCursor(columna_dino2,fila_dino);
lcd.write(byte(5));
}
}
if(a==1){
if(numerorandom == 1){
fila_rama = 1;
lcd.createChar(6,DOS_RAMAS_PART_1);
lcd.setCursor(columna_rama,fila_rama);
lcd.write(byte(6));
}
else if(numerorandom == 2){
fila_rama = 1;
lcd.createChar(7,DOS_RAMAS_PART_2);
lcd.setCursor(columna_rama,fila_rama);
lcd.write(byte(7));
}
else{ //esta es la parte del ave
columnaave=columna_rama;
columnaave=columnaave-1;
fila_rama = 0;
lcd.createChar(6,AVE_ALAS_PART1);
lcd.setCursor(columnaave,fila_rama);
lcd.write(byte(6));
lcd.createChar(7,AVE_ALAS_PART2);
lcd.setCursor(columna_rama,fila_rama); //columna rama porque debe estar a la izquierda de columan eve
lcd.write(byte(7));
}
a=0;
}
//generamos condiciones al chocar
if(digitalRead(13)==HIGH && (columna_rama==1||columna_rama==2||columnaave==1||columnaave==2) && fila_rama==0 ){
lcd.clear();
lcd.setCursor(5, 0);
lcd.print("GAME OVER");
delay(2000);
lcd.clear();
columna_rama=15;
periodo2=100;
puntos=0;
punto2=0;
periodo2=100;
}
if((columna_rama==b||columna_rama==c) && fila_rama==1){ //condicion de la rama
lcd.clear();
lcd.setCursor(5, 0);
lcd.print("GAME OVER");
delay(2000);
lcd.clear();
columna_rama=15;
periodo2=100;
puntos=0;
puntos=2;
periodo2=100;
}
//condicion del ave
// lcd.clear();
// //lcd.setCursor(5, 0);
//lcd.print("GAME OVER");
// delay(2000);
// lcd.clear();
// columna_rama=15;
// periodo2=100;
// fila_rama=1;
//saltar al presionar pulsador púlsador
if(digitalRead(13)==HIGH){
b=50; //a bc lo pongo un valor mayor a 15 para que no coincida con el movimiento de la columna
c=50;
if(d==0){
lcd.setCursor(0, 1); // LIMPIA ABAJO
lcd.print(" ");
}
d=1;
lcd.setCursor(columna_dino1,0);
lcd.write(byte(2));
lcd.setCursor(columna_dino2,0);
lcd.write(byte(3));
}
else{
b=1; //que regrese a su valor de inicio
c=2;
// lcd.setCursor(0, 0);
//lcd.print(" ");
d=0;
}
//creamos otro retardo para los puntos
if(millis()>reloj3+periodo3){ //reatrdo para los puntos acumulados
reloj3=millis();
lcd.setCursor(14, 1);
lcd.print(puntos);
//if(b==50){ // el que solo cuente cuando esta en el piso es opcional
// }
//else{
puntos=puntos+1;
//}
if(puntos==100){
puntos=0;
punto2=punto2+1;
if(punto2==100){
punto2=0;}
}
}
lcd.setCursor(14, 1);
lcd.print(puntos);
lcd.setCursor(14, 0);
lcd.print(punto2);
//detector de cambio de estado
senalactual=digitalRead(13);
if (senalactual != senalantigua)
{
lcd.setCursor(1, 0);
lcd.print(" ");
}
senalantigua = senalactual;
}
#include <LiquidCrystal.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
byte DINO_PARADO_PARTE_1[8] = {B00000, B00000, B00010, B00010, B00011, B00011, B00001, B00001};
byte DINO_PARADO_PARTE_2[8] = {B00111, B00111, B00111, B00100, B11100, B11100, B11000, B01000};
byte DINO_PIE_DERE_PART_1[8] = {B00000, B00000, B00010, B00010, B00011, B00011, B00001, B00001};
byte DINO_PIE_DERE_PART_2[8] = {B00111, B00111, B00111, B00100, B11100, B11100, B11000, B00000};
byte DINO_PIE_IZQU_PART_1[8] = {B00000, B00000, B00010, B00010, B00011, B00011, B00001, B00000};
byte DINO_PIE_IZQU_PART_2[8] = {B00111, B00111, B00111, B00100, B11100, B11100, B11000, B01000};
byte DOS_RAMAS_PART_1[8] = {B00000, B00100, B00100, B10100, B10100, B11100, B00100, B00100};
byte DOS_RAMAS_PART_2[8] = {B00100, B00101, B00101, B10101, B11111, B00100, B00100, B00100};
byte AVE_ALAS_PART1[8] = {B00001, B00001, B00001, B00001, B01001, B11111, B00000, B00000};
byte AVE_ALAS_PART2[8] = {B00000, B10000, B11000, B11100, B11110, B11111, B00000, B00000};
//defino variables
int columna_dino1 = 1;
int columna_dino2 = 2;
int fila_dino = 1;
unsigned long reloj=0; //para usar la funcion millis envez de delay
int periodo=100; //es el periodo en milisegundo
int flag=1;
int fila_rama=0;
int columna_rama=13;
int periodo2=100;
unsigned long reloj2=0;
int a=0;
int b=1;
int c=2;
int d=0;
unsigned long reloj3=0;
int periodo3=100;
int puntos =0;
int punto2 =0;
int numerorandom=0;
int columnaave= 13;
int e=0;
int fila_ave=1;
int senalactual=0;
int senalantigua=0;
int f=13;
int aceleracion=1;
void setup() {
lcd.begin(16, 2);
lcd.createChar(0,DINO_PARADO_PARTE_1);
lcd.createChar(1,DINO_PARADO_PARTE_2);
lcd.createChar(2,DINO_PIE_DERE_PART_1);
lcd.createChar(3,DINO_PIE_DERE_PART_2);
lcd.createChar(4,DINO_PIE_IZQU_PART_1);
lcd.createChar(5,DINO_PIE_IZQU_PART_2);
lcd.createChar(6,DOS_RAMAS_PART_1);
lcd.createChar(7,DOS_RAMAS_PART_2);
}
void loop() {
if(millis()>reloj+periodo){ //retardo para el pies del dinosaurio
reloj=millis();
if(flag==1){
flag=2;
}
else if(flag==2){
flag=1;
}
}
if(millis()>reloj2+periodo2){ //retardo para la velocidad de las ramas
reloj2=millis();
columna_rama=columna_rama-1;
if(columna_rama<0){
columna_rama=13;
periodo2=periodo2-aceleracion;//aceleracion
numerorandom=random(0,3);//aca debe estar el random ya que es cada vez que regresa a la columna 13
}
f=columna_rama+1;
lcd.setCursor(f,1); //limpio abajo
lcd.print(" ");
f=columna_rama+1;
lcd.setCursor(f,0); //limpio arriba
lcd.print(" ");
lcd.setCursor(0,1); //limpio arriba
lcd.print(" ");
lcd.setCursor(0, 0);
lcd.print(" ");
a=1;
}
if(d==0){
if(flag==1){
lcd.setCursor(columna_dino1,fila_dino);
lcd.write(byte(2));
lcd.setCursor(columna_dino2,fila_dino);
lcd.write(byte(3));
}
if(flag==2){
lcd.setCursor(columna_dino1,fila_dino);
lcd.write(byte(4));
lcd.setCursor(columna_dino2,fila_dino);
lcd.write(byte(5));
}
}
if(a==1){
if(numerorandom == 1){
fila_rama = 1;
lcd.createChar(6,DOS_RAMAS_PART_1);
lcd.setCursor(columna_rama,fila_rama);
lcd.write(byte(6));
}
else if(numerorandom == 2){
fila_rama = 1;
lcd.createChar(7,DOS_RAMAS_PART_2);
lcd.setCursor(columna_rama,fila_rama);
lcd.write(byte(7));
}
else{ //esta es la parte del ave
columnaave=columna_rama;
columnaave=columnaave-1;
fila_rama = 0;
lcd.createChar(6,AVE_ALAS_PART1);
lcd.setCursor(columnaave,fila_rama);
lcd.write(byte(6));
lcd.createChar(7,AVE_ALAS_PART2);
lcd.setCursor(columna_rama,fila_rama); //columna rama porque debe estar a la izquierda de columan eve
lcd.write(byte(7));
}
a=0;
}
//generamos condiciones al chocar
if(digitalRead(13)==HIGH && (columna_rama==1||columna_rama==2||columnaave==1||columnaave==2) && fila_rama==0 ){
lcd.clear();
lcd.setCursor(5, 0);
lcd.print("GAME OVER");
delay(2000);
lcd.clear();
columna_rama=15;
periodo2=100;
puntos=0;
punto2=0;
periodo2=100;
}
if((columna_rama==b||columna_rama==c) && fila_rama==1){ //condicion de la rama
lcd.clear();
lcd.setCursor(5, 0);
lcd.print("GAME OVER");
delay(2000);
lcd.clear();
columna_rama=15;
periodo2=100;
puntos=0;
puntos=2;
periodo2=100;
}
//condicion del ave
// lcd.clear();
// //lcd.setCursor(5, 0);
//lcd.print("GAME OVER");
// delay(2000);
// lcd.clear();
// columna_rama=15;
// periodo2=100;
// fila_rama=1;
//saltar al presionar pulsador púlsador
if(digitalRead(13)==HIGH){
b=50; //a bc lo pongo un valor mayor a 15 para que no coincida con el movimiento de la columna
c=50;
if(d==0){
lcd.setCursor(0, 1); // LIMPIA ABAJO
lcd.print(" ");
}
d=1;
lcd.setCursor(columna_dino1,0);
lcd.write(byte(2));
lcd.setCursor(columna_dino2,0);
lcd.write(byte(3));
}
else{
b=1; //que regrese a su valor de inicio
c=2;
// lcd.setCursor(0, 0);
//lcd.print(" ");
d=0;
}
//creamos otro retardo para los puntos
if(millis()>reloj3+periodo3){ //reatrdo para los puntos acumulados
reloj3=millis();
lcd.setCursor(14, 1);
lcd.print(puntos);
//if(b==50){ // el que solo cuente cuando esta en el piso es opcional
// }
//else{
puntos=puntos+1;
//}
if(puntos==100){
puntos=0;
punto2=punto2+1;
if(punto2==100){
punto2=0;}
}
}
lcd.setCursor(14, 1);
lcd.print(puntos);
lcd.setCursor(14, 0);
lcd.print(punto2);
//detector de cambio de estado
senalactual=digitalRead(13);
if (senalactual != senalantigua)
{
lcd.setCursor(1, 0);
lcd.print(" ");
}
senalantigua = senalactual;
}
El juego del dinosaurio con Arduino, pantalla LCD 16x2 y un pulsador es un proyecto divertido y educativo que combina programación, electrónica y creatividad. A través de la construcción de este juego, se pueden aprender conceptos importantes como la programación de microcontroladores, el uso de sensores y pantallas, y el diseño de interacciones con el usuario. Además, este proyecto puede ser personalizado y mejorado para adaptarse a diferentes niveles de habilidad y necesidades.
En definitiva, construir un juego del dinosaurio con Arduino y otros componentes electrónicos es una excelente manera de fomentar la curiosidad y la creatividad en cualquier persona interesada en la tecnología y la electrónica.
Desarrollo
Para el desarrollo de igual forma puedes primeramente realizarlo en tinkercad: