Como lograr detectar colision en snake

Ver el tema anterior Ver el tema siguiente 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 : 24

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

Ver el tema anterior Ver el tema siguiente Volver arriba

- Temas similares

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