Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Firu en 26 Marzo 2013, 20:33 pm



Título: Ayuda en Código de Snake
Publicado por: Firu en 26 Marzo 2013, 20:33 pm
Hola bueno soy nuevo en el foro, necesito una pequeña ayuda con mi código del juego Snake ya que tiene algunas fallas, como por ejemplo cuando el cuerpo pasa por encima de la comida la comida desaparece ya que la función borrar_cuerpo la elimina pero si vuelvo a pasar por la posición que tenia dicha comida me la toma y aparece en otro lugar, si alguien puede ayudarme arreglando esa parte del código y también que en el case 4 el juego se reinicie :| bueno si alguien puede ayudarme se lo agradsco.
Dejo el código para que lo vean y me ayuden.

#include <windows.h>
#include <iostream>
#include <stdlib.h>
#include <conio.h>
#include <process.h>
#include <gotoxy.h>

#define ARRIBA     72
#define IZQUIERDA  75
#define DERECHA    77
#define ABAJO      80
#define ESC        27
#define ENTER      13

FILE *doc, *archi;
 
int Menu, b;
int cuerpo[200][2];
int n = 1, tam = 10, dir = 3, mat=20;
int x = 10, y = 12;
int xc = 30, yc = 15, pc = 5, oc = 35;
int velocidad = 130;
int score=0, r=0, h=1;
char tecla, nombres[20], cadena[20];

void pintar(){ 
     for(int i=2; i < 78; i++){
        gotoxy (i, 3); printf ("%c", 205);
        gotoxy(i, 23); printf ("%c", 205);
        }
     for(int v=4; v < 23; v++){
        gotoxy (2,v);  printf ("%c", 186);
        gotoxy(77,v);  printf ("%c", 186);
        }
     gotoxy (15,1);     printf ("***************** Snake By Firu *****************");
     gotoxy  (2,3);    printf ("%c", 201);
     gotoxy (2,23);    printf ("%c", 200);
     gotoxy (77,3);    printf ("%c", 187);
     gotoxy(77,23);    printf ("%c", 188);
     } 

void scores(){

     char cadena[80];
     archi=fopen("Score.txt","r"); //en modo lectura r
              if(archi == NULL) printf("Archivo no encontrado");
                       fgets(cadena,80,archi);
                       do{
                          printf("%s\n",cadena);
                          }while(fgets(cadena,80,archi)!=NULL);

     fclose(archi);
     getch();
     system("cls");
}
void bienvenida(){
     
     gotoxy(3,5);
     printf("    * *        ***********  **          *  *********  *     *   *********");
     gotoxy(3,6);
     printf("     *         *            *  *        *  *       *  *  *      *");
     gotoxy(3,7);
     printf("     *         *            *    *      *  *       *  **        *");
     gotoxy(3,8);
     printf("   *****       ***********  *      *    *  *********  **        *******");
     gotoxy(3,9);
     printf("  * *** *                *  *        *  *  *       *  *  *      *");
     gotoxy(3,10);
     printf(" *********               *  *          **  *       *  *    *    *");
     gotoxy(3,11);
     printf(" *********     ***********  *          **  *       *  *      *  *********");
     gotoxy(3,12);
     printf("  *******           ************            ***********");
     gotoxy(3,13);
     printf("  *******          **************          *************");
     gotoxy(3,14);
     printf("   *******        ****************        ***************");
     gotoxy(3,15);
     printf("    *******      *******    *******      *******    *******");
     gotoxy(3,16);
     printf("     *******    *******      *******    *******      *******");
     gotoxy(3,17);
     printf("      ***************         ***************         ***************");
     gotoxy(3,18);
     printf("       *************           *************           *************");
     gotoxy(3,19);
     printf("        ***********             ***********             ***********");

     gotoxy(20,22);
     printf("Ingrese su nombre de Usuario: ");
     gets(nombres);
     system("cls");
}

void OcultaCursor() {
    CONSOLE_CURSOR_INFO cci = {100, FALSE};
 
    SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci);
}


void guardar_posicion(){
     cuerpo[n][0] = x;
     cuerpo[n][1] = y;
     n++;
     if(n == tam) n = 1;
}
void dibujar_cuerpo(){
      for(int i = 1; i < tam; i++){
      gotoxy(cuerpo
  • , cuerpo[1]);
      printf("*");
     }
}
void borrar_cuerpo(){
     gotoxy(cuerpo[n][0] , cuerpo[n][1]); printf(" ");
    }

void teclear(){
     if(kbhit()){
            tecla = getch();
            switch(tecla){
                case ARRIBA : if(dir != 2) dir = 1; break;
                case ABAJO : if(dir != 1) dir = 2; break;
                case DERECHA : if(dir != 4) dir = 3; break;
                case IZQUIERDA : if(dir != 3) dir = 4; break;
                case ENTER:
                     gotoxy(35,10);
                     printf("Pause");
                     getch();
                     gotoxy(35,10);
                     printf("     ");
                     break;
           }
     }
}

void cambiar_velocidad(){
if(score == h*10){
         velocidad = velocidad - 10;
         h++;
}
}
   
void comida()
{
     if(x == xc && xc && y == yc)
     {
          xc = (rand() % 72) + 4;
          yc = (rand() % 18) + 4;
 
          tam++;
          score++;
         
          cambiar_velocidad();
         
          gotoxy(xc, yc); printf("%c", 4);
}
}

bool game_over()
{
     if(y == 3 || y == 23 || x == 2 || x == 77) return false;
     for(int j = tam - 1; j > 0; j--){
             if(cuerpo[j][0] == x &&  cuerpo[j][1] == y)
             return false;
     }
    return true;
}

void puntos(){
     gotoxy(34,3);
     printf(" Score:%d ", score);
     gotoxy(10, 3);
     printf(" Nivel: %d ",h);
}
int main()
{   
           
     pintar();
     bienvenida();
     system("cls");
     
     inicio:

     pintar();
     gotoxy(20,10);
     printf("1 - Jugar.");
     gotoxy(20,11);
     printf("2 - Puntajes.");
     gotoxy(20,12);
     printf("3 - Cambiar Usuario.");
     gotoxy(20,13);
     printf("4 - Juego Nuevo.");
     gotoxy(20,14);
     printf("5 - Salir.\n");
     gotoxy(20,16);
     printf("Digigite su Seleccion: ");
     scanf("%i",&Menu);
     system("cls");
     switch(Menu){
                  case 2:
                       scores();
                       goto inicio;
                       break;
                       
                  case 1:
    if(tecla == ENTER){
             getch();
             gotoxy(20,10);
             printf("Pause");
                  }
    OcultaCursor();
 
    pintar();
    gotoxy(xc, yc); printf("%c", 4);
 
    while(tecla != ESC && game_over())
    {   
         borrar_cuerpo();
         guardar_posicion();
         dibujar_cuerpo();
         comida();
         puntos();
         teclear();
         teclear();
 
         if(dir == 1) y--;
         if(dir == 2) y++;
         if(dir == 3) x++;
         if(dir == 4) x--;
 
         Sleep(velocidad);
         }
    pintar();
    system("cls");
    doc = fopen("Score.txt","a");
    gotoxy(30, 11);
    printf("Nombre: %s\n",nombres);
    gotoxy(30, 12);
    printf("Perdio en el nivel: %d",h);
    pintar();
    gotoxy(30, 13);
    printf("Su Score es: %d ",score);
    fprintf(doc,"\n");
    fprintf(doc,"               Nombre: %s          Nivel: %d          Score: %d \n",nombres,h,score);
    fclose(doc);
    getch();
    system("cls");
    goto inicio;
    break;
                         case 3:
                              pintar();
                              fflush(stdin);
                              bienvenida();
                              system("cls");
                              goto inicio;
                              break;                             
                         case 5:
                              return 5;
                              break;
                         case 4:
                             
                              fflush(stdin);
                             
                              OcultaCursor();
 
                              pintar();
                              gotoxy(xc, yc); printf("%c", 4);
 
                              while(tecla != ESC && game_over())
                              {       
                              borrar_cuerpo();
                              guardar_posicion();
                              dibujar_cuerpo();
                              comida();
                              puntos();
                              teclear();
                              teclear();
 
                              if(dir == 1) y--;
                              if(dir == 2) y++;
                              if(dir == 3) x++;
                              if(dir == 4) x--;
 
                              Sleep(velocidad);
                              }
                              pintar();
                              system("cls");
                              doc = fopen("Score.txt","a");
                              gotoxy(30, 11);
                              printf("Nombre: %s\n",nombres);
                              gotoxy(30, 12);
                              printf("Perdio en el nivel: %d",h);
                              pintar();
                              gotoxy(30, 13);
                              printf("Su Score es: %d ",score);
                              fprintf(doc,"\n");
                              fprintf(doc,"               Nombre: %s          Nivel: %d          Score: %d \n",nombres,h,score);
                              fclose(doc);
                              getch();
                              system("cls");
                              goto inicio;
                              break;
}
}
 


Título: Re: Ayuda en Código de Snake
Publicado por: amchacon en 26 Marzo 2013, 21:17 pm
Se nota que te has documentado. Pero tienes una gran falla en tu programa: NO se deben usar variables globales, son fuentes de errores:
https://www.youtube.com/watch?v=0QXkRD3fzVQ

Por cierto en la condición del if:
Código
  1. if(x == xc && xc && y == yc)

Porque pones xc a secas en medio?

Para el case 4 se puede usar un goto, pero es mucho más elegante poner todo en un while.


Título: Re: Ayuda en Código de Snake
Publicado por: Firu en 26 Marzo 2013, 21:25 pm
xD ese xc no va xD es que habia probado con "xc != comida()" pero al ser función no se podia y se me olvido de quitar ese pedasito xD

pero en si aun me falta 1 poco en eso de que la comida no aparezca sobre el cuerpo o si aparece que no se borre al pasar "borrar_cuerpo();" por encima de el :|


Título: Re: Ayuda en Código de Snake
Publicado por: 85 en 26 Marzo 2013, 21:30 pm
XD a secas

eso significa que intenta comprobar si tiene un valor distinto de 0, una comprobación de estado booleano. Pero si nunca es 0 entonces no tiene sentido comprobarlo.

a veces es muy útil por ejemplo para comprobar si un puntero fue asignado con una dirección de memoria.

int* pun = 0;//Asignar

if(pun){
}





Título: Re: Ayuda en Código de Snake
Publicado por: amchacon en 26 Marzo 2013, 21:41 pm
Esque tu código es muy propenso a errores no es por nada... Las variables que usas son globales y pueden modificarse desde cualquier función

Por eso es muy díficil detectar errores. Además los nombres son muy poco descriptivos y muy genéricos. Tienes que intentar corregir eso para tu próximo proyecto.


Título: Re: Ayuda en Código de Snake
Publicado por: 85 en 26 Marzo 2013, 22:08 pm
aparte para no ir en contra del concepto de 'modularidad' del programa