TETRIS FINAL

Dependencies:   mbed

Tetris.cpp

Committer:
djinn77
Date:
2018-11-16
Revision:
3:f61db70f1f7c
Parent:
2:cee98cfbd679

File content as of revision 3:f61db70f1f7c:

#include "mbed.h"
#include "piezas.h"
//#define DEBUG 1
 
//Establecimiento de la comunicacion
Serial pc(USBTX,USBRX);  
SPI deviceM(PB_5, PB_4, PB_3);  // D4(gris), Ninguno, D3(azul)
//SPI deviceM(PB_15, PB_14, PB_13);  
DigitalOut ssel (PA_4);         // A2(morado)
//DigitalOut ssel (PB_12);

//Delcaracion de botones

// InterruptIn pulsador_izq(A5);
// InterruptIn pulsador_der(A4);
// DigitalIn p_giro(A3);
// DigitalIn obligar_bajar(A0);

// Definiendo Botones
 
AnalogIn vry(A3);               // Lee el eje x del jostick
AnalogIn vrx(A4);               // Lee el eje y del jostick
InterruptIn pulsador_abj(D8);               // Lee el boton del jostick

//Declaracion de funciones
void inicializar();
void sendSPI(uint8_t d1, uint8_t d2);
void captura_datos();
void read();
void desplazar();
void captura_matriz();
void desplazar_izq();
void desplazar_der();
void aum_velocidad();
void perder();
uint16_t* girar(uint16_t* pieza, int posicion);
// Declaracion de variables 
int8_t posicion= 0, figura= 0, giro= 0;
uint16_t memoria[8]={0};
uint16_t* imprimir;
uint16_t *borde=0;
int8_t corrimiento=0;
float meas_vx;
float meas_vy;
float velocidad=1.0;
// Delcaraion de limites
int8_t liminf=0, limizq=0, limder=0;
// Habilitadores
int enableizq=1;
int enableder=1;
int bajando=1;
 
void debuging(char*s,...){
    
    #if DEBUG
    pc.printf(s);
    #endif
    
    }
 
// FUNCION EL CUAL ENVIA EL DATO JUNTO CON LA DIRECCION DE LA COLUMNA CORRESPONDIENTE AL PRIMER  DISPOSITIVO
void sendSPI(uint8_t d1, uint8_t d2)
{
    deviceM.unlock();
    ssel=0;            // SELECCIONA EL PRIMER DISPOSOTIVO
    deviceM.write(d1); // ESCRIBE EL ADDRESS
    deviceM.write(d2); // ESCRIBE EL DATA
    ssel=1;
    deviceM.lock();
};
 
 
int main() {
    inicializar(); // Inicializa el programa para establecer los modos de trabajo liminosidad
    while(1){
            captura_datos(); // Inicia la lectura de la informacion
            perder();
            }
}
 
void captura_datos(){
         
         pc.baud(38400); //Inicializa la velocidad de comunicacion
         //-----------------------------------------
         char inicio=0,final=0;
         figura=0;
         giro=0;
         posicion=0;
         
         debuging("\n Ingrese el inicio del comando. ");
         inicio=pc.getc(); 
         debuging("\n Ingrese la Figura. ");
         figura=pc.getc();
         debuging("\n Seleccione el giro. ");
         giro=pc.getc();
         debuging("\n Seleccione la posicion. ");
         posicion=pc.getc(); 
         debuging("\n Ingrese el final del comando. ");
         final=pc.getc();   
         
        
          if(inicio!= '<' || final != '>'){
             
             debuging("\n Error en el comando.");
             
             }else{
                 
                 read();
                  
                 }
          //------------------------------------------------------
          
         /*//--------------------figuras con random------------------
          figura=0;
          giro=0;
          figura=rand()%5;
          giro=rand()%5;
          posicion=rand()%6;;
          read();
         *///--------------------------------------------------------
        
                 
         
 
    }
    
void inicializar(){ //INICIALIZA LA MATRIZ 
    
    sendSPI(0x0c,1);    
    sendSPI(0x0b,7);
    sendSPI(0x09,0);   
    sendSPI(0x0A,0x00); //SELECCIONA LA LUMINOSIDAD DE LA MATRIZ
    int i;
    for (i=0;i<2;i++){
        sendSPI(0x0F,1);
        wait (0.5);
        sendSPI(0x0f,0);
        wait (0.5);
    }
    
    for (int j= 1; j<=8;j++){  // limpia la pantalla al encenderce o reiniarcea asi 
                               //no quedan leds encendidos cuando se ejecute el programa nuevamente
          
          sendSPI(j, 0x00);    //pone cada columna y vecto en blanco al inicializar
                            } 
    }
    
 void read(){
         
         switch(figura){ //Este switch escoje la figura con que trabajaar
             case 0: // L
             if(giro == 0)
             imprimir =  PZA_L,liminf=7, limizq=6, limder=0;
             if(giro == 1)
             imprimir =  PZA_LDN,liminf=7, limizq=5, limder=0;
             if(giro == 2)
             imprimir =  PZA_LDO,liminf=7, limizq=5, limder=-1;
             if(giro == 3)
             imprimir =  PZA_LDD,liminf=8, limizq=5, limder=0;
             break;
             case 1://T       
             if(giro == 0)
             imprimir =  PZA_T,liminf=8, limizq=5, limder=0;
             if(giro == 1)
             imprimir =  PZA_TN,liminf=7, limizq=6, limder=0;
             if(giro == 2)
             imprimir =  PZA_TO,liminf=7, limizq=5, limder=0;
             if(giro == 3)
             imprimir =  PZA_TD,liminf=7, limizq=5, limder=-1;
             break;
             case 2://I
             if(giro == 0 || giro == 2)
             imprimir =  PZA_I,liminf=7, limizq=6, limder=-1;
             if(giro == 1 || giro == 3)
             imprimir =  PZA_IR,liminf=8, limizq=5, limder=0;
             break;
             case 3://Cuadrado
             if(giro == 0 || giro == 1 || giro == 2 || giro == 3)
             imprimir =  PZA_C,liminf=8, limizq=6, limder=0;
             break;
             case 4:
             if(giro == 0 || giro == 2)
             imprimir =  PZA_Z,liminf=8, limizq=5, limder=0;
             if(giro == 1 || giro == 3)
             imprimir =  PZA_ZN,liminf=7, limizq=6, limder=0;
             break;
             default:
             imprimir = VACIO;
             break;
             }
            // pc.printf("\n limite inferior read %d\n ",liminf);
             desplazar();
     }    
  void desplazar(){
      
      uint16_t desplazamiento[8]={0};      // Inicia un vector auxiliar con solo Ceros
      int j= 0;
       for(int i=posicion; i<(posicion+3);i++){  // Inicia un vector auxiliar con solo Ceros
           desplazamiento[i]=imprimir[j]; // Alamcena los nuevos datos tomados en el vector 
           j++;                    
                          }
       imprimir=desplazamiento;
       captura_matriz();
      }  
      
void captura_matriz(){
    
int i=0; // inicia el contador i en 0
int enable=1;
enableizq=1;
enableder=1;
bajando=1;
velocidad=1.0;
 while(enable){ //se encarga de desplazar los bits dentro del vector
    //pc.printf("\n1- conteo del corriemiento:\n %d",i);
    corrimiento=i;
    int j=1;  // inicia el contador j en 1 
     
    while(j<=8){ //se encarga de seleccionar que posicion del vector imprimira
         
         sendSPI(j, memoria[j-1]|(imprimir[j-1]>>i));  //Imprime el resultado de aplicar OR a la memoria y al desplamamiento de imprimir
         //wait(0.1); // Activar este wait para pruebas de desplazamiento y captura de los datos
 
     if(i==liminf || (memoria[j-1]&(imprimir[j-1]>>i+1))!=0){  //Detiene el desplazamiento cuando los bits tocan fondo, 
         enable=0;// desabilitador del ciclo while 
         bajando=0;
         for(int k=0; k<8;k++){                          // Almacena todos lo datos del vector en la posicion que corrimiento en la memoria
              memoria[k]= memoria[k]|(imprimir[k]>>i);
             }
    
         }
     j++;
     } 
     wait(velocidad); // espera para tomar el otro valor de lectura
     // ----------------------Lectura del jostick-----------------------------
     
     meas_vx = vrx.read() * 3300; // Convierte el valor de lectura de la entrada entre 0-3300 eje X
     meas_vy = vry.read() * 3300; // Convierte el valor de lectura de la entrada entre 0-3300 eje Y
     
     //------ realiza el corriemiento del vector hacia la izq y der respectivamente.
  
 
  if (meas_vx > 1700 && (posicion < limizq))           // si se cumple esta condicion el jugador se desplaza a la izq
      desplazar_izq(),i--; 
  else if (meas_vx < 1600 && (posicion > limder))      // si se cumple esta condicion el jugador se desplaza a la der
      desplazar_der();
      

     //-----------------------Giro de la pieza--------------------------------
     
     if(meas_vy > 1700 || meas_vy < 1600){
           giro++;       
           if(giro ==4){
               giro=0;
               }
           switch(figura){
             case 0: // L
             if(giro == 0)
             imprimir= girar(PZA_L, posicion),liminf=7, limizq=6, limder=0,i--;
             if(giro == 1)
             imprimir= girar(PZA_LDN, posicion),liminf=7, limizq=5, limder=0,i--;
             if(giro == 2)
             imprimir= girar(PZA_LDO, posicion),liminf=7, limizq=5, limder=-1,i--;
             if(giro == 3)
             imprimir=girar(PZA_LDD, posicion),liminf=8, limizq=5, limder=0,i--;
             break;
             case 1://T       
             if(giro == 0)
             imprimir= girar(PZA_T, posicion),liminf=8, limizq=5, limder=0,i--;
             if(giro == 1)
             imprimir= girar(PZA_TN, posicion),liminf=7, limizq=6, limder=0,i--;
             if(giro == 2)
             imprimir= girar(PZA_TO, posicion),liminf=7, limizq=5, limder=0,i--;
             if(giro == 3)
             imprimir= girar(PZA_TD, posicion),liminf=7, limizq=5, limder=-1,i--;
             break;
             case 2://I
             if(giro == 0 || giro == 2)
             imprimir= girar(PZA_I, posicion),liminf=7, limizq=6, limder=-1,i--;
             if(giro == 1 || giro == 3)
             imprimir=girar(PZA_IR, posicion),liminf=8, limizq=5, limder=0,i--;
             break;
             case 3://Cuadrado
             if(giro == 0 || giro == 1 || giro == 2 || giro == 3)
             imprimir= girar(PZA_C, posicion),liminf=8, limizq=6, limder=0,i--;
             break;   
             case 4: //Z
             if(giro == 0 || giro == 2)
             imprimir= girar(PZA_Z, posicion),liminf=8, limizq=5, limder=0,i--;
             if(giro == 1 || giro == 3)
             imprimir= girar(PZA_ZN, posicion),liminf=7, limizq=6, limder=0,i--;
             break;
 
             }

             }
     
     //---------------------------------------------------------------
     pulsador_abj.fall(&aum_velocidad);

     i++;
     }
 
  }
  
  void desplazar_izq(){
     
      if(posicion<limizq & corrimiento<liminf & enableizq){
          posicion++;
          
            for(int i=7; i >=0; i--){
                imprimir[i]=imprimir[i-1];
                if(i==0){
                    imprimir[i]=0;
                    
                    } 
                if((memoria[i+1] & (imprimir[i]>>corrimiento))!=0){
                    enableizq=0;
                    }      
                            
                }
            for(int j=1;j<=8;j++){
             sendSPI(j, memoria[j-1]|(imprimir[j-1]>>corrimiento));
 
                 }   
            wait(1.0);  
          
          }
      return;
      }
      
  void desplazar_der(){
      if(posicion>limder & corrimiento<liminf & enableder & bajando){
           posicion--;
           
            for(int i=0; i <8; i++){
                int der =(memoria[i+1] & (imprimir[i]>>corrimiento));
                imprimir[i]=imprimir[i+1];
                if(i==7){
                    imprimir[i]=0;
                    
                    }
                if((memoria[i-1] & (imprimir[i]>>corrimiento))!=0){
                    enableder=0;
                    pc.printf("\n multisder en :%d\n ",der);
                    pc.printf("\n derecho:%d\n ",enableder);
                    }     
                }    
            for(int j=1;j<=8;j++){
                 sendSPI(j, memoria[j-1]|(imprimir[j-1]>>corrimiento));
                 }   
            wait(1.0); 
      }
      return;
     
  } 
      
  uint16_t* girar(uint16_t* pieza, int posicion){
     uint16_t desplazamiento[8]={0};                      
     int j= 0;
     for(int i=posicion; i<(posicion+3);i++){  // Inicia un vector auxiliar con solo Ceros
     desplazamiento[i]=pieza[j]; // Alamcena los nuevos datos tomados en el vector 
     j++;                    
     }
    
    return desplazamiento;
    }
    
 void perder(){
     for(int i=0; i<8;i++){                          // Almacena todos lo datos del vector en la posicion que corrimiento en la memoria
        borde= &memoria[i];
        if(*borde>255){
          NVIC_SystemReset();
          }
        }
    }  
    
 void  aum_velocidad(){
     velocidad=0.2;
     }