Advertisement
gahz

avoid

Oct 4th, 2014
282
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.75 KB | None | 0 0
  1. #include<graphics.h>
  2. #include<conio.h>
  3. #include<time.h>
  4. #include<string.h>
  5. #include<stdio.h>
  6.  
  7. #define K_UP 80       /* Tecla: Fecha Arriba */
  8. #define K_DOWN 72     /* Tecla: Flecha Abajo */
  9. #define K_LEFT 75     /* Tecla: Flecha Izquierda */
  10. #define K_RIGHT 77    /* Tecla: Flecha Derecha */
  11. #define K_QUIT 27     /* Tecla: ESC */
  12. #define N_ENEMIES 7   /* Numero de Cuadros "enemigos" */
  13. #define MAX_Y 480     /* Maximo de las Y (en pantalla: 480) */
  14. #define MAX_X 640     /* Maximo de las X (en pantalla: 640) */
  15.  
  16. /* Ya existen dentro de las librerias incluidas, pero el compilador
  17.    pide prototipo, sino lanza un warning y no queremos eso.
  18. */
  19. void delay(int);
  20. void srand(int);
  21. int rand(void);
  22.  
  23. /* Determinara si las figuras (jugador y enemigo) colisionan */
  24. int colision(int [][], int, int);
  25.  
  26. void main(void)
  27. {
  28.     int regen=1, i, j, act, per=1, cn=3, pts=0, dif=0;
  29.     int en[N_ENEMIES][4], player[3]={320, 440, 20};
  30.     int gd=DETECT, gm;
  31.     char x[20]="Puntaje: 0";
  32.  
  33.     /* Colores de los niveles */
  34.     int colniv[] = {7, 10, 2, 9, 1, 14, 12};
  35.  
  36.     /* Velocidad de bajada de los niveles */
  37.     int velniv[] = {20, 25, 28, 35, 38, 42, 50};
  38.  
  39.     /* Semilla para generar numero aleatorio */
  40.     srand((int) time(NULL));
  41.  
  42.     /*Inicializando las posiciones de los enemigos */
  43.     for(i=0; i<N_ENEMIES; i++){
  44.         for(j=0; j<4; j++)
  45.         {
  46.             if(j<2)
  47.                 en[i][j]=10;
  48.             else
  49.                 en[i][j]=35;
  50.  
  51.             if(i>0 && j==0)
  52.                 en[i][j] = en[i-1][j]+95;
  53.             if(i>0 && j==2)
  54.                 en[i][j] = en[i-1][j]+95;
  55.         }
  56.     }
  57.  
  58.     /* Abriendo modo grafico */
  59.     initgraph(&gd, &gm, "c:\\tc20\\bin");
  60.     setcolor(7);
  61.  
  62.     do{
  63.         /* Agregando puntaje a la cadena a mostrar */
  64.         sprintf(x, "Puntaje: %d", pts);
  65.  
  66.         if(dif>0)
  67.             setcolor(colniv[dif]);
  68.  
  69.         outtextxy(5, 5, x);
  70.  
  71.         for(i=0; i<N_ENEMIES; i++)
  72.         {
  73.             if(regen==0)
  74.             {
  75.                 /* si se ha llegado al limite inferior, o ha perdido
  76.                    Se generan nuevamente las posiciones en Y */
  77.                 en[i][1] = 10;
  78.                 en[i][3] = 35;
  79.  
  80.                 /* Generacion aleatoria de las posiciones en X */
  81.                 /* El sobreponer imagenes es una caracteristica
  82.                    no un error, pero pude cambiarse, si en este punto
  83.                    se valida que en[i][2] sea diferente a cualquier otro
  84.                    en en[][2].
  85.                 */
  86.  
  87.                 en[i][2]=rand() % MAX_X + 1;
  88.                 en[i][0]=en[i][2]-25;
  89.             }
  90.  
  91.             /* Dibujando los cuadros "enemigos" */
  92.             setcolor(i+1);
  93.             rectangle(en[i][0], en[i][1], en[i][2], en[i][3]);
  94.         }
  95.  
  96.         /* Plantando una nueva semilla de generacion de n aleatorios
  97.            cada vez que se regeneran por limite o se pierde */
  98.         if(cn%3==0)
  99.             srand((int) time(NULL));
  100.  
  101.         /* Validando si los cuadros aun no han llegado al limite inferior
  102.            para seguir avanzando hacia abajo */
  103.         if(en[0][3] < MAX_Y )
  104.         {
  105.             for(i=0; i<N_ENEMIES; i++)
  106.             {
  107.                 en[i][3]+=velniv[dif];
  108.                 en[i][1]+=velniv[dif];
  109.             }
  110.             /* Evitando regeneracion, ya que SI se puede bajar aun mas */
  111.             regen=1;
  112.             cn++; /* Para la semilla aleatoria */
  113.         }else
  114.         {
  115.             /* EL JUGADOR HA GANADO UN PUNTO */
  116.             regen=0;  /* Marca para regeneracion de cuadros */
  117.             cn=3;     /* Marca para generar nueva semilla */
  118.             pts++;    /* Aumento del puntaje */
  119.  
  120.             /* Cada 4 puntos, aumentar nivel */
  121.             if(dif<6 && (pts%4==0) ){
  122.                 dif++;
  123.                 setcolor(colniv[dif]);
  124.             }
  125.         }
  126.  
  127.         /* IMPORTANTE */
  128.         /* kbhit() devuelve 0 si se ha presionado un boton, 1 sino...
  129.            Con esta condicion se dice entonces, que si se ha presionado
  130.            un boton, capturarlo en la variable "act", asi capturamos los
  131.            eventos del teclado.
  132.         */
  133.         if(kbhit())
  134.         {
  135.             act =(int)getch();
  136.         }else{
  137.             act=0;
  138.         }
  139.  
  140.         /* si se ha capturado una tecla, mover jugador */
  141.        if(act == K_RIGHT)
  142.        {    if(player[0] + 20 < MAX_X)
  143.                 player[0]+=20;
  144.        }else if(act == K_LEFT)
  145.        {
  146.             if(player[0] - 20 > 0)
  147.                 player[0]-=20;
  148.        }
  149.  
  150.        /* Dibujando al jugador */
  151.        circle(player[0], player[1], player[2]);
  152.  
  153.        /* Si los cuadros van por mas de la mitad de la pantalla
  154.           Se valida que no choque el jugador con los cuadros.
  155.        */
  156.  
  157.        if(en[0][3] > 400)
  158.        {
  159.             i=20;
  160.             j=0;
  161.             do{
  162.                 per=colision(en, player[0]-i, player[1]-j);
  163.                 i--;
  164.                 if(i>0)
  165.                     j++;
  166.                 else
  167.                     j--;
  168.  
  169.                 if(per==0)
  170.                     i=-21;
  171.             }while(i>=-20);
  172.  
  173.             /* ya que la funcion "colision" devuelve 1 si no hay colision,
  174.               puede existir la confusion de que: se halla ganado y se puede
  175.               continuar, pero la funcion nos dice que no hay que regenerar
  176.               porque aun no se ha perdido. Con esto permitimos que se
  177.               regenere si ha ganado y se ha llegado al limite.
  178.             */
  179.             if(regen!=0)
  180.                 regen=per;
  181.  
  182.             /* EL JUGADOR HA PERDIDO */
  183.             if(per==0)
  184.             {
  185.                 setcolor(12);
  186.                 sprintf(x, "Puntaje: %d. Nivel: %d", pts, dif);
  187.                 outtextxy(220, 170, "Has Perdido!");
  188.                 outtextxy(220, 180, x);
  189.                 outtextxy(220, 200, "Presione cualquier tecla!");
  190.                 delay(1000);
  191.                 while( !kbhit() );
  192.  
  193.                 dif=0;
  194.                 pts=0;
  195.             }
  196.        }
  197.  
  198.        /* Se esperan 90 milisegundos y se actualiza la pantalla */
  199.        delay(90);
  200.        cleardevice(); /* Actualiza borrando todo en pantalla */
  201.        fflush(stdin); /* Borrar ordenes guardadas en buffer */
  202.     }while(act!=K_QUIT);
  203.  
  204.     closegraph();
  205. }
  206.  
  207. int colision(int en[N_ENEMIES][4],int x,int y)
  208. {
  209.     int i=0, j=0, c=0, col=1;
  210.  
  211.     /* La colision consiste en que: se toman coordenadas o
  212.        como he llamado "puntos criticos" de cada figura, y
  213.        se determinan si no hay contacto entre los puntos
  214.        criticos de la figura jugador, con ninguna figura enemiga.
  215.     */
  216.  
  217.     do{
  218.     j = en[i][3]-25;
  219.         do{
  220.             if(y==j)
  221.             {
  222.             c = en[i][2]-25;
  223.                 do{
  224.                     if(x==c)
  225.                     {
  226.                         col = 0;
  227.                     }
  228.  
  229.                     if(col == 0)
  230.                         c=en[i][2]+1;
  231.  
  232.                     c++;
  233.                 }while(c<en[i][2]);
  234.             }
  235.  
  236.             if(col == 0)
  237.                 j=en[i][3]+1;
  238.  
  239.             j++;
  240.         }while(j<en[i][3]);
  241.  
  242.         if(col==0)
  243.             i=N_ENEMIES+1;
  244.         i++;
  245.     }while(i<N_ENEMIES);
  246.  
  247. return col;
  248. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement