Es un punto de partida, para crear tu propio rpg siguiendo el esquema. Con diversos ejemplos de uso.
Solo deberas poner en tu Breadboard: 1 LCD, 1 Potenciometro de 10K y 3 botones.
Adjunto el código:
#include <LiquidCrystal.h> //importar libreria
LiquidCrystal lcd(8,7,6,5,4,3,2); //crear el objeto con los pines que se van a usar
int i = 0; //i es posición en el texto entero
int buton1 = 22;
int buton2 = 23;
int buton3 = 24;
boolean buton1Pressed = false;
boolean buton2Pressed = false;
boolean buton3Pressed = false;
int delayAfterButton = 160;
int paso = 0;
int pasoAnterior = 0;
String raza = "NINGUNA";
String maestria ="NINGUNA";
int nivel = 1;
char* mensajesLargos;
String muerte = "ESTAS MUERTO!";
int oro = 0;
String resultado = "";
const String ELFO = "ELFO";
const String HUMANO = "HUMANO";
const String ENANO = "ENANO";
const String GUERRERO = "GUERRERO";
const String MAGO = "MAGO";
const String LADRON = "LADRON";
const String CLERIGO = "CLERIGO";
// USO:
//lcd.setCursor(0, 1);
//char *mensaje = " HOLA DESCONOCIDO. SOY UN ROBOT CREADO POR XIFRE. PUEDO SER MUY UTIL. ";
//mensajeLargo(mensaje, 0); // mensajeLargo(mensaje, 1);
void mensajeLargo(char* texto, int fila) {
lcd.setCursor(0, fila);
for (int j = i; j <= i+15; j++) { //j es posicion en el LCD
lcd.print(texto[j]); //llamar el array mensaje para que imprima los 16 caracters que le correspondan
}
i++; //incrementar i en 1 cada vez que se imprima
permetEscoltarBotonsEnDelay(350); //delay para controlar velocidad desplazamiento
if (i >= strlen(texto) - 16){ //si i es mayor o igual al largo del mensaje completo
i = 0; //volver i a 0
}
}
void permetEscoltarBotonsEnDelay(int milis) {
for (int i=0; i<milis; i++) {
if (digitalRead(buton1) == HIGH) {
delay(delayAfterButton);
i = i+delayAfterButton;
buton1Pressed = true;
}
if (digitalRead(buton2) == HIGH) {
delay(delayAfterButton);
i = i+delayAfterButton;
buton2Pressed = true;
}
if (digitalRead(buton3) == HIGH) {
delay(delayAfterButton);
i = i+delayAfterButton;
buton3Pressed = true;
}
delay(1);
}
}
boolean B1Clicked() {
if (digitalRead(buton1) == HIGH || buton1Pressed) {
i=0;
if (!buton1Pressed) {
delay(delayAfterButton);
} else {
buton1Pressed = false;
}
return true;
} else {
return false;
}
}
boolean B2Clicked() {
if (digitalRead(buton2) == HIGH || buton2Pressed) {
if (!buton2Pressed) {
delay(delayAfterButton);
} else {
buton2Pressed = false;
}
return true;
} else {
return false;
}
}
boolean B3Clicked() {
if (digitalRead(buton3) == HIGH || buton3Pressed) {
if (!buton3Pressed) {
delay(delayAfterButton);
} else {
buton3Pressed = false;
}
return true;
} else {
return false;
}
}
//USO:
//rellenarLCD("HOLA HUMANO!");
void rellenarLCD(String arriba) {
lcd.clear();
lcd.setCursor(0, 0); //colocar el cursor en la columna 0 fila 0
lcd.print(arriba);
}
//USO:
//rellenarLCD("HOLA HUMANO!", "PULSA EL BOTON 1");
void rellenarLCD(String arriba, String abajo) {
rellenarLCD(arriba);
lcd.setCursor(0, 1); //colocar el cursor en la columna 0 fila 1
lcd.print(abajo);
}
void setup() {
Serial.begin(9600);
lcd.begin (16, 2); // inicializar la pantalla con la cantidad de fila y columna que esta tiene
pinMode(buton1, INPUT);
pinMode(buton2, INPUT);
pinMode(buton3, INPUT);
}
void loop() {
Serial.print("PASO: ");
Serial.println(paso);
Serial.print("RAZA: ");
Serial.println(raza);
Serial.print("MAESTRIA: ");
Serial.println(maestria);
switch (paso) {
case 0:
rellenarLCD("HOLA CRIATURA!", "PULSA EL BOTON 1");
paso = 1;
break;
case 1:
if (B1Clicked()) {
paso = 2;
}
break;
case 2:
rellenarLCD("ELIGE TU RAZA:");
paso = 3;
break;
case 3:
mensajeLargo(" B1: ELFO, B2: HUMANO, B3: ENANO ", 1);
if (B1Clicked()) {
raza = ELFO;
paso = 4;
}
if (B2Clicked()) {
raza = HUMANO;
paso = 4;
}
if (B3Clicked()) {
raza = ENANO;
paso = 4;
}
break;
case 4:
rellenarLCD("BUENAS "+raza, "PULSA B1...");
paso = 5;
break;
case 5:
if (B1Clicked()) {
paso = 6;
}
break;
case 6:
rellenarLCD("ELIGE TU MAESTRIA:");
if (raza == ENANO) {
mensajesLargos = " B1: GUERRERO, B2: CLERIGO ";
} else if (raza == HUMANO) {
mensajesLargos = " B1: GUERRERO, B2: CLERIGO, B3: LADRON ";
} else {
mensajesLargos = " B1: CLERIGO, B2: MAGO, B3: LADRON ";
}
paso = 7;
break;
case 7:
mensajeLargo(mensajesLargos, 1);
if (B1Clicked()) {
if ((raza == ENANO) || (raza == HUMANO)){
maestria = GUERRERO;
} else {
maestria = CLERIGO;
}
paso = 8;
}
if (B2Clicked()) {
if ((raza == ENANO) || (raza == HUMANO)){
maestria = CLERIGO;
} else {
maestria = MAGO;
}
paso = 8;
}
if (B3Clicked()) {;
if ((raza == HUMANO) || (raza == ELFO)){
maestria = LADRON;
paso = 8;
}
}
break;
case 8:
rellenarLCD(raza+" "+maestria, "Nv "+String(nivel)+" PULSA B1...");
paso = 9;
break;
case 9:
if (B1Clicked()) {
paso = 10;
}
break;
case 10:
rellenarLCD("ESTAS EN BOSQUE", "SALE UN GOBLIN..");
paso = 11;
break;
case 11:
if (B1Clicked()) {
paso = 12;
}
break;
case 12:
rellenarLCD("ACCIONES:");
paso = 13;
break;
case 13:
mensajeLargo(" B1: ATACAR, B2: HUIR, B3: TIMAR ", 1);
if (B1Clicked()) {
if (maestria!=GUERRERO) {
muerte = "GOBLIN TE MATA";
paso = 99;
} else {
resultado = "GANAS 1 Nv + 5MO";
oro = oro +5;
nivel = nivel + 1;
paso = 14;
}
}
if (B2Clicked()) {
if (raza == ENANO) {
muerte = "GOBLIN TE MATA";
paso = 99;
} else {
resultado = "HUYES CORRIENDO";
paso = 14;
}
}
if (B3Clicked()) {
if (maestria!=LADRON) {
muerte = "GOBLIN TE MATA";
paso = 99;
} else {
resultado = "ROBAS 10 MON. ORO";
oro = oro +10;
paso = 14;
}
}
break;
case 14:
rellenarLCD(resultado, "Nv "+String(nivel)+ " Oro: "+String(oro));
paso = 15;
break;
case 15:
if (B1Clicked()) {
paso = 16;
}
break;
case 16:
rellenarLCD("ESTAS EN BOSQUE");
paso = 17;
break;
case 17:
mensajeLargo(" ENCUENTRAS HIERBAS DE MUCHOS TIPOS EN EL CAMINO ", 1);
if (B1Clicked()) {
paso = 18;
}
break;
case 18:
rellenarLCD("BUSCAR HIERBAS:");
paso = 19;
break;
case 19:
mensajeLargo(" B1: REVITALIZAR, B2: HECHIZOS, B3: NO SABES DE HIERBAS... ", 1);
if (B1Clicked()) {
if (maestria==GUERRERO) {
muerte = "MUERTE X VENENO";
paso = 99;
} else {
resultado = "GANAS 1 Nv";
nivel = nivel + 1;
paso = 20;
}
}
if (B2Clicked()) {
if (maestria != MAGO) {
resultado = "NO SABES DE ESO";
} else {
nivel = nivel + 2;
resultado = "GANAS 2 Nv";
}
paso = 20;
}
if (B3Clicked()) {
resultado = "MEJOR NO TOCAR";
paso = 20;
}
break;
case 20:
rellenarLCD(resultado, "Nv "+String(nivel)+ " Oro: "+String(oro));
paso = 21;
break;
case 99:
rellenarLCD(muerte, "Nv "+String(nivel)+ " Oro: "+String(oro));
break;
default:
// statements
break;
}
}