Crear juego RPG con LCD1602 y 3 botones

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;
    }
}

V 2.0

LCD1602_Xif.ino (10.1 KB)

Perdona pero es una pregunta, un tutorial, un pedido de colaboración?
No esta claro que esperas del foro?

Compartir software, por si a alguien le gusta la idea y quiere disponer del código. Sin mucho más.

Perfecto, adelante entonces!!

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.