Skip to content

Instantly share code, notes, and snippets.

@parzibyte
Created February 9, 2018 22:11
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save parzibyte/c8bf2890b2ca1e72d214858f6a95b556 to your computer and use it in GitHub Desktop.
Save parzibyte/c8bf2890b2ca1e72d214858f6a95b556 to your computer and use it in GitHub Desktop.
#include <LiquidCrystal_I2C.h>
#define DISPARO_NO_ACERTADO '*'
#define DISPARO_ACERTADO '_'
#define AGUA ' '
#define FRAGATA_1 'A'
#define FRAGATA_2 'B'
#define DESTRUCTOR_1 'C'
#define DESTRUCTOR_2 'D'
#define ACORAZADO_1 'E'
#define SUBMARINO_1 'F'
#define PORTA_AVIONES_1 'G'
#define BARCO_IMPRIMIBLE '#'
#define DEBERIA_IMPRIMIR_LETRAS false
#define DIRECCION_LCD 0x3F //Recuerda cambiar esta dirección, para obtener la tuya visita https://parzibyte.me/blog/2018/02/02/obtener-direccion-modulo-i2c-lcd-arduino/
#define ALTURA_LCD 2
#define ANCHURA_LCD 16
LiquidCrystal_I2C lcd(DIRECCION_LCD, ANCHURA_LCD, ALTURA_LCD);
char escenario[ANCHURA_LCD][ALTURA_LCD];
/**
Llena el arreglo de agua, pues al inicio no hay nada más que el océano o mar, o lo que sea;
es decir, le pone espacios vacíos.
Revisar la constante AGUA para entender mejor.
*/
void vaciarEscenario() {
for (int x = 0; x < ANCHURA_LCD; x++)
for (int y = 0; y < ALTURA_LCD; y++)
escenario[x][y] = AGUA;
}
/*
Encapsular las rutinas de la LCD en un método.
Simplemente iniciamos, la encendemos y la limpiamos
*/
void prepararLcd() {
lcd.init();
lcd.backlight();
lcd.clear();
}
/**
El método que se encarga de convertir el arreglo en datos
visibles al usuario. Por favor, leer esto:
La constante DEBERIA_IMPRIMIR_LETRAS es para, como su nombre lo dice,
mostrar o no letras en la LCD. ¿Por qué? como se ve, cada barco
está representado por una constante cuyo valor es una A, B, C, etcétera.
Pero esas letras están pensadas para los programadores, es decir, para nosotros.
Así podremos probar mejor la ubicación y la definición de cada barco.
Entonces, si la constante está en true, se imprimirán las letras verdaderas, algo "feo"
para el usuario final pero útil para nosotros.
De esta forma, se mostrarán letras en la LCD. Pero si la ponemos en false, se mostrarán #
o la constante que definamos en BARCO_IMPRIMIBLE porque al usuario final sólo le importa saber
que hay un barco ahí, independientemente de su tipo.
En cambio, a nosotros no, ya que dentro del código tenemos que saber a cuál barco le han disparado y
todas esas cosas.
TL;DR
Si estás probando, establece DEBERIA_IMPRIMIR_LETRAS en true
Si ya probaste todo y el juego funciona, establece DEBERIA_IMPRIMIR_LETRAS en false
*/
void dibujarEscenario() {
lcd.clear();
for (int x = 0; x < ANCHURA_LCD; x++) {
for (int y = 0; y < ALTURA_LCD; y++) {
lcd.setCursor(x, y);
/*
Ubicar el cursor de la LCD en la posición del arreglo
Comparar el valor de cada barco y dependiendo de ello imprimir el carácter.
Por ejemplo, si es agua entonces no imprime nada.
En cambio, si es un barco imprime el barco
También imprime los disparos acertados o no acertados, cosa que veremos más
adelante
*/
if (DEBERIA_IMPRIMIR_LETRAS) {
switch (escenario[x][y]) {
case FRAGATA_1:
lcd.print(FRAGATA_1);
break;
case FRAGATA_2:
lcd.print(FRAGATA_2);
break;
case DESTRUCTOR_1:
lcd.print(DESTRUCTOR_1);
break;
case DESTRUCTOR_2:
lcd.print(DESTRUCTOR_2);
break;
case ACORAZADO_1:
lcd.print(ACORAZADO_1);
break;
case SUBMARINO_1:
lcd.print(SUBMARINO_1);
break;
case PORTA_AVIONES_1:
lcd.print(PORTA_AVIONES_1);
break;
case AGUA:
lcd.print(AGUA);
break;
case DISPARO_NO_ACERTADO:
case DISPARO_ACERTADO:
lcd.print(DISPARO_NO_ACERTADO);
break;
}
} else {
switch (escenario[x][y]) {
case FRAGATA_1:
case FRAGATA_2:
case DESTRUCTOR_1:
case DESTRUCTOR_2:
case ACORAZADO_1:
case SUBMARINO_1:
case PORTA_AVIONES_1:
lcd.print(BARCO_IMPRIMIBLE);
break;
case AGUA:
lcd.print(AGUA);
break;
case DISPARO_NO_ACERTADO:
case DISPARO_ACERTADO:
lcd.print(DISPARO_NO_ACERTADO);
break;
}
}
}
}
}
void setup() {
prepararLcd();
vaciarEscenario();
dibujarEscenario();
}
void loop() {
/*
Nada por aquí, pues el juego se ejecuta una vez y comienza de nuevo solamente al reiniciar el Arduino.
Se siente bien no hacer nada en el loop
*/
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment