#include <MD_MAX72xx.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include "sprites.h"
//Definimos el funcionamiento de las matrices
#define HARDWARE_TYPE MD_MAX72XX::PAROLA_HW
#define MAX_DEVICES 2
#define CLK_PIN 18 // or SCK
#define DATA_PIN 23 // or MOSI
#define CS_PIN 5 // or SS
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
// SPI hardware interface
MD_MAX72XX mx = MD_MAX72XX(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
// ==== Definiendo los Botones y los valores del juego ====
//Gpios 6, 7, 8, 9, 10 y 11 no son aptos para el uso de ESP32
// botones
int boton1 = 12;
int boton2 = 14;
int boton3 = 27;
int boton4 = 26;
int boton5 = 25;
int seleccion;
int seleccionrdn;
// Variable de control de loop while
bool run = true;
String texto = "";
int hori = 0;
int ver = 20;
// Definimos la eleccion del jugador y Arduino a cero.
String eleccionJugador = "vacio";
String eleccionArduino = "vacio";
// Definimos las varibles para hacer funcionar los 8x8
int sprite;
int matriz;
int jgana = 0;
int mgana = 0;
int jpuntos = 0;
int mpuntos = 0;
void setup() {
// Inicializamos las matrices
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println("SSD1306 allocation failed");
for(;;);
}
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,20);
display.println("Hola mundo!!!!!");
display.display();
mx.begin();
//Definimos el brillo
mx.control(0, MD_MAX72XX::INTENSITY, 8); //Ponemos la matrix 0 a brillo 15
mx.control(1, MD_MAX72XX::INTENSITY, 8); //Ponemos la matrix 1 a brillo 0
//mx.control(0, 1, MD_MAX72XX::TEST, true);
// Modo Input en los pulsadores
pinMode(boton1, INPUT_PULLUP);
pinMode(boton2, INPUT_PULLUP);
pinMode(boton3, INPUT_PULLUP);
pinMode(boton4, INPUT_PULLUP);
pinMode(boton5, INPUT_PULLUP);
randomSeed(analogRead(A0));
//Activando la comunicación Serial
Serial.begin(115200);
Serial.println("Comunicacion establecida con exito");
// mensaje de bienvenida
Serial.println("Bienvenido Humano! Es hora de jugar a -- Piedra papel tijeras lagarto Spock --");
Serial.println("Tiempo de elegir. Presiona un boton");
drawRows0(interrogante1);
texto ="Piedra, Papel, tijera, lagarto spock";
lcd(texto, 0, 0);
}
void loop() {
// Loop de control
while (run == true) {
// === ELECCIÓN ARDUINO ===
// la elección de Arduino es un numero al azar entre 1 y 5.
int eleccionRandom = random(1, 6);
// convertir ese numero en la cadena de texto correpondiente
// continuamente hasta que el jugador humano haga su elección.
if (eleccionRandom == 1) {
// Arduino elige piedra
eleccionArduino = "piedra";
seleccionrdn = 1;
//figuras (seleccionrdn, 1);
Serial.println("piedra");
drawRows1(piedra);
} else if ( eleccionRandom == 2 ) {
// Arduino elige papel
eleccionArduino = "papel";
Serial.println("Papel");
seleccionrdn = 2;
//figuras (seleccionrdn, 1);
drawRows1(papel);
} else if ( eleccionRandom == 3 ) {
// Arduino elige tijeras
eleccionArduino = "tijeras";
seleccionrdn = 3;
//figuras (seleccionrdn, 1);
Serial.println("Tijeras");
drawRows1(tijera);
} else if ( seleccionrdn == 4 ) {
// Arduino elige lagarto
eleccionArduino = "lagarto";
seleccionrdn = 4;
//figuras (seleccionrdn, 1);
Serial.println("lagarto");
drawRows1(lagarto);
} else if ( eleccionRandom == 5 ) {
// Arduino elige Spock
eleccionArduino = "spock";
seleccionrdn = 5;
//figuras (seleccionrdn, 1);
drawRows1(spock);
Serial.println("spock");
} else {
// Si el valor se sale de lo esperado... avisamos al usuario.
Serial.println("Arduino es un tramposo! Arregla su codigo");
}
//DebugMode
#ifdef DEBUGMODE
Serial.println("Arduino elige: " + String(eleccionArduino));
#endif
// === ELECCIÓN DEL JUGADOR Y RESOLUCCIÓN DE LA PARTIDA ===
// Aqui esperamos a que el jugador haya decidido antes de evaluar resultados. (SINO PASA AL -> ELSE() {} -- linea 239)
if (eleccionJugador != "vacio") {
// Resolución en caso de empate.
if (eleccionJugador == eleccionArduino) {
Serial.print("Empate! " + String(eleccionJugador) + " no gana a " + String(eleccionArduino));
delay(50);
run = false; // Para el Loop While y con ello todo dentro de Loop().
//--------- Si el jugador es piedra
} else if ( eleccionJugador == "piedra") {
}
// Piedra gana a tijeras.
if (eleccionArduino == "tijeras") {
Serial.print("Jugador Gana! ...piedra aplasta las tijeras");
delay(50);
jgana = 1;
mgana = 0;
run = false;
// Piedra gana a lagarto.
} else if ( eleccionArduino == "lagarto") {
Serial.print("Jugador Gana! ...piedra aplasta al lagarto");
delay(50);
jgana = 1;
mgana = 0;
run = false;
// Piedra pierde con papel.
} else if ( eleccionArduino == "papel") {
Serial.print("Jugador Pierde! ...papel cubre a la piedra");
delay(50);
jgana = 0;
mgana = 1;
run = false;
// Piedra pierde con spock.
} else if ( eleccionArduino == "spock") {
Serial.print("Jugador Pierde! ....Spock vaporiza la piedra");
delay(50);
jgana = 0;
mgana = 1;
run = false;
}
// -----------------Si el jugador es papel.
} else if ( eleccionJugador == "papel" ) {
// Papel gana a piedra.
if ( eleccionArduino == "piedra") {
Serial.print("Jugador Gana! ...papel cubre a la piedra");
jgana = 1;
mgana = 0;
delay(50);
run = false;
// Papel gana a spock.
} else if (eleccionArduino == "spock") {
Serial.print("Jugador Gana! ...papel refuta a Spock");
delay(50);
jgana = 1;
mgana = 0;
run = false;
// Papel pierde con tijeras.
} else if (eleccionArduino == "tijeras") {
Serial.print("Jugador Pierde! ...tijeras cortan el papel");
delay(50);
jgana = 0;
mgana = 1;
run = false;
// Papel pierde con lagarto.
} else if (eleccionArduino == "lagarto") {
Serial.print("Jugador Pierde! ...lagarto se come el papel");
delay(50);
jgana = 0;
mgana = 1;
run = false;
}
// -------------------Si el jugador es tijeras.
} else if ( eleccionJugador == "tijeras") {
// tijeras gana a papel.
if (eleccionArduino == "papel") {
Serial.print("Jugador Gana! ...tijeras cortan el papel");
delay(50);
jgana = 1;
mgana = 0;
run = false;
// tijeras gana a lagarto.
} else if (eleccionArduino == "lagarto") {
Serial.print("Jugador Gana! ...tijeras decapitan al lagarto");
delay(50);
jgana = 1;
mgana = 0;
run = false;
// tijeras pierde con piedra.
} else if (eleccionArduino == "piedra") {
Serial.print("Jugador Pierde! ...piedra aplasta las tijeras");
delay(50);
jgana = 0;
mgana = 1;
run = false;
// tijeras pierde con spock.
} else if (eleccionArduino == "spock") {
Serial.print("Jugador Pierde! ...Spock destroza las tijeras");
delay(50);
jgana = 0;
mgana = 1;
run = false;
}
//----------------- Si el jugador es lagarto.
} else if ( eleccionJugador == "lagarto") {
// Lagarto gana a spock.
if (eleccionArduino == "spock") {
Serial.print("Jugador Gana! ...lagarto envenena a Spock");
delay(50);
jgana = 1;
mgana = 0;
run = false;
// Lagarto gana a papel.
} else if ( eleccionArduino == "papel") {
Serial.print("Jugador Gana! ...lagarto se come el papel");
delay(50);
jgana = 1;
mgana = 0;
run = false;
// Lagarto pierde con piedra.
} else if ( eleccionArduino == "piedra") {
Serial.print("Jugador Pierde! ...piedra aplasta al lagarto");
delay(50);
jgana = 0;
mgana = 1;
run = false;
// Lagarto pierde con tijeras.
} else if (eleccionArduino == "tijeras") {
Serial.print("Jugador Pierde! ...tijeras decapitan al lagarto");
delay(50);
jgana = 0;
mgana = 1;
run = false;
}
//--------------- Si el jugador es Spock.
} else if ( eleccionJugador == "spock") {
// Spock gana a tijeras.
if ( eleccionArduino == "tijeras") {
Serial.print("Jugador Gana! ...Spock destroza las tijeras");
delay(50);
jgana = 1;
mgana = 0;
run = false;
// Spock gana a piedra.
} else if ( eleccionArduino == "piedra") {
Serial.print("Jugador Gana! ...Spock vaporiza la piedra");
delay(50);
jgana = 1;
mgana = 0;
run = false;
// Spock pierde con papel.
} else if (eleccionArduino == "papel") {
Serial.print("Jugador Pierde! ...papel refuta a Spock");
delay(50);
jgana = 0;
mgana = 1;
run = false;
// Spock pierde con lagarto.
} else if (eleccionArduino == "lagarto") {
Serial.print("Jugador Pierde! ...lagarto envenena a Spock");
delay(50);
jgana = 0;
mgana = 1;
run = false;
}
// ==== AQUI SE DEFINE LA ELECCIÓN DEL JUGADOR ====
} else {
delay(50);
// El jugador define su elección a traves de los 5 botones.
if (digitalRead(boton1) == LOW) {
eleccionJugador = "piedra";
seleccion = 1;
} else if (digitalRead(boton2) == LOW) {
eleccionJugador = "papel";
seleccion = 2;
} else if (digitalRead(boton3) == LOW) {
eleccionJugador = "tijeras";
seleccion = 3;
} else if (digitalRead(boton4) == LOW) {
eleccionJugador = "lagarto";
seleccion = 4;
} else if (digitalRead(boton5) == LOW) {
eleccionJugador = "spock";
seleccion = 5;
}
} // Fin del condiccional (eleccionJugador != "vacio")
} // While
// Se muestra la elección del jugador en dos tipos, si gana o pierde.
//if (jgana == 1){
if (seleccion == 1) {
if (jgana == 1) {
lcd("Ganas", 5, 10);
drawRows0(piedra);
delay(300);
drawRows0(piedra2);
delay(300);
jpuntos++;
} else {
lcd("Pierdes", 5, 10);
drawRows0(piedra);
}
}
if (seleccion == 2) {
if (jgana == 1) {
drawRows0(papel);
delay(300);
drawRows0(papel2);
delay(300);
jpuntos++;
} else {
drawRows0(papel);
}
}
if (seleccion == 3) {
if (jgana == 1) {
drawRows0(tijera);
delay(300);
drawRows0(tijera2);
delay(300);
jpuntos++;
} else {
drawRows0(tijera);
}
}
if (seleccion == 4) {
if (jgana == 1) {
drawRows0(lagarto);
delay(300);
drawRows0(lagarto2);
delay(300);
jpuntos++;
} else {
drawRows0(lagarto);
}
}
if (seleccion == 5) {
if (jgana == 1) {
drawRows0(spock);
delay(300);
drawRows0(spock2);
delay(300);
jpuntos++;
} else {
drawRows0(spock);
}
//}
}
// se muestra la elección del arduino en dos tipos, si gana o pierde.
if (seleccionrdn == 1) {
if (mgana == 1) {
drawRows1(piedra);
delay(300);
drawRows1(piedra2);
delay(300);
mpuntos++;
} else {
drawRows1(piedra);
}
}
if (seleccionrdn == 2) {
if (mgana == 1) {
drawRows1(papel);
delay(300);
drawRows1(papel2);
delay(300);
mpuntos++;
} else {
drawRows1(papel);
}
}
if (seleccionrdn == 3) {
if (mgana == 1) {
drawRows1(tijera);
delay(300);
drawRows1(tijera2);
delay(300);
jpuntos++;
} else {
drawRows1(tijera);
}
}
if (seleccionrdn == 4) {
if (mgana == 1) {
drawRows1(lagarto);
delay(300);
drawRows1(lagarto2);
delay(300);
jpuntos++;
} else {
drawRows1(lagarto);
}
}
if (seleccionrdn == 5) {
if (mgana == 1) {
drawRows1(spock);
delay(300);
drawRows1(spock2);
delay(300);
jpuntos++;
} else {
drawRows1(spock);
}
}
} //Loop()
//funciones para mostrar los sprites
void drawRows0( const byte fig[] ) {
for ( int i = 0; i < 8; i++ ) {
mx.setRow(0, i, fig[i]);//Matriz 1
//mx.setRow(0, i, fig[i]);//Matriz 2
}
}
void drawRows1( const byte fig[] ) {
for ( int i = 0; i < 8; i++ ) {
mx.setRow(1, i, fig[i]);//Matriz 1
//mx.setRow(0, i, fig[i]);//Matriz 2
}
}
void lcd(String texto, int hori, int ver){
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(hori,ver);
display.println(texto);
display.display();
}