Codigo con interfaz gráfica. Falta juntar los dos programas. Ya accede a ambos juegos

Dependencies:   mbed

main.cpp

Committer:
acastiblancoc
Date:
2018-11-22
Revision:
1:67d0c7d450e2
Parent:
0:aa4d235c4151
Child:
2:142a1071fcc7

File content as of revision 1:67d0c7d450e2:

#include "mbed.h"
#include "MPU6050.h"
#include "figs.h" 
Ticker bajar;
Serial command(USBTX,USBRX);
AnalogIn joy(A0);
AnalogIn joy1(A1); 
float vx=0;
float vy=0;
DigitalIn cambios(PB_8);
int cc=0, punto=1;
uint8_t movimiento=0;
float VEL= 500; 
uint8_t matrix_act [11]={0,0,0,0,0,0,0,0,0,0,0};   
uint8_t matrix_temp [8]={0,0,0,0,0,0,0,0};    
uint8_t matrix_temp1[8]={0,0,0,0,0,0,0,0};
uint8_t fila=1,cont=0,columna=1,rotacion=1,figura=0;
SPI deviceM(PB_15, PB_14, PB_13);
DigitalOut ssel (PB_12);
Serial a(USBTX,USBRX);
//Ticker cambio;
MPU6050 Wire(PB_9,PB_8);
InterruptIn iz(PA_14);
InterruptIn de(PA_13);
#define  uint8_t unsigned char
float q[3];
int pos;
float vel=200;
int b;
uint8_t cam[3]={0b01100000,0b00011000,0b00000110};
uint8_t Matr[9]={0,0,0,0,0,0,0,0,0};
uint8_t entorno={0b10000001};
uint8_t carro={0b00011000};
uint8_t obs=0b01100000;
void derecha();
void izquierda(); 
void colision();
void juego();
void accelerometro();
void cambio();
void vell();
void carro_juego();
int con;
int az;

void sendSPI(uint8_t d1, uint8_t d2)
{
    deviceM.unlock();
    ssel=0;
    deviceM.write(d1); 
    deviceM.write(d2);  
    ssel=1;
    deviceM.lock(); 
}
   
void borrar()
{
 for(int i;i<=8;i++)   {
     sendSPI(i,0);
     }
}
///////////////////////////////////////
void inicializar(){
                    a.baud(9600);
                    sendSPI(0x0c,1);
                    sendSPI(0x09,0);
                    sendSPI(0x0A,0x01);
                    sendSPI(0x0F,1);
                    wait (0.5);
                    sendSPI(0x0F,0);
                    wait(0.5);
                    sendSPI(0xB,0x7);    
                    borrar();
                    vel=200;
                    carro=0b00011000;
    }
//////////////////////////////////////////
void imprimir()
{
    int c_d; //carro, obstaculo y entorno
    int c_e; //carro y entorno
    int din;
    for(int i=1;i<=7;i++){
             sendSPI(i,entorno);
              }
   for(int j=1;j<=10;j++){
             din=(obs>>b) | entorno  ;
             c_d= carro | din;
             c_e=carro | entorno;
             sendSPI(8,c_e);
             if(j<=7){   
             sendSPI(j,din);
             }
             
             if(j>1 && j<=8)
             sendSPI(j-1,din);
                 
             if(j>2 && j<=9){
             sendSPI(j-2,entorno);
             }
             if(j>=8&&j<=9){
                 sendSPI(8,c_d);
                 }
             if(j>10){
                 sendSPI(8,c_e);
                 }
            
             if( (obs>>b)==carro && j==8 ){
               colision();
                 }
             accelerometro();
             cambio();
             wait_ms(vel);
    }
}
//////////////////////////////////////////
void carro_juego() {
     while(1){
     juego();        
        }
}
///////////////////////////////////////////
void juego(){
                    inicializar();   
                    //de.rise(&derecha);  
                    //iz.rise(&izquierda);  
                    a.printf("inicio\n");
                    while(1){
                    b=2*(rand()%3);
                    a.printf("umero %d\n",az);
                    imprimir();
                    vell();  
                    }
             }
///////////////////////////////////
void derecha()
{
    if(carro==0b00011000 || carro==0b01100000)
    carro=carro>>2;
    a.printf("entra der \n");
    return;
}
///////////////////////////////////
void izquierda()
{
    if( carro==0b00000110 ||  carro==0b00011000  )
    carro=carro<<2;
    a.printf("entra izq \n");
    return;
}
////////////////////////////////////
void cambio(){
    switch(az){
        case 1: carro = cam[0];break;
        case 2: carro = cam[1];break;
        case 3: carro = cam[2];break;
        default: break;}
    
    }
////////////////////////////////////
void colision ()
{
                 borrar();  
                 sendSPI(0x0F,0);
                 sendSPI(3,0b01111110);
                 sendSPI(4,0b01111110);
                 sendSPI(5,0b01111110);
                 sendSPI(6,0b01111110);
                 con=0;
                 vel=200;
                 wait(2);
                 juego();
}
/////////////////////////////////////
void accelerometro(){
         Wire.getAccelero(q);
         a.printf("accelero: \t x=  %f,\t y=  %f, \t z= %f \n",q[0],q[1],q[2]);
         int valor=q[1];
         if(valor<=(-4) && valor>=(-10)){
           az=1;}
         if(valor<(4) && valor>=(-4)){
           az=2;}
         if(valor<(10) && valor>=(4)){
           az=3;}
         a.printf("az : \t  %d \n",az);
    }
/////////////////////////////////////
void vell(){
    con++;
    if(con>2 && vel>=20)
    {
    vel=vel-(vel*0.2);
    }
    }
    
    /////////////////////////////////////////////////////////////////////////////////////
    
    
void init_display()
{
    sendSPI(0x0c,1);
    sendSPI(0x0b,7);
    sendSPI(0x09,0);
    sendSPI(0x0A,0x0E);
    int j;
    for (j=0;j<4;j++){
        sendSPI(0x0F,1);
        wait (0.2);
        sendSPI(0x0f,0);
        wait (0.2);
    }   
}

void copy_matrix(uint8_t a,uint8_t b,uint8_t c,uint8_t* fig,uint8_t columna)
{       
        if(((matrix_act[cont-2]& *(fig+c)>>columna-1)==0)&&((matrix_act[cont-1]& *(fig+b)>>columna-1)==0)&&((matrix_act[cont]& *(fig+a)>>columna-1)==0)){
                    matrix_temp[0]= *(fig+5)>>columna-1;             
                    matrix_temp[1]= *(fig+a)>>columna-1;            
                    matrix_temp[2]= *(fig+b)>>columna-1;
                    matrix_temp[3]= *(fig+c)>>columna-1;
        }   
}

void borraraa()            
{
    int i;
    for(i=0;i<=8;i++)
    {
        sendSPI(i,0);
        matrix_act[i]=0;   
    }
};

void game_over()
{
    uint8_t go [9]={0,0,0b01000010,0b00100100,0b00011000,0b00100100,0b01000010,0b00000000,0}; 
    int k,n;
    for(n=0;n<6;n++)
    {
    borraraa();
    for(k=1;k<=8;k++)
    {
    sendSPI(k,go[k]);
    }
    wait(0.2);
    borraraa();
    wait(0.2);
    }
    }
    

void buscar_fila(){
    for (uint8_t i=0;i<9;i++){                     
        if((matrix_act[i]& matrix_temp[3])==0){
        fila=i;
        }
        if(((matrix_act[i]& matrix_temp[3])!=0)&& (i!=9)){
        fila=i-1;  
        command.printf("Fila pos 1: %d \n", fila);                                
        i=9;
        }
        if(((matrix_act[i]& matrix_temp[2])!=0)&& (i!=9)){           
        fila=i;                                   
        i=9;
        command.printf("Fila pos 2: %d \n", fila);
        }
        if(((matrix_act[i]& matrix_temp[1])!=0)&& (i!=9)){
        fila=i+1;                                 
        i=9;
        command.printf("Fila pos 3: %d \n", fila);
        }
    }
    if(fila>8)
        fila=8;
    if(fila<=1){
        punto=1;
        VEL=500;
        wait_ms(VEL);
        game_over();
        borraraa();
        fila=8;
    }
};

void guardar(){
        matrix_act[fila-3]=matrix_temp1[0];
        matrix_act[fila-2]=matrix_temp1[1];
        matrix_act[fila-1]=matrix_temp1[2];
        matrix_act[fila  ]=matrix_temp1[3];
        };
    
void reada()
{    vx=0;
     vy=0;
     vx=joy.read();
     vy=joy1.read();
     cc=cambios.read();
    }
    
void bajaf()
{
    movimiento=4;}
void movimiento_fig(){
    reada();
    command.printf("vy = %f \n", vy);
    command.printf("vx = %f \n", vx);
    command.printf("cc = %f \n", cambios.read());
   if(vy<0.2)  
    movimiento=1;
    if(vy>0.8)  
    movimiento=4;
    if(vx<0.2)
    movimiento=3;
    if(vx>0.80) 
    movimiento=2;
    command.printf("movimiento = %d \n", movimiento);
    switch (movimiento){
                
                case 4:
                cont++;
                //printf("%f", joy.read());
                if(cont>8)cont=8;
                break;                                            
                
                case 1:
                if( (matrix_temp[1]==2) || (matrix_temp[1]==1)|| (matrix_temp[1]==3)) 
                columna--;
                rotacion++;
                if(rotacion>4)
                rotacion=1;
                break; 
                
                 case 2:
                if((matrix_temp[2]==7 || matrix_temp[3]==7)||(matrix_temp[2]==3 && matrix_temp[3]==6)) {
                    command.printf("a");
                    columna=6;
                    }
                else if((matrix_temp[1]==2 && matrix_temp[2]==2 && matrix_temp[3]==2)){
                    command.printf("b");
                    columna=8;
                    }
                else if (columna<7){
                    command.printf("c");
                    columna++;
                    }
                    //printf("%f", joy1.read());
                break;        
            
                case 3:
                columna--;
                if(columna<1)
                columna=1;
                //printf("%f", joy.read());
                break;                                       
                                                        
    }
    }


void print_matrix(uint8_t *temp){
            matrix_temp1[0]=(matrix_temp[0]+ matrix_act[cont-3]);
            matrix_temp1[1]=(matrix_temp[1]+ matrix_act[cont-2]);
            matrix_temp1[2]=(matrix_temp[2]+ matrix_act[cont-1]);
            matrix_temp1[3]=(matrix_temp[3]+ matrix_act[cont]);                              
            sendSPI(cont-3,matrix_temp1[0]);
            sendSPI(cont-2,matrix_temp1[1]);
            sendSPI(cont-1,matrix_temp1[2]);
            sendSPI(cont  ,matrix_temp1[3]);                     //pasa de i+2 a i+1
            if(punto%4==0)
            {
            VEL=VEL/3;
             if(VEL<=50)
             VEL=50;   
                }
            wait_ms(VEL);
}

void crear_fig(char type_fig,char rotacion,char columna)
{    
    switch (type_fig){                  
        case 1: if(columna>7)
                columna=7;
                copy_matrix(5,1,1,PLANT,columna); break;  
        
        case 2: if(rotacion==1 || rotacion==3)              
                copy_matrix(0,0,0,PLANT,columna);
                if(rotacion==2 || rotacion==4)
                copy_matrix(5,5,2,PLANT,columna);         
                break;
                  
        case 3: if(rotacion==1)
                copy_matrix(0,0,1,PLANT,columna);        
                if(rotacion==2)
                copy_matrix(5,2,0,PLANT,columna);
                if(rotacion==3)
                copy_matrix(1,3,3,PLANT,columna);
                if(rotacion==4)
                copy_matrix(5,6,2,PLANT,columna);
                break;
        
        case 4: if(rotacion==1)
                copy_matrix(5,3,2,PLANT,columna);        
                if(rotacion==2)
                copy_matrix(0,1,0,PLANT,columna);
                if(rotacion==3)
                copy_matrix(5,2,3,PLANT,columna);
                if(rotacion==4)
                copy_matrix(3,1,3,PLANT,columna);
                break;
        
        case 5: if(rotacion==1 || rotacion==3)
                copy_matrix(5,4,1,PLANT,columna);   
                if(rotacion==2 || rotacion==4)
                copy_matrix(0,1,3,PLANT,columna);
                break; 
    }  
}

void figuras(){
    figura= rand() % 5+1; 
    rotacion= rand() % 4+1;
    columna= 4; 
    }
    
void elimina_linea(){
   for(uint8_t i=0;i<9;i++){
        if(matrix_act[i]==255){
            for(uint8_t a=i;a>=1;a--){
                sendSPI(a,matrix_act[a-1]);
                matrix_act[a]=matrix_act[a-1];
            }
            punto++;
            printf("%f", punto);
        }
    }
}

void tetris() {
    bajar.attach(&bajaf, 0.1);
    init_display();
    borraraa();
    while(1){
            figuras();
            buscar_fila();
            cont=0; 
            elimina_linea();
            while (cont<fila){
                        movimiento_fig();    
                        crear_fig(figura,rotacion,columna);
                        buscar_fila();
                        print_matrix(matrix_temp);
                        }          
            guardar();
        }
    }
    //////////////////////////////////////////////////////////////////////////////////////////////
    
    void hacer_carita()
    {
    int k;
    uint8_t carita[8]={0b00000000, 0, 0b00100100,0b00100100,0,0, 0b01000010,0b00111100};
                for(k=1;k<=8;k++)
        {
        sendSPI(k ,carita[k]);}
        }
    void inicializar_menu(){
    sendSPI(0x0c,1);
    sendSPI(0x0b,7);
    sendSPI(0x09,0);
    sendSPI(0x0A,0x0E);
    int j=0;
    for (j=0;j<4;j++){   
        hacer_carita();
        wait (0.2);
        borraraa();
        wait (0.2);
    }  
    }
    
void eleccion_tetris()
{
    int k;
    uint8_t elec[8]={0b00000000, 0,0, 0b00000000,0b11010011,0b11011010,0b00001010, 0};
                for(k=1;k<=8;k++)
        {
        sendSPI(k ,elec[k]);}
       /* reada();
        if(vx>0.6){
        borraraaaaaa();
        carro_juego();}
        }*/
        }
     
void eleccion_carrito()
{
        int k;
    uint8_t elec1[8]={0b00000000, 0,0,0b00111000,0b01111100,0b00101000, 0, 0b11111111};
                for(k=1;k<=8;k++)
        {
        sendSPI(k ,elec1[k]);}
        /*reada();
        if(vx>0.6){
        borraraaaaaa();
        tetris();}*/
        }
    
    int main() 
{   int game=0;
    int pant=1;
    borraraa();
    inicializar_menu();
    //eleccion_tetris();
    while(1)
    {
    game=0;
    reada();
    if(vy<0.48)  
    game=1;
    if(vy>0.58)  
    game=2;
    
    switch(game)
    {
        case 1:
        pant++;
        if(pant%2!=0)
        {borraraa(); 
        eleccion_tetris();
        if(vx>0.6){
        borraraa();
        carro_juego();}
        }        
        if(pant%2==0)
        {borraraa();
        eleccion_carrito();
        if(vx>0.6){
        borraraa();
        tetris();}
        }
        break;
        
        case 2:
        pant++;
        if(pant%2!=0)
        {borraraa();
        eleccion_tetris();
        if(vx>0.6){
        borraraa();
        carro_juego();}
        }
        if(pant%2==0)
        {   borraraa();
            eleccion_carrito();
        if(vx>0.6){
        borraraa();
        tetris();}
        }
        break;
        }
        //printf(" pantalla %d \n", pant);
        wait(0.5);
        //printf("entra a %d \n", game);
        //wait(1);
        //printf(" vx %f \n", vx);
        
    }
    }
        
    
    /*
    wait(1);
    borraraaaa();
    eleccion_carrito();
    wait(1);*/