Juego de velocidad matemática con arduino

Publicado el: 22 de junio de 2019
Principiante
Acerca de este proyecto
Descubre que tan rápido eres para resolver operaciones matemáticas con este proyecto que usa arduino, un teclado hexa y un display LCD.
arduino juegos
Publicidad
DETALLES

Que tan rápido eres para resolver operaciones matemáticas básicas? Ponte a prueba con este sencillo proyecto para practicar y poner a prueba tus habilidades.

Tiene 3 niveles: fácil, intermedio y difícil.

En el nivel básico se muestran operaciones con cifras del 1 al 10.

En el nivel intermedio, el primer operando es del 50 al 99, mientras que el segundo operando va del 1 al 10.

Y en el nivel difícil ambos operandos son cifras del 50 al 99.

El nivel de dificultad se selecciona al iniciar el juego, luego las operaciones (suma, resta, multiplicación y división) son generadas de manera aleatoria y se muestra en pantalla el tiempo transcurrido (minutos, segundos y centésimas de segundos).

Solo presione el resultado, en caso de ser correcto se muestra la siguiente operación, si el resultado es incorrecto, se muestra una carita triste en pantalla y se permite corregir dicho resultado.


LISTA DE MATERIALES

  • Tarjeta arduino Uno o equivalente.
  • Teclado hexadecimal.
  • Display LCD de 16x2
  • Potenciometro de 50k ohms.
  • Cables de conexión.

DIAGRAMA ESQUEMÁTICO

Diagrama
Protoboard

VIDEO DE FUNCIONAMIENTO






Descargar código aca.


CODIFICACIÓN
Codigo arduino-

/* Speed Game made realizado José Luis Bejarano Vásquez
http://www.youtube.com/c/sistemasymicros1 */

#include <Keypad.h> //  Libreria para el manejo del teclado
#include <LiquidCrystal.h>  //  Libreria para el manejo del display LCD

LiquidCrystal lcd(7, 8, 9, 10, 11 , 12);  //  Declaro los pines a utilizar en el LCD

//  Configuro la carita triste que aparece cuando pierdes el juego
byte sad[8] = {
  B00000,
  B01010,
  B01010,
  B00000,
  B00000,
  B01110,
  B10001,
};

unsigned long time=0;
unsigned long inicio=0;

int m, mu=0,md=0; //  Variables para los minutos,unidades de minutos,decenas de minutos              
int s, su=0,sd=0; //  Variables para los segundos,unidades de segundos,decenas de segundos
int c,cu,cd=0;    //  Variables para las centésimas de segundos, unidades de centésimas, décenas de centesimas
byte intento=0;   //  Variable que almacena la cantidad de intentos

char level;
boolean modePlay=false; //  Determina si estamos jugando o ya finalizó
int cifra_azar;

int numero1=0;
int numero2=0;
int numero3=0;
int temp=0;
int resultado;

String operando='';
String sResultado;
String sLevel;
int largo=0;
boolean activar=false;
boolean temporizar = false;


char cifra_jugador[4]; // Almacena el número del jugador

String numero_jugador = String(); //  Almacena las 4 cifras del jugador
String sNumero_jugador;


int cuenta=0;
int i,j,x;
int intentos=0;
int maximo_intentos=10; //  Configura el número máximo de intentos del juego

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


//  Función que se ejecuta cuando finaliza el juego al perder
void game_over()
{
  temporizar=false; //  Detenemos el temporizador
  modePlay=false;
  lcd.clear();
  lcd.setCursor(4,0);
  lcd.print('Game Over');
  lcd.setCursor(0,1);
  lcd.print('Tiempo: ');
  lcd.print(md);
  lcd.print(mu);
  lcd.print(':');
  lcd.print(sd);
  lcd.print(su); 
  lcd.print(':');
  lcd.print(cd);
  lcd.print(cu); 

}

void generate_random()
{
    lcd.clear();
    cuenta=0;
    sResultado='';
    sNumero_jugador='';
   
    randomSeed(analogRead(analogRead(0)));
    
    switch(level)
    {
      case '1':
  
       numero1=random(1,11);  //Generates a number between un número aleatorio entre 1 and 10
       numero2=random(1,11);  //Generates a number between un número aleatorio entre 1 and 10     
       break;

      case '2':
      
       numero1=random(50,100);  //Generates a number between un número aleatorio entre 50 and 99
       numero2=random(1,11);  //Generates a number between un número aleatorio entre 1 and 10
       break;

        
      case '3':
        
       numero1=random(50,100);  //Generates a number between un número aleatorio entre 50 y 99
       numero2=random(50,100);  //Generates a number between un número aleatorio entre 50 y 99  
       break;

      
    }    
    
    numero3=random(1,5);  //Generates a number between 1 and 4
    

    switch(numero3)
    {
      case 1:
        operando='+';
        resultado=numero1+numero2;
        break;
      case 2:
        operando='-';
          if(numero1<numero2)
          {
            temp=numero1;
            numero1=numero2;
            numero2=temp;
          }
        resultado=numero1-numero2;    
    
        break;
       case 3:
        operando='*';
        resultado=numero1*numero2;       
        break;
       case 4:
         operando='/';
         resultado=numero1%numero2;
         if(resultado!=0)  //If not is zero the mod
         {
           operando='*';
           resultado=numero1*numero2;       
         }
         else  //The mod is zero
         {
           resultado=numero1/numero2;
         }
    }
          
    sResultado=  String(resultado);
    
    lcd.setCursor(0,0);
    lcd.print(numero1);
    lcd.setCursor(2,0);
    lcd.print(operando);
    lcd.setCursor(3,0);
    lcd.print(numero2); 
    lcd.setCursor(12,1);
    lcd.print(cuenta);   

    lcd.setCursor(0,1);  
    lcd.print('    ');
    lcd.setCursor(0,1);  

     
}

void timer()
{
    
   if(modePlay==true)
   {
    time = millis()-inicio;  
    
    m=(time/1000)/60;                 //Minutos
    mu=m%10;                            
    md=(m-mu)/10;                       
       
    s=(time/1000)%60;                 //Segundos
    su=s%10;                            
    sd=(s-su)/10;
    
    c=(time/100)%60;
    cu=c%10;
    cd=(c-cu)/10;
    
    lcd.setCursor(8,0);
    lcd.print(md);
    lcd.print(mu);
    lcd.print(':');
    lcd.print(sd);
    lcd.print(su); 
    lcd.print(':');
    lcd.print(cd);
    lcd.print(cu); 
    
    
   }
   
}

void setup() 
  {
    
      lcd.createChar(1,sad); 
      lcd.begin(16, 2);    
      nivel();    //Visualiza el mensaje para seleccionar el nivel
  
  }
  
//********************************************************
void verificar()
{
  if(sNumero_jugador==sResultado)
  {  
    
    lcd.setCursor(6,0);
    lcd.print('G');

    intento=intento+1;    
    
    generate_random();
 
  }
 
  else
 
  {
   
    
    lcd.setCursor(0,1);   
    
    cuenta=0;
    
    sNumero_jugador='';
    
    lcd.setCursor(6,1);
    lcd.write(byte(1));  //Ointa la carita triste
   
   
  
  }
 
  
  lcd.setCursor(8,1);
  lcd.print('Try:');
  lcd.print(intento);
  lcd.print('/10');
  
  if(intento==maximo_intentos)
  {
    game_over();  //Finaliza el juego
  }

}

void nivel()
{
  modePlay=false;
  intento=0;
  lcd.clear();
  lcd.setCursor(1,0);
  lcd.print('Escoja el nivel');
  lcd.setCursor(0,1);
  lcd.print('1-F   2-M    3-D');

}

void conteo()
{
  lcd.clear();
  
  lcd.setCursor(4,0);
  
  lcd.print(sLevel);
  
  delay(300);
  
  lcd.clear();

  for(int x=3;x>=1;x--)
  {
  lcd.setCursor(8,0);
  
  lcd.print(x);
  
  delay(300);
  
  
  }
  
lcd.clear();

lcd.setCursor(7,0);
  
lcd.print('Go');

delay(600);


generate_random();
  
modePlay=true;
  
  if(activar==false)
    {
      inicio=millis();
      activar=true;
    }

}


void loop()
{
  timer();
  
  // put your main code here, to run repeatedly:

  
  char key = keypad.getKey();
  
  if(key)
 
  {   
    //If is the select level display
    if(modePlay==false)    
      {
        if(key=='1' || key=='2' || key=='3')
      {
          level=key;
          
          lcd.clear();
         
          lcd.setCursor(5,1);
  
          switch(level)
          {
            case '1':
              sLevel='Nivel fácil';              
              break;
            case '2':
              sLevel='NIvel medio';
              break;
            case '3':
              sLevel='Nivel díficil';
              break;
            
          } //end switch
   
          conteo();       

        } // end IF key select level
          
      } //end IF mode play off
      
      else
      //Mode player
      
      {
        
           temporizar=true;
        
           if(activar==false)
          {
            inicio=millis();
            activar=true;
            lcd.clear();
          }        
          
        
        if(key!='A' && key!='B' && key!='C' && key!='D')
       {
         
        cifra_jugador[cuenta] = key;
        
        numero_jugador = String(key);
        
        sNumero_jugador=sNumero_jugador+numero_jugador;
      
        lcd.setCursor(0+cuenta,1);
        
        lcd.print(cifra_jugador[cuenta]);
        
        cuenta++;                     
        
       largo=sResultado.length();
       
       if(cuenta==largo)
        {
  //        lcd.setCursor(10,1);
          verificar();
        }

         
       } //End if key!=   
      
        
      } // End else mode player
      
      
        if(key=='A')
        {  
          modePlay=false;
          inicio=millis();
          activar=false; 
          nivel(); 

        }
   
  }    //fin del si ciclo loop
 


} // Fin del loop


Autor: sistemasymicros
26 proyectos 6 seguidores 0 siguiendo

Ingeniero en electrónica. Maker, apasionado por la programación. Sigueme en sistemasymicros.

PROYECTOS RELACIONADOS
COMENTARIOS
Para publicar un comentario debes
COMENTARIOS
??
hace 2 meses

Hola, está bonito el proyecto. Te quiero hacer una pregunta: Las operaciones matemáticas son realmente aleatorias? Te lo pregunto pues traté una vez de hacer un dado electrónico y cuando prendía el arduino siempre hacía la misma secuencia de números. Estos se podría solucionar con alguna variable real, externa, fuera del arduino. Por ejemplo puede servir el tiempo que tarda el hacer la primera operación, o el valor del potenciómetro o algún tipo de sensor, que son baratos.

sistemasymicros
hace 5 meses

Daniel, ya está corregido el código. Reemplaza las comillas simples por comillas dobles en el código. De igual forma te anexé el enlace para la descarga del código. Gracias por tu comentario.

daniel
hace 5 meses

El código me da error en la declaración de librerías me podrían ayudar