Selecciona los juegos

Dependencies:   mbed

Revision:
1:abc2af4246eb
Parent:
0:6f394b1e3cf7
Child:
2:0c22820ab1d1
--- a/brick.cpp	Fri Nov 16 08:02:21 2018 +0000
+++ b/brick.cpp	Fri Nov 16 08:14:34 2018 +0000
@@ -2,6 +2,7 @@
 #include "mbed.h"
 #include "piezas.h"
 #include "avenidas.h"
+//#define DEBUG 1
 Serial pc(USBTX,USBRX);  
 SPI deviceM(PB_5, PB_4, PB_3);  // D4(gris), Ninguno, D3(azul)
 DigitalOut ssel (PA_4);         // A2(morado)
@@ -36,6 +37,35 @@
 void aumentar_dificultad_cll();     // Define el prototipo  que aumenta la velocidad de los vehiculos
 void reiniciar_calle();
 
+// funciones de tetris
+
+void captura_datos_tx();
+void read_tx();
+void desplazar_tx();
+void captura_matriz_tx();
+void desplazar_izq_tx();
+void desplazar_der_tx();
+void aum_velocidad_tx();
+void perder_tx();
+void tetris();
+
+uint16_t* girar(uint16_t* pieza, int posicion);
+// Declaracion de variables  tetris
+
+int8_t posicion= 0, figura= 0, giro= 0;
+uint16_t memoria[8]={0};
+uint16_t* imprimir;
+uint16_t *borde=0;
+int8_t corrimiento=0;
+// Delcaraion de limites variables  tetris
+
+int8_t liminf=0, limizq=0, limder=0;
+// Habilitadores variables  tetris
+
+int enableizq=1;
+int enableder=1;
+int bajando=1;
+
 // Definicion de Variables de la calle
  
 uint16_t* nivel;
@@ -77,6 +107,13 @@
   
   }
 
+void debuging(char*s,...){
+    
+    #if DEBUG
+    pc.printf(s);
+    #endif
+    
+    }
 
   
 int main() {
@@ -100,8 +137,8 @@
       
       if (selec_p==1 && sel==1)
           calle_funtion();
-          
-
+      else if (selec_p==2 && sel==1)    
+          tetris();
       
       }
       
@@ -250,4 +287,382 @@
                 }
              
     printjugador =!printjugador;
-}   
\ No newline at end of file
+} 
+
+
+void tetris(){
+     
+     for(int i= 1;i<=8;i++){
+          sendSPI(i, 0);
+          }
+          
+     while(1){
+            captura_datos_tx(); // Inicia la lectura de la informacion
+            perder_tx();
+            }
+    
+    }
+    
+void captura_datos_tx(){
+         
+        
+         //-----------------------------------------
+         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_tx();
+                  
+                 }
+          //------------------------------------------------------
+          
+         /*//--------------------figuras con random------------------
+          figura=0;
+          giro=0;
+          figura=rand()%5;
+          giro=rand()%5;
+          posicion=rand()%6;;
+          read_tx();
+         *///--------------------------------------------------------
+        
+                 
+         
+ 
+    }
+    
+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_tx(){
+         
+         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_tx();
+     }    
+  void desplazar_tx(){
+      
+      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_tx();
+      }  
+      
+void captura_matriz_tx(){
+    
+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);
+             }
+    
+     
+         }
+         
+     //--------------------------analisis de casillas completadas----------
+     
+     
+      int16_t MUL1 = memoria[0]& memoria[1]& memoria[2]& memoria[3];
+      int16_t MUL2 = memoria[4]& memoria[5]& memoria[6]& memoria[7];
+
+      
+      MUL1= MUL1&MUL2;
+      if(MUL1 != 0){
+      
+      //////////////////////////
+      sendSPI(1, 0);
+      sendSPI(2, 0);
+      sendSPI(3, 0);
+      sendSPI(4, MUL1);
+      sendSPI(5, 0);
+      sendSPI(6, 0);
+      sendSPI(7, 0);
+      sendSPI(8, 0);
+      wait(1.0);
+    ///////////////////////////////
+          
+      int16_t resta[8]={0};
+      
+      for(int ki=0; ki<=7;ki++){
+          
+          resta[ki]=memoria[ki]- MUL1;
+          
+          }
+
+      int n=0;
+      int cot=0b00000001;
+      
+      for(int l = 0; l<=7;l++){   
+        if((cot<<l & MUL1) !=0){
+            n++;
+            }
+        }
+        
+      for(int p= 1;p<=8;p++){
+          sendSPI(p, resta[p-1]);
+          
+          }
+       wait(2.0);
+      
+          
+      
+      for(int ii= 0;ii<=7;ii++){
+          
+          memoria[ii]=0;
+          memoria[ii]= resta[ii]>>n;
+
+          }
+          
+          }
+      
+     
+     
+     //-----------------------------------------------------------------
+     
+        
+     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_tx(),i--; 
+  else if (meas_vx < 1600 && (posicion > limder))      // si se cumple esta condicion el jugador se desplaza a la der
+      desplazar_der_tx();
+      
+
+     //-----------------------Giro de la pieza--------------------------------
+     
+     if(meas_vy > 1700){
+           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_tx);
+
+     i++;
+     }
+ 
+  }
+  
+  void desplazar_izq_tx(){
+     
+      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_tx(){
+      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_tx(){
+     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_tx(){
+     velocidad=0.2;
+     }  
\ No newline at end of file