Juego de picas y fijas con arduino

Publicado el: 20 de julio de 2019
Principiante
Acerca de este proyecto
Consiste en descubrir en 5 intentos el numero secreto de 4 cifras que genera el arduino al azar.
arduino juegos
Publicidad
DETALLES

Tambien conocido como picas y fijas en algunos paises, es un juego que tradicionalmente se juega con lapiz y papel y consiste en adivinar el numero secreto de 4 cifras (no repetidas entre si) que ha pensado el contrincante. El jugador oponente intenta adivinar el numero de su rival a traves de una serie de pistas que este le brinda: si una de las cifras se encuentra en la misma posicion, significa una fama, si el numero contiene una cifra pero en una posicion distinta, se menciona un punto.

Vamos a suponer que el n煤mero secreto a adivinar es el 5678.

N煤mero secreto:           5 6 7 8

N煤mero del jugador:    7 6 8 4

El jugador escribe el n煤mero 7684, por lo tanto, como el n煤mero 6 se encuentra en la misma posici贸n (segunda) del n煤mero secreto, obtendremos (1) fama (fija). El n煤mero 7 y el  tambi茅n est谩n presentes en el n煤mero secreto pero en una posici贸n distinta, de esta manera, obtendremos 2 puntos (picas).

Asi que el resultado ser铆a: (2) puntos y (1) fama.

Este juego se ha construido para jugar contra el arduino, que es el encargado de generar el numero de 4 cifras no repetidas entre si.

El jugador introduce sus 4 digitos a traves del teclado hexadecimal, presiona la tecla D para confirmar los digitos introducidos. La pantalla lcd visualiza la cantidad de puntos y famas obtenidos por cada intento. Si despues de cinco intentos (se puede configurar en el codigo la cantidad de intentos permitidos) no consigue adivinar el numer secreto, se muestra un mensaje en pantalla y finaliza el juego.

Al presionar la tecla A  se reinicia el juego.

Si se presiona la tecla B, se muestra el numero secreto y finaliza el juego.


LISTA DE COMPONENTES:

  • Arduino Uno o equivalente.
  • Teclado hexadecimal de 4x4
  • Display LCD de 16x 2
  • Potenciometro de 50k ohms.
  • Cables de conexion.

DIAGRAMA DEL PROYECTO


Diagrama esquematico

MONTAJE EN EL PROTOBOARD


VIDEO DE FUNCIONAMIENTO






CODIFICACI脫N
Codigo arduino punto y fama-
Este codigo asegura que las cifras generadas no se repitan entre si.
/* Juego de punto y fama para arduino
Realizado por: José Luis Bejarano Vásquez
Fecha: 12/02/2016
www.sistemasymicros.com.co
www.youtube.com/c/sistemasymicros1
@sistemasyymicros*/
#include <Keypad.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(7, 8, 9, 10, 11 , 12);

int aleatorio[4];
String numero_azar; //almacena las 4 cifras aleatorias
char cifra_jugador[4]; //Almacena el numero del jugador
String numero_jugador = String(); //Almacena las 4 cifras del jugador

String a1 = String(); //primera cifra del número secreto
String b1 = String(); //segunda cifra del número secreto
String c1 = String(); //tercera cifra del número secreto
String d1 = String(); //cuarta cifra del número secreto
String k = String();  //primera cifra del número jugador
String l = String(); //segunda cifra del número jugador
String m = String(); //tercera cifra del número jugador
String n = String(); //cuarta cifra del número jugador

int cuenta=0;
int i,j,x;
int puntos,famas=0;
int intentos=0;
int maximo_intentos=5;

const byte ROWS=4;
const byte COLS=4;
char keys[ROWS][COLS] = {
 {'1','2','3','A'},
 {'4','5','6','B'},
 {'7','8','9','C'},
 {'*','0','#','D'}
};
byte rowPins[ROWS] = {13,6,5,4}; //Filas(pines del 9 al 6)
byte colPins[COLS] = {3,2,1,0}; //Columnas (pines del 5 al 2)
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

//Verifica que no existan cifras repetidas
boolean verificar_duplicados(String palabra)
{
  for(i=0;i<=3;i++)
  {
      for(j=0;j<=3;j++)
      {
        if(i !=j)
        {
          if(palabra[i]==palabra[j])
          {
            return false;
            break;
          }
        }

      }
  }
        return true;  
}
//**************************************************************************************************
void inicio()
{
  lcd.clear();
  
  do
  {
    generar_aleatorio();
    
  } while(verificar_duplicados(numero_azar)!=true);
  
    lcd.setCursor(0,0);
    lcd.print("Digite un # de 4 cifras");
    intentos=0;
    puntos=0;
    famas=0;
}

//************************************************************************************************
void generar_aleatorio()
{
  
  for(x=0;x<=3;x++)
  {
    randomSeed(analogRead(analogRead(x)));
    
    aleatorio[x]=random(10);  //genera un número aleatorio entre 0 y 9
  }
   
   numero_azar = String(aleatorio[0])+String(aleatorio[1])+String(aleatorio[2]+String(aleatorio[3])); 
   
}
//************************************************************************************************
void ingresar()
{
  if(cuenta==4)  //Si tiene 4 dígitos
  {
     k=String(cifra_jugador[0]);
     l=String(cifra_jugador[1]);
     m=String(cifra_jugador[2]);
     n=String(cifra_jugador[3]);
      
    numero_jugador = k+l+m+n;
    
    if(verificar_duplicados(numero_jugador))  //Si no contiene duplicados llamo al procedimiento que compara los dígitos
    {
      comprobar();
    }
  
  }
  
  else
  
  {
    lcd.setCursor(0,0);
    lcd.print("Cifras incompletas");
    
  }
    
  cuenta=0;  
  
}
//********************************************************************
void comprobar()
 {
   a1=String(aleatorio[0]);
   b1=String(aleatorio[1]);
   c1=String(aleatorio[2]);
   d1=String(aleatorio[3]);
    
    if(a1==k)   {famas++;}
     
    if(b1==l)   {famas++;}
    
    if(c1==m)   {famas++;}
    
    if(d1==n)   {famas++;}
    
    if(a1==l || a1==m || a1==n) { puntos++;}
    if(b1==k || b1==m || b1==n) { puntos++;}
    if(c1==k || c1==l || c1==n) { puntos++;}
    if(d1==k || d1==l || d1==m) { puntos++;}
    
    
    intentos++;
    
        
    if(famas==4)
    {
      
      lcd.clear();
      lcd.print("Ganaste en: ");
      lcd.print(intentos);
      lcd.setCursor(0,1);
      lcd.print( "intentos");
      delay(2000);
      inicio();
      
    }
    
    actualizar_pantalla();  //Muestra la información en pantalla
    
    if(intentos==maximo_intentos)
    {
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.write("Has perdido, el");
      lcd.setCursor(0,1);
      lcd.print("numero era: ");
      lcd.print(a1);
      lcd.print(b1);
      lcd.print(c1);     
      lcd.print(d1);    
    }
    
    cuenta=0;
    puntos=0;
    famas=0;
    
  }

//*******************************************
void actualizar_pantalla()
{
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Puntos:");
    lcd.print(puntos);
    
    lcd.print(" Famas:");
    lcd.print(famas);
    
    lcd.setCursor(5,1);
    lcd.print("Intento:");
    lcd.print(intentos);
    lcd.print("/5");
    
    lcd.setCursor(0,1);
    lcd.blink();
}
//*******************************************
void setup() 
{
  lcd.begin(16, 2);
  inicio();
}

//*******************************************
void loop()
{
char key = keypad.getKey();

  if(key) 
  {
    switch (key)
    {
      case 'A':
      inicio();  //Inciar un nuevo juego
      break;
      
      case 'B':
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("Adios, el numero");
      lcd.setCursor(0,1);
      lcd.print("era el: ");
      lcd.print(numero_azar);
      break;
      
      case 'D':
      ingresar();  //Enter
      break;
      
    }
  }

  if(key) 
  {
    cifra_jugador[cuenta] = key;
    
    //Si la tecla presionada es un número (ignore las letras) 
    if(key!='A' && key!='B' && key!='C' && key!='D')
    {
      lcd.setCursor(0+cuenta,1);
      lcd.print(cifra_jugador[cuenta]);
     
      cuenta++;
    }
       
     
  }

}

Download me
Autor: sistemasymicros
25 proyectos 1 seguidores 0 siguiendo

Ingeniero en electronica, desarrollador de software. Desarrollo de proyectos con microcontroladores.

COMENTARIOS
Para publicar un comentario debes