[ Foro de retos de programación ]

serpiente version1

18-Apr-2016 12:56
kotito otiok
2 Respuestas

Se que no va aqui, pero no encuentro el foro para el apartado de videojuegos, ni siquiera se si tiene. Bueno, perdonadme si no va en este foro

Hice el juego de la serpiente version 1. Al parecer la solucion no está colgada sino que en su lugar esta el de la version 2.

Total, haciendo el codigo, en mi opinion, creo que me ha salido muy engorroso. Soy principiante y bueno por lo menos lo he conseguido solucionar a mi modo.
Me gustaría compararlo con como lo haría Nacho o si hay alguna solucion mas simple:


#include <allegro.h>

#define ANCHO           33    //ancho limite de los ladrillos
#define ALTURA          20   //altura limte de los ladrillos

//POSICIONES INICIALES

#define POSX_INI   100        //posicion inicial en X
#define POSY_INI   100        //posicion inicial en Y 

//BOTONES DE DIRECCIONES
#define UP              KEY_UP
#define DOWN            KEY_DOWN
#define RIGHT           KEY_RIGHT
#define LEFT            KEY_LEFT
  
#define PAUSA           25



//DECLARACION DE FUNCIONES============================================================================================================================
int CrearVentana320x200();
void Ladrillo();
void Fruta(int apple);
//____________________________________________________________________________________________________________________________________________________


int main() {
    
    allegro_init();
    install_keyboard();
    install_timer();

//PREPARANDO LA INTERFAZ==============================================================================================================================
 
    CrearVentana320x200();
    Ladrillo();
    
        

    int POSX_actual = POSX_INI;
    int POSY_actual = POSY_INI;
    
    line(screen, 40,100, 100, 100, palette_color[2]);                                                                                                 //el trocito de seripiente desde la cabeza hasta la cola 
    
    int POSX_actualBlack = 40;
    int POSY_actualBlack = 100;
    int futXBlack = 40;
    int futYBlack = 100;
    
    int INCX = 1;
    int INCY = 0;
    
    int chocado = 0;                                                                                                                                  //la variable que hara que se finalice el juego o no
    int apple = 5;
    
    Fruta();                                                                                                                                          //Imprime en el mapa todas las manzanas
//____________________________________________________________________________________________________________________________________________________

// CODIGO JUEGO=======================================================================================================================================  
    
    do
    {
          
       int futX = POSX_actual+INCX;                                                                                                                   //incrementamos el pixel que va hacia adelante con el incremento
       int futY = POSY_actual+INCY;
       
       // si al incrementar un pixel en la linea, ¿se choca?
       if((getpixel(screen,futX,futY)==2)||(getpixel(screen,futX,futY)==43))                                                                          //si el pixel que tiene delante es o verde o naranja, se activa el chocado
         chocado = 1;                                                                                                                                 //es muy importante la colocacion de esta condicion. Debe ir despues de que añadir el incremento al futX o futY y antes de imprimir la linea
      
       //si toca una manzana, desaparecerlo
       if(getpixel(screen,futX,futY) == 40)
       {
          if((futX>116 && futX<124)||(futY>116 && futY<124))                                                                                          //si la manzana esta entre esos valores en X ó en Y, lo hacemos desaparecer poniendo un circulo negro encima
             circlefill(screen, 120,120,3, palette_color[0]);
          else if((futX>296 && futX<304)||(futY>25 && futY<33))
                circlefill(screen,300,29,3, palette_color[0]);
          else if ((futX>232 && futX<240)||(futY>184 && futY<192))
                circlefill(screen,236,188,3, palette_color[0]);
          else if((futX>191 && futX<199)||(futY>72 && futY<80))
                circlefill(screen,195,76,3, palette_color[0]);
          else if((futX>46 && futX<54)||(futY>46 && futY<54))
                circlefill(screen,50,50,3, palette_color[0]);
          
          apple--;                                                                                                                                    //si se come alguna de las manzanas, resta las que que le quedan
       }
         
         
       line(screen, POSX_actual, POSY_actual, futX, futY, palette_color[2]);
       POSX_actual = futX;
       POSY_actual = futY;
       
       //LINEA NEGRA QUE SIGUE LA VERDE PARA TAPARLO
       line(screen,POSX_actualBlack,POSY_actualBlack,futXBlack,futYBlack, palette_color[0]);                                                          //esta es la linea negra que seguira la verde para taparlo
       
       if(getpixel(screen,futXBlack+1,futYBlack)==2)                                                                                                  //derecha.
       {                                                                                                                                              //Si el pixel siguiente es de color verde, hace esta condición
          futXBlack++;                                                                                                                                //suma 1 al pixel en X que va por delante para ir a la dcha
          line(screen, POSX_actualBlack,POSY_actualBlack, futXBlack,futYBlack, palette_color[0]);
       }
       else                                                                                                                                           //si por la derecha no es verde, entonces...
            if(getpixel(screen,futXBlack,futYBlack-1)==2)                                                                                             //arriba
            {                                                                                                                                         //si el pixel siguiente es de color verde, hace esta condicion
               futYBlack--;                                                                                                                           //resta 1 al pixel en Y que va por delante para subir
               line(screen,POSX_actualBlack,POSY_actualBlack, futXBlack,futYBlack, palette_color[0]);                                                 
            }
            else                                                                                                                                      //si ni a la derecha ni arriba es verde, entonces...
                 if(getpixel(screen,futXBlack-1,futYBlack)==2)                                                                                        //izquierda
                 {
                    futXBlack--;                                                                                                                      //resta 1 al pixel en X que va por delante para ir a la izda
                    line(screen, POSX_actualBlack,POSY_actualBlack, futXBlack,futYBlack, palette_color[0]);
                 }
                 else if(getpixel(screen,futXBlack,futYBlack+1)==2)                                                                                   //abajo. Si ni a la derecha, ni por arriba ni por la izda es de color verde entonces....
                 {
                    futYBlack++;                                                                                                                      //suma 1 al pixel que va por delante en Y para ir hacia abajo
                    line(screen, POSX_actualBlack,POSY_actualBlack, futXBlack,futYBlack,palette_color[0]);
                 }
       
       POSX_actualBlack = futXBlack;
       POSY_actualBlack = futYBlack;
      //______________________________________________________________________________________________________________________________________________
      
      
      
      //DIRECCIONES DEL JUEGO========================================================================================================================
         
        if(keypressed())                                                                                                                              //Si se ha pulsado alguna tecla, se cumple la condicion
        {
             char tecla = readkey() >>8;
             switch(tecla)
             {
                  case UP:
                       INCX = 0; INCY = -1;
                       break;
                  case DOWN:
                       INCX = 0; INCY = 1;
                       break;
                  case LEFT:
                       INCX = -1; INCY = 0;
                       break;
                  case RIGHT:
                       INCX = 1; INCY = 0;
                       break;
            }
        }
        //____________________________________________________________________________________________________________________________________________        
         
         
         
         rest(PAUSA);
         
    }while((chocado==0)&&(apple!=0));
   
    textout(screen, font, "Te has comido todas las manzanas", 45,100, palette_color[2]);




    readkey();
	return 0;
}
END_OF_MAIN()










//============================ FUNCIONES =============================================================================================================


int CrearVentana320x200()
{
    if(set_gfx_mode(GFX_SAFE, 320, 200, 0, 0) != 0)                                                                                                   //Tamaño de la ventana anch=320, alt=200
    {
         set_gfx_mode(GFX_TEXT, 0, 0, 0, 0);
         allegro_message("Incapaz de entrar en modo gráfico\n%s\n",allegro_error);
         return 1;
    }
    else 
         return 0;
}

void Ladrillo()
{
     rect(screen,0,0,319,199,palette_color[43]);                                                                                                       //Dibujar dos rectangulos como marco de la pantalla
     rect(screen,2,2,317,197,palette_color[43]);
     line(screen,60,60,120,60,palette_color[43]);
     line(screen,60,60,60,100,palette_color[43]);
     line(screen,90,197,90,130,palette_color[43]);
     line(screen,175,40,175,130,palette_color[43]);
     line(screen,215,145,215,165,palette_color[43]);
     line(screen,215,165,235,165,palette_color[43]);
     line(screen,235,165,235,180,palette_color[43]);
     line(screen,260,3,260,110,palette_color[43]);
     line(screen,295,60,317,60,palette_color[43]);
}

void Fruta()
{
     circlefill(screen,120,120,3,palette_color[40]);
     circlefill(screen,300,29,3, palette_color[40]);
     circlefill(screen,236,188,3, palette_color[40]);
     circlefill(screen,50,50,3, palette_color[40]);
     circlefill(screen,195,76,3, palette_color[40]);
}




23-Apr-2016 13:19
Nacho Cabanes (+84)

¿Te refieres a este juego? Sí tiene el código de la primera parte de la serpiente, en el apartado 7:

http://www.aprendeaprogramar.com/mod/resource/view.php?id=433
 


23-Apr-2016 23:44
kotito otiok

Sí, bueno, si te metes en el apartado 7 verás que el código no es de su versión. El tema de los sprites lo explicas en serpiente 2, y precisamente los sprites lo aplicas en el 1. Además que el codigo es el mismo.
Es a eso a lo que me estoy refiriendo.

Saludos






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)