Como lograr detectar colision en snake

Ir abajo

Como lograr detectar colision en snake

Mensaje por Leo el Jue Mayo 05, 2011 10:51 pm

bueno ya tengo kasi todo mi juego de snake, de lo k no tengo idea komo atacar es el problema de detectar kuando snake hace contacto kon su kuerpo para asi terminar el juego.
Son bioenvenidas las sugerencias... :p

Leo
Sabe programar
Sabe programar

Mensajes : 12
Fecha de inscripción : 18/02/2011

Volver arriba Ir abajo

Re: Como lograr detectar colision en snake

Mensaje por Leo el Jue Mayo 05, 2011 11:30 pm

Este el codigo k llevo zta ahorita :p


Spoiler:
Código:
  /* Autor : Hernandez Leonardo
 * Este programa consiste en el juego de znake.
 * 1.-Reglas del juego no puede tocar su propio cuerpo o los bordes.
 * 2.-La meta consiste en obtener el alimento sin violar la primera regla.
 * 3.-Conforme se alimenta crece y vas obteniendo puntos.
 *Se mueve con las flechas.*/

#include<graphics.h>
#include<stdio.h>
#include<time.h>


#define IZQ 4
#define DER 3
#define UP 2
#define ABJ 1
void inicializa()// inicializa el modo grafico
   {
    int gd = DETECT, gm;
    initgraph(&gd,&gm,"C:\\TC\\BGI");
   }
    int puntos = 10, vel = 500; // puntaje, velocidad
    struct cor_znake
    {
     /* Estas seran las corrdenadas de X y Y de cabeza y cola y dir */
     int comix,comiy,largo, cabX, cabY, cabdir, colx, coly,coldir,cabx2,caby2,colx2,coly2,existe;
     int doblezX [1000];//Guarda las cordenadas de los doblezes en X
     int doblezY [1000];//Cordenadaz Y
     int doblezy2[1000];
     int doblezx2[1000];
     int doblezdir [1000];
    } znake;
void posInicio()
   {
     int i;
     znake.largo = 100; // long ini
     znake.cabX = 200;  //pos x ini
     znake.cabx2 = znake.cabX + 5;
     znake.cabY = 200;  // pos ini y
     znake.caby2 =znake.cabY +5;
     znake.cabdir = DER;  // dir inic
     znake.colx= (znake.cabX-znake.largo)-2; // cord de la kola X
     znake.coly= znake.cabY;
     znake.coly2=znake.caby2;
     znake.colx2= (znake.cabx2-znake.largo)-2;
     znake.coldir = DER;
     znake.existe = 0;
     for ( i = 0; i < 1000; i++ )
      {
       znake.doblezX[i] = 0;  // asigna un valor
       znake.doblezY[i] = 0; // a cada doblez del 0 al 1000
       znake.doblezdir[i] = 0;
       znake.doblezx2[i] = 0;
       znake.doblezy2[i] = 0;
      }
     puntos = 0; // puntos iniziales
     vel = 500; // velocidad inicial
   }
void bordes()
   {
    int i, limx, limy;
   //char puntoz_pant [100];
    limx = getmaxx()-10;
    limy = getmaxy()-10;
    setcolor(4);
    line(10,15,10,limy); // linea izq
    line(10,15,limx,15);//linea sup
    line(10,limy,limx,limy);// inferio
    line(limx,15,limx,limy); //derecha
   //sprintf(puntoz_pant,"Puntaje: %d", puntos);
   //outtextxy(20,5,puntoz_pant);
    for ( i = znake.largo; i>0; i= i -5)
      {
       setfillstyle(1,2);
       bar(znake.cabX-i,znake.cabY,znake.cabx2-i,znake.caby2);
      }
      }

move() // Esta funcion mueve a znake
   {
     // Valores de x y Y  de la cabeza
     if( znake.cabdir == IZQ){
      znake.cabx2 --;
      znake.cabX --;
               }
     if( znake.cabdir == DER) {

      znake.cabX ++;
      znake.cabx2 ++;

                }
     if( znake.cabdir == UP) {

      znake.cabY --;
      znake.caby2 --;
              }
     if( znake.cabdir == ABJ)  {
      znake.caby2 ++;
      znake.cabY ++;      }
     setfillstyle(1,2);
     bar (znake.cabX, znake.cabY,znake.cabx2,znake.caby2);
     // Borra x y y  de la cola

     if( znake.coldir == IZQ) {
      znake.colx2 --;
      znake.colx --;
                }
     if( znake.coldir == DER)  {
      znake.colx2 ++;
      znake.colx ++;

                  }
     if( znake.coldir == UP) {
      znake.coly2 --;
      znake.coly --;  // raro
              }
     if( znake.coldir == ABJ)
                {
      znake.coly ++;  // raro
      znake.coly2 ++;      }

     setfillstyle(1,0);
     bar (znake.colx, znake.coly,znake.colx2,znake.coly2);

      }
void captura() // esta funcion obtine y hace los respectivs cambios a lo k introcuce el ususario
   {
     static int i =0;
     static int j = 0;
     char tecla;

     if (kbhit())
      {
       tecla = getch();
       if( tecla == 80) tecla = ABJ;
       if( tecla == 72) tecla = UP;
       if( tecla == 75) tecla = IZQ;
       if( tecla == 77) tecla = DER;
     if ( tecla == IZQ && znake.cabdir != DER && znake.cabdir !=IZQ)
      {
       znake.cabdir = IZQ;
       znake.doblezX [i] = znake.cabX;
       znake.doblezY [i] = znake.cabY;
       znake.doblezx2 [i] = znake.cabx2;
       znake.doblezy2 [i] = znake.caby2;
       znake.doblezdir [i] = IZQ;
       i++;
      }
     if ( tecla == DER && znake.cabdir != DER && znake.cabdir !=IZQ)
      {
       znake.cabdir = DER;
       znake.doblezX [i] = znake.cabX;
       znake.doblezY [i] = znake.cabY;
       znake.doblezx2 [i] = znake.cabx2;
       znake.doblezy2 [i] = znake.caby2;
       znake.doblezdir [i] = DER;
       i++;
      }

     if ( tecla == UP && znake.cabdir != UP && znake.cabdir !=ABJ)
      {
       znake.cabdir = UP;
       znake.doblezX [i] = znake.cabX;
       znake.doblezY [i] = znake.cabY;
       znake.doblezx2 [i] = znake.cabx2;
       znake.doblezy2 [i] = znake.caby2;
       znake.doblezdir [i] = UP;
       i++;
      }
     if ( tecla == ABJ && znake.cabdir != UP && znake.cabdir !=ABJ)
      {
       znake.cabdir = ABJ;
       znake.doblezX [i] = znake.cabX;
       znake.doblezY [i] = znake.cabY;
       znake.doblezx2 [i] = znake.cabx2;
       znake.doblezy2 [i] = znake.caby2;
       znake.doblezdir [i] = ABJ;
       i++;
      }
       }
     if (znake.colx == znake.doblezX [j] && znake.coly == znake.doblezY [j])
      {                                    // Cambiar de direcion de la cola
       znake.coldir = znake.doblezdir[j];  //  kuando se encuentre en el doblez
       j++;
      }
     }
void colizion() // termina el juego si toka los bordess
   {
     if (znake.cabx2 ==15  || znake.cabx2 == getmaxx()-11 || znake.cabY == 15 || znake.cabY == getmaxy() - 14){
     outtextxy ( (getmaxx()/2)-40 , getmaxy()/2, " GAME OVER :P");
     delay(1000);
     getch();
     exit(1);
     }
   }
void crecer() // si ingiere alimento aumenta puntos y proximamente crecera
   {
       char puntoz_pant [1000];
       setfillstyle(1,0);
       bar(znake.comix,znake.comiy,znake.comix + 3, znake.comiy + 3 );
       http://znake.largo += 100;
       puntos += 10;
       znake.existe = 0;
       setfillstyle(1,0);
       bar (0,0,100,13);
       sprintf(puntoz_pant,"Puntaje: %d \r", puntos);
       outtextxy(20,5,puntoz_pant);
       /*if(znake.coldir == UP}
      {
        setfillstyle(1,2);
        bar (znake.colx, znake.coly,znake.colx2,znake.coly2);
      } */

       }

void comida(){ // zta funcion crea la komida y si la serpiente la toka llama funcion crecer
      //   int comix, comiy;
   // int x [3] = {1,2,3};
   int i,j;
      int x [4][4]= {
      {0,1,2,3},
      {0,1,2,3},
      {0,1,2,3},
      {0,1,2,3}, };
     if (znake.existe == 0){
      srand ((unsigned) time(NULL));
      znake.comix = rand() %(10- getmaxx());
      znake.comiy = rand()% (15 - getmaxy());
      setfillstyle(1,3);
      bar(znake.comix,znake.comiy,znake.comix+3, znake.comiy+3);
      znake.existe = 1;
      }
       for(i=0;i<4;i++)
      for(j=0;j<4;j++)
       {

     if  (znake.cabX == znake.comix+ x[i][j] && znake.cabY == znake.comiy + x [i][j])
      {
       crecer();
      }
     }


   }





void motor() // funciona komo el motor del programa loop infinito
   {
    while(1)
    {
   // clearviewport();

    move();
    captura();
    colizion();
    comida();
    delay(10);
    }
   }
void main()
   {

     inicializa();// Funcion para iniciar el modo grafico
     posInicio(); // Datos iniciales de znake
     bordes(); // dibuja bordes y znake pos inicial
     motor();  // Ciclo " infinito "
     getch(); // detiene pantalla
     closegraph(); // cierra modo grafico
   }

Leo
Sabe programar
Sabe programar

Mensajes : 12
Fecha de inscripción : 18/02/2011

Volver arriba Ir abajo

Re: Como lograr detectar colision en snake

Mensaje por GoOrK el Lun Mayo 09, 2011 12:43 am

Una observacion, la comida algunas veces se sale de los limites, como alcanzamos eso??

Y respecto a que choque consigo misma, di que tu snake es para niños asi que no presenta mucha dificultad. lol

_________________
avatar
GoOrK
Admin
Admin

Mensajes : 53
Fecha de inscripción : 18/02/2011
Edad : 25

http://goorkuabcinc.activo.ws

Volver arriba Ir abajo

Re: Como lograr detectar colision en snake

Mensaje por Contenido patrocinado


Contenido patrocinado


Volver arriba Ir abajo

Volver arriba

- Temas similares

 
Permisos de este foro:
No puedes responder a temas en este foro.