Yosef Guevara Salamanca
/
Brick_game_1
Selecciona los juegos
Diff: brick.cpp
- 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