Yosef Guevara Salamanca
/
Brick_game_1
Selecciona los juegos
brick.cpp
- Committer:
- djinn77
- Date:
- 2018-11-16
- Revision:
- 2:0c22820ab1d1
- Parent:
- 1:abc2af4246eb
- Child:
- 3:814ec214c941
File content as of revision 2:0c22820ab1d1:
#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) Ticker tp; int printjugador =1; // 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 DigitalIn sel(D7); PwmOut buzzer(A1); // Define numeros uint16_t* global_disp={0}; // Funciones de la pantalla principal void calle_funtion(); // funciones de cruzando la calle void printstatus_cll(); // Define el prototipo imprime el juego en pantalla void desplazar_der_cll(); // Define el prototipo que desplaza el jugador a la der void desplazar_izq_cll(); // Define el prototipo que desplaza el jugador a la izq void arriba_cll(); // Define el prototipo que desplaza el jugador hacia arriba void pista_cll(); // Define el prototipo void puntaje_cll(); // Define el prototipo que cuenta el puntaje void impresion(); // Define el prototipo 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; uint16_t* jugador; uint16_t* victorias; float velocidad = 1.0; float meas_vx; float meas_vy; uint8_t ubicacion; uint8_t conteo = 2; // Funciones pantalla principal void pantalla_pr(); void himno_legria(); void sendSPI(uint8_t d1, uint8_t d2) { deviceM.unlock(); ssel=0; deviceM.write(d1); deviceM.write(d2); ssel=1; deviceM.lock(); }; void inicializar_matriz(){ sendSPI(0x0c,1); sendSPI(0x0b,7); sendSPI(0x09,0); //SELECCIONA LA LUMINOSIDAD DE LA MATRIZ 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); } } void debuging(char*s,...){ #if DEBUG pc.printf(s); #endif } int main() { inicializar_matriz(); pc.baud(38400); while(1){ int selec_p=0; meas_vx = vrx.read() * 3300; // Convierte el valor de lectura de la entrada entre 0-3300 eje X if(meas_vx < 1600) global_disp = DOS, selec_p=2; else if (meas_vx < 1700) global_disp = SELEC, selec_p=0; else global_disp = UNO, selec_p=1; pantalla_pr(); if (selec_p==1 && sel==1) calle_funtion(); else if (selec_p==2 && sel==1) tetris(); else if (selec_p==0 && sel==1) himno_legria(); } } void pantalla_pr(){ for(int i= 1;i<=8;i++){ sendSPI(i, global_disp[i-1]); } } void calle_funtion(){ while(1){ nivel= AV_1; // Asigna el trasado de las calles al juego victorias=puntos; // Asigna los puntos acumulados en la pantalla inicia en 0 jugador=player; // Asigna la forma del jugador tp.attach(&printstatus_cll,0.2); // MIRAR para que sirve ubicacion=1; // Inicializa la varibale que cuenta la posicion del jugador while(1){ 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 < 1600) // si se cumple esta condicion el jugador se desplaza a la izq desplazar_izq_cll(); else if (meas_vx > 1700) // si se cumple esta condicion el jugador se desplaza a la der desplazar_der_cll(); //------ mueve a el jugador hacia arriba en el mapa if(meas_vy < 1550){ arriba_cll(); // hace el llamado a la funcion que mueve al jugador a la parte superior ubicacion++; // cada vez que se ejecuta actualiza la posicion del jugador en el mapa pc.printf("\n ubicacion:\n %i",ubicacion); // imprime la ubicacion del jugador en el puerto serial if(ubicacion==7) // si la posicion del jugador es igual a 7 ejecuta la funcion puntaje_cll(); puntaje_cll(); } // ----- El siguiente ciclo realiza el desplazamiento de los vehiculos pista_cll(); wait(velocidad); // Velocidad del juego } } } void desplazar_der_cll(){ // Esta funcion desplaza al jugador hacia la derecha int der = jugador[7]; for(int i= 7; i>=0;i--){ jugador[i]=jugador[i-1]; } jugador[0] = der; } void desplazar_izq_cll(){ // Esta funcion desplaza al jugador hacia la izq int izq = jugador[0]; for(int i= 0; i<8;i++){ jugador[i]=jugador[i+1]; } jugador[7] = izq; } void arriba_cll(){ // Esta funcion desplaza al jugador hacia arriba int arb = 1; for(int i= 0; i<8;i++){ jugador[i]= jugador[i] << arb; } arb++; } void pista_cll(){ // Esta funcion ejecuta el movimiento de los vehiculos int aux = nivel[0]; for(int i= 0; i<8;i++){ nivel[i]=nivel[i+1]; } nivel[7] = aux; } void puntaje_cll(){ // Esta funcion hace el conteo de los puntos ganados victorias[conteo]=0x80; // cada vez que se llega al otro lado de la calle suma 1 punto que se visualiza en pantalla for(int i= 0; i<8;i++){ // Este ciclo for regresa al jugador a la pos 1 jugador[i]= jugador[i] >> 6; } ubicacion=1; // Renicializa la pos del jugador conteo++; // Cuenta cuantas veces a llegado el jugador al otro lado hasta un maximo de 4 if(conteo == 6){ // cuando el conteo es igual a 6 se llama a la funcion aumentar dificultad aumentar_dificultad_cll(); } } void aumentar_dificultad_cll(){ // Esta funcion aumenta la dificultad del juego for(int i= 0; i<8;i++){ // Regresa el valor de las victorias acumuladas a 0 victorias[i]= 0; } velocidad = velocidad - 0.1; // aumenta la velocidad del juego conteo=2; // reinicializa el conteo } void reiniciar_calle(){ // Esta condicion renicia el sistema al estrellarce con un vehiculo NVIC_SystemReset(); } void printstatus_cll() // Esta funcion es la encargada de la impresion { for(int j= 1; j<=8;j++) // Este cilo imprime en pantalla if (printjugador){ sendSPI(j, nivel[j-1]|jugador[j-1]| victorias[j-1]); // CADA VEZ que se vea en pantalla SPI se mostrar un dato en pantalla if((nivel[j-1] & jugador[j-1]) != 0){ // SI este if se cumple el jugador ha sido chocado reiniciar_calle(); // Ee se hace llamado a la funcion reinicio } }else{ sendSPI(j, nivel[j-1]| victorias[j-1]); } printjugador =!printjugador; } 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; } void himno_legria(){ int i; buzzer=0.2; for (i=0; i<13; i++) { buzzer.period_us(periodos1[i]); wait(0.5*duracion1[i]); } for (i=0; i<13; i++) { buzzer.period_us(periodos2[i]); wait(0.5*duracion1[i]); } for (i=0; i<16; i++) { buzzer.period_us(periodos3[i]); wait(0.5*duracion2[i]); } }