![](/media/cache/profiles/kHsmpCWw_400x400.png.50x50_q85.png)
TETRIS FINAL
Diff: Tetris.cpp
- Revision:
- 0:f15eccb70d1d
- Child:
- 1:f9ff8e1c3244
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Tetris.cpp Fri Nov 16 01:16:46 2018 +0000 @@ -0,0 +1,345 @@ +#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 +DigitalIn sw(A5); // 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 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; + +// 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; +float 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(); + 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 < 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; + + } + + } + + //--------------------------------------------------------------- + if(meas_vy > 1700){ + velocidad=0.2; + } + i++; + } + + } + + void desplazar_izq(){ + posicion++; + + for(int i=7; i >=0; i--){ + imprimir[i]=imprimir[i-1]; + if(i==0){ + imprimir[i]=0; + } + } + return; + } + + void desplazar_der(){ + posicion--; + for(int i=0; i <8; i++){ + imprimir[i]=imprimir[i+1]; + if(i==7){ + imprimir[i]=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(); + } + } + } \ No newline at end of file