problema con el game en dev c++

Iniciado por dmnt82, 20 Marzo 2014, 10:24 AM

0 Miembros y 2 Visitantes están viendo este tema.

dmnt82

tengo este programa  c++, pero a la hora de ejecutar la parte izquierda se queda atorado los "diamantes" ya busque en ciclo y modificando y no encuentro la solución..., tambien busque como usar la tecla spce en ascci para quitar  opción de arriba y abajo, seria de gran ayuda si me pudieran ayudar a resolver y decir cual es mi error... !!  :-( :-\ :(




#include <windows.h>
#include <iostream>
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

#define ARR 72
#define ABA 80
#define IZQ 75
#define DER 77


char ave_l1[]={' ','*','*', '*',' ',' ',' ',0};  // dibujo de la nave      
char ave_l2[]={' ','*','*', ' ','*',' ',' ',0};
char ave_l3[]={' ','*','*', '*',' ',' ',' ',0};

char explocion_l1[]={' ',' ','*','*',' ',' ',' ',0};      
char explocion_l2[]={' ','*','*','*','*',' ',' ',0};   //explocion de la nave
char explocion_l3[]={' ',' ','*','*',' ',' ',' ',0};

char explocion_r1[]={'*',' ','*','*',' ','*',' ',0};      
char explocion_r2[]={' ','*','*','*','*',' ',' ',0};  //la segunda explocion
char explocion_r3[]={'*',' ','*','*',' ','*',' ',0};

char borrar_ave[]={' ',' ',' ',' ',' ',' ',' ',0}; // cuando se borra

int Num_vidas = 3;
int Corazones = 3;
int ix = 1;
int iy = 19;

int y = 8, x = 12;
int yy = 70 , xx = 1;
int x1 = 58 , y1 = 6;
int x2 = 17, y2 = 9;

int i,v;

/*para cambiar de nivel*/
int repeticion = 0, nivel =1;
bool condicion = false;

void gotoxy(int x, int y)
{
    HANDLE hCon;
    COORD dwPos;
   
    dwPos.X = x;
    dwPos.Y = y;
   
    hCon = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleCursorPosition(hCon,dwPos);
   
}    


void vidas(int vi)
{
    gotoxy(2,1); printf("VIDAS %d",vi);
}

void Barra_salud(int n)
{
    gotoxy(72,1);printf(" ");
    gotoxy(73,1);printf(" ");
    gotoxy(74,1);printf(" ");
   
    for(v = 0 ; v < n ; v++)
    {
      gotoxy(72+v,1);
      printf("%c",3);
     }    
}

void Explocion(void)
{
    gotoxy(ix,iy);   puts(explocion_l1);
    gotoxy(ix,iy+1); puts(explocion_l2);
    gotoxy(ix,iy+2); puts(explocion_l3);
   
    Sleep(380);
   
    gotoxy(ix,iy);   puts(explocion_r1);
    gotoxy(ix,iy+1); puts(explocion_r2);
    gotoxy(ix,iy+2); puts(explocion_r3);
   
    Sleep(380);
   
    gotoxy(ix,iy);   puts(ave_l1);
    gotoxy(ix,iy+1); puts(ave_l2);
    gotoxy(ix,iy+2); puts(ave_l3);
   
}    

void jugar(void)
{
    //rutina de los diamantes
   
     gotoxy(x,y);   printf("%c",4);
     gotoxy(xx,yy); printf("%c",4);
     gotoxy(x1,y1); printf("%c",4);
     gotoxy(x2,y2); printf("%c",4);
   
     Sleep(80);
     
     gotoxy(x,y);   printf(" ");
     gotoxy(xx,yy); printf(" ");
     gotoxy(x1,y1); printf(" ");
     gotoxy(x2,y2); printf(" ");
     
     if (x > 20)
     {
           x = 2;
           y = (rand() % 80) + 6;
           
           if( x== 2);
           condicion =false;
           
     }
     if(xx >20)
     {
           xx = 2;
           yy = (rand() % 90) + 6;
           
     }
     if(x1 >20)
     {
           x1 = 2;
           y1 = (rand() % 90) + 6;
           
     }
     if(x2 >20)
     {
           x2 = 2;
           y2 = (rand() % 90) + 6;
           
           }
     
     
     //rutina de mover la ave
     if (kbhit())
     {
                unsigned char tecla = getch();
               
                switch (tecla)
                {        
                       case ARR:
                           
                            if(iy > 4)
                            {
                                 gotoxy(ix,iy);puts(borrar_ave);
                                 gotoxy(ix,iy+1);puts(borrar_ave);
                                 gotoxy(ix,iy+2);puts(borrar_ave);
                                 
                                 iy -=2;//iy = iy -2;
                                 
                                 gotoxy(ix,iy);puts(ave_l1);
                                 gotoxy(ix,iy+1);puts(ave_l2);
                                 gotoxy(ix,iy+2);puts(ave_l3);
                                 
                             }
                            break;
                           
                      case ABA:
                           
                           if( iy <70)
                           {
                                 gotoxy(ix,iy);puts(borrar_ave);
                                 gotoxy(ix,iy+1);puts(borrar_ave);
                                 gotoxy(ix,iy+2);puts(borrar_ave);
                                 
                                 iy +=2;//iy = iy +2;
                                 
                                 gotoxy(ix,iy);puts(ave_l1);
                                 gotoxy(ix,iy+1);puts(ave_l2);
                                 gotoxy(ix,iy+2);puts(ave_l3);
                                 
                           }
                           break;
                               
                        case IZQ:
                           
                            if(ix > 4)
                            {
                                 gotoxy(ix,iy);puts(borrar_ave);
                                 gotoxy(ix,iy+1);puts(borrar_ave);
                                 gotoxy(ix,iy+2);puts(borrar_ave);
                                 
                                 ix -=2;//iy = iy -2;
                                 
                                 gotoxy(ix,iy);puts(ave_l1);
                                 gotoxy(ix,iy+1);puts(ave_l2);
                                 gotoxy(ix,iy+2);puts(ave_l3);
                                 
                             }
                            break;
                         
                         case DER:
                           
                            if(ix <70)
                            {
                                 gotoxy(ix,iy);puts(borrar_ave);
                                 gotoxy(ix,iy+1);puts(borrar_ave);
                                 gotoxy(ix,iy+2);puts(borrar_ave);
                                 
                                 ix +=2;//iy = iy -2;
                                 
                                 gotoxy(ix,iy);puts(ave_l1);
                                 gotoxy(ix,iy+1);puts(ave_l2);
                                 gotoxy(ix,iy+2);puts(ave_l3);
                                 
                             }
                            break;          
                } //fin del switch
               
     }// Fin if
     
     //rutina para golpes de metoritos
     
     if(( x > ix && x<ix - 6 && y == iy-1)|| (x > ix && xx<ix - 6 && yy == iy-1)
         || (x1 > ix && xx<ix - 6 && y1 == iy-1)|| (x2 > ix && x2<ix - 6 && y2 == iy-1))
         {
                Corazones --;
                Barra_salud(Corazones);
                printf("\a");
         }
         
     gotoxy(ix,iy);puts(ave_l1);      
     gotoxy(ix,iy+1);puts(ave_l2);
     gotoxy(ix,iy+2);puts(ave_l3);
     
     
     if(!Corazones)
     {
                    Num_vidas--;
                    vidas(Num_vidas);
                    Explocion();
                    Corazones =3;
                   
                    Barra_salud(Corazones);
                   
     }
     
     /*rutina para cambio de nivel*/
     
     if(!condicion)
     {
       repeticion ++;
       //condicionc = true;
     }
     if(repeticion == 10)
     {
         nivel++;
         gotoxy(35,1); printf("NIVEL %i",nivel);                
     
         gotoxy(ix,iy); puts(borrar_ave);      
         gotoxy(ix,iy); puts(borrar_ave);  
         gotoxy(ix,iy); puts(borrar_ave);  
         
         iy -= 2; //iy = iy - 2;
         
         gotoxy(ix,iy); puts(ave_l1);      
         gotoxy(ix,iy); puts(ave_l2);  
         gotoxy(ix,iy); puts(ave_l3);
         
         repeticion = 0;
         
               
     }
     x--;
     xx--;
     x1--;
     x2--;
     
     

       
}

int main ()
{
   vidas(Num_vidas);
   Barra_salud(Corazones);
   gotoxy(35,1); printf("NIVEL %i",nivel);  
   
   gotoxy(ix,iy);puts(ave_l1);
   gotoxy(ix,iy+1);puts(ave_l2);
   gotoxy(ix,iy+2);puts(ave_l3);
   
   
   
   while(Num_vidas > 0 && nivel <= 5 )
        jugar();
   
       
    gotoxy(22,16); printf("Game Over");
    Sleep(120);  
   getch();
   return 0;
 
}

eferion

#1
Varias cosas:

1. No escribas en negrita, no se te va a entender mejor ( más bien todo lo contrario ).

2. El código lo metes dentro de las etiquetas GeSHi correspondientes ( en tu caso C )

3. y1 es una función declarada en math.h... deberías plantearte cambiar los nombres o, mejor aún, agrupar esas variables en estructuras y, por supuesto, evitar el uso de variables globales.

4. Variables con nombres tan guays como x, xx, x1, ix no me dicen absolutamente nada... ¿tanto cuesta usar nombres que clarifiquen un poco el código? O al menos añade comentarios al código.

5. En la siguiente línea:


if( x== 2);
 condicion =false;


te sobra el primer punto y coma ';'... ese if así como está, simplemente, no hace nada.

6. Tu código es un puñetero lío. Un ejemplo:


if (x > 20)
{
 x = 2;
 y = (rand() % 80) + 6;
           
 if( x== 2);
   condicion =false;
}


Suponiendo corregido el tema del punto y coma... a ver si lo entiendo, hacemos x=2 y luego... si x=2 entonces condicion = false???? qué sentido tiene ese if ahí ??

7. Las coordenadas de generación de los asteroides están mal:


if (x > 20)
{
  x = 2;
  y = (rand() % 80) + 6;
}


La pantalla tiene 80 columnas ( X ) no 80 filas ( Y ).

Pondré más cosillas cuando tenga tiempo...

amchacon

Veo un uso excesivo del gotoxy:
Código (cpp) [Seleccionar]
void Barra_salud(int n)
{
     gotoxy(72,1);printf(" ");
     gotoxy(73,1);printf(" ");
     gotoxy(74,1);printf(" ");
   
     for(v = 0 ; v < n ; v++)
     {
       gotoxy(72+v,1);
       printf("%c",3);
      }   
}


Eso se puede hacer con un solo gotoxy:
Código (cpp) [Seleccionar]
void Barra_salud(int n)
{
     gotoxy(72,1);
   
     for(v = 0 ; v < n ; v++)
     {
       printf("%c",3);
     }   
}


Variables como _l1, _l2, _l3 podrían ser representadas con matrices:
Código (cpp) [Seleccionar]

char ave[][]=
                   {
                     {' ','*','*', '*',' ',' ',' ',0},  // dibujo de la nave     
                     {' ','*','*', ' ','*',' ',' ',0},
                     {' ','*','*', '*',' ',' ',' ',0}
                   };

O incluso con comillas dobles:
Código (cpp) [Seleccionar]

char ave[][]=
                   {
                     {" ***   "},  // dibujo de la nave     
                     {" **  * "},
                     {"  ***  "}
                   };


El error es díficil saberlo ya que el código no es claro y hay muchas variables.

Es mejor evitar el uso de variables globales, el código será más sencillo de depurar.
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

Yoel Alejandro

Ah, .... y debe ser "explosion", no "explocion". Se que es una nimiedad, pero nunca está demás  ;)
Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)

dmnt82


//aqui segun es cuando muestra las vidas de la ave  en la parte de arriba

void vidas(int vi)
{
     gotoxy(2,1); printf("VIDAS %d",vi);
}

void Barra_salud(int n)
{
     gotoxy(72,1);printf(" ");
     gotoxy(73,1);printf(" ");
     gotoxy(74,1);printf(" ");
     
     for(v = 0 ; v < n ; v++)
     {
       gotoxy(72+v,1);
       printf("%c",3);
      }   
}



pero mi problema es cuando los asteroides o"diamantes toca la parte izquierda se queda ahí y la nave o ave se duplica 
:(no se como colocar una imagen para el ejemplo):

eferion

#5
Si no hacen falta capturas... cualquiera que pruebe tu código ve el resultado.

Lo que te estamos diciendo es que el diseño que has elegido es muy pobre y propenso a errores y prueba de ello es que no es fácil encontrar el error en un programa tan corto.

Te propongo que readaptes un poco el código... y como muestra de buena fe te pongo algunas propuestas:

1. Usa estructuras. Las variables estarán organizadas y será más sencillo evitar el uso de variables globales:


typedef struct
{
 int x;
 int y;
} Coordenada;

typedef struct
{
 // Coordenadas de la nave
 Coordenada coord_nave;

 // Coordenadas de cada asteroide
 Coordenada coord_asteroides[ MAX_ASTEROIDES ];

 // Numero de vidas restantes
 int vidas;

 // Nivel de salud
 int salud;
 
 // Nivel del juego
 int nivel;

 // Progreso del juego. Para saber cuando subir de nivel
 int progreso;
} DatosJuego;


2. Usa defines. Vienen muy bien para evitar tener valores fijos en el código:


// Numero total de asteroides
#define MAX_ASTEROIDES 4

// progreso necesario para pasar de nivel
#define MAX_PROGRESO 1000

// desplazamiento de la nave
#define MOV_NAVE    2

// Caracter para pintar los asteroides
#define CHAR_ASTEROIDE 3

// Caracter para pintar la salud
#define CHAR_SALUD     4

// Para limpiar la pantalla
#define CHAR_BLANCO    ' '


3. Crea funciones para las tareas repetitivas. Por ejemplo pintar la nave:


void pintar_nave( Coordenadas coord )
{
 int i;
 for ( i=0; i<3; i++ )
 {
   gotoxy( coord.x, coord.y + i );
   puts( nave[ i ] );
 }
}


Ten en cuenta que para que el código anterior funcione es necesario redefinir la forma de describir la nave... algo así estaría bien (copiado de amchacon):


char nave[][]=
                  {
                    { " ***   " },  
                    { " ** *  " },
                    { " ***   " }
                  };


Y lo mismo puedes hacer para borrar la nave....


void borrar_nave( Coordenadas coord )
{
 int i;
 for ( i=0; i<3; i++ )
 {
   gotoxy( coord.x, coord.y + i );
   puts( nave_vacia[ i ] );
 }
}


Puedes, de echo, juntar ambas funciones en una sola y pasarle como argumento la matriz para pintar la nave o borrarla... pero eso ya te lo dejo a ti.

4. Evita las variables globales. No son necesarias como norma general.



int main( )
{
 DatosJuego datos_juego;

 // inicializamos la estructura
 memset( &datos_juego, 0, sizeof( DatosJuego ) );
 datos_juego.coord_nave.x = 1;
 datos_juego.coord_nave.y = 19;
 datos_juego.vidas = 3;
 datos_juego.salud = 3;
 datos_juego.nivel = 1;

 vidas( datos_juego.vidas );
 Barra_salud( datos_juego.salud );
 gotoxy(35,1); printf("NIVEL %d", datos_juego.nivel );  
 
 pintar_nave( datos_juego.coord_nave );  
   
 while( datos_juego.vidas > 0 )
   jugar( &datos_juego);
   
 gotoxy(22,16); printf("Game Over");
 Sleep(120);  
 getch();
 return 0;
}


5. Evita instrucciones duplicadas:

Por ejemplo el código que controla la pulsación del teclado tiene código repetitivo hasta la saciedad.


switch (tecla)
{        
 case ARR:
   if ( datos_juego->coord_nave.y > 4 )
   {
     borrar_nave( datos_juego->coord_nave );
     datos_juego->coord_nave.y -= MOV_NAVE;
   }                              
   break;
                           
 case ABA:
   // Nota que ya no es 70 sino 20, la consola tiene unicamente 25 filas
   if( datos_juego->coord_nave.y < 20 )
   {
     borrar_nave( datos_juego->coord_nave );
     datos_juego->coord_nave.y += MOV_NAVE;
   }                              
   break;

 case IZQ:
   if ( datos_juego->coord_nave.x > 4 )
   {
     borrar_nave( datos_juego->coord_nave );
     datos_juego->coord_nave.x -= MOV_NAVE;
   }                              
   break;
                           
 case DER:
    if ( datos_juego->coord_nave.x < 70 )
   {
     borrar_nave( datos_juego->coord_nave );
     datos_juego->coord_nave.x += MOV_NAVE;
   }                              
   break;
} //fin del switch

pintar_nave( datos_juego->coord_nave );


Con estos dos pasos el código ya lucirá un aspecto bastante más saludable. Será más complicado confundirse al usar las variables y será más sencillo seguir el código que has escrito.

Dale un repaso al código siguiendo estas pautas... u otras similares a tu elección y si no consigues resolver tu problema pon tu nuevo código.

Ah sí, por segunda vez Usa las etiquetas GeSHi para que el codigo sea legible si no, voy a empezar a plantearme el no responderte.

PD.: por si te preguntabas sobre la variable "progreso"... la idea que pensé es que con cada refresco, progreso se incrementase en una unidad. Al llegar a MAX_PROGRESO, se pone el contador a 0 y se sube el nivel.

Cuando corrijas tu código te comento si quieres cómo puedes hacer que aumente la dificultad con cada nivel.

dmnt82

intente modificar el programa me explicaban, pero no pude

char nave[][]=
                   {
                     { " ***   " },   
                     { " ** *  " },
                     { " ***   " }
                   };


pero no me sale lo inicie todo de nuevo pero de ahi me marca error, para ser sincera, no se usar aun la matriz :s,  tal vez por eso no me sale...

yo se que el mio que hize es muy repetido o.ó y complicado, que hasta yo me en redo, pero de que funciona si, pero aqui les dejo esto:



aquí es cuando se termina el juego y se para ahi los anroides o.o esa es mi duda, como hacer para que no se quede ahí



eso me sale con mi programa que tengo yo


#include <windows.h>
#include <iostream>
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

#define ARR 72
#define ABA 80
#define IZQ 75
#define DER 77


char nave_l1[]={' ','*','*', ' ',' ',' ',' ',0};  // dibujo de la nave     
char nave_l2[]={' ','*','*', '*',' ',' ',' ',0};
char nave_l3[]={' ','*','*', ' ',' ',' ',' ',0};

char explosion_l1[]={' ',' ','*','*',' ',' ',' ',0};     
char explosion_l2[]={' ','*','*','*','*',' ',' ',0};   //explosion de la nave
char explosion_l3[]={' ',' ','*','*',' ',' ',' ',0};

char explosion_r1[]={'*',' ','*','*',' ','*',' ',0};       
char explosion_r2[]={' ','*','*','*','*',' ',' ',0};  //la segunda explosion
char explosion_r3[]={'*',' ','*','*',' ','*',' ',0};

char borrar_nave[]={' ',' ',' ',' ',' ',' ',' ',0}; // cuando se borra

//numero de vidas
int Num_vidas = 3;
int Corazones = 3;
//cordenandas de la nave
int ix = 1;
int iy = 19;

//cordenandas de los asteroides o diamantes
int y = 8, x = 45;
int yy = 18 , xx = 71;
int xl = 58 , yl = 6;
int xr = 70, yr = 9;

int i,v;

//para cambiar de nivel del juego
int repeticion = 0, nivel =1;
bool condicion = false;

//aplicacion de libreria de windows
void gotoxy(int x, int y)
{
     HANDLE hCon;
     COORD dwPos;
     
     dwPos.X = x;
     dwPos.Y = y;
     
     hCon = GetStdHandle(STD_OUTPUT_HANDLE);
     SetConsoleCursorPosition(hCon,dwPos);
     
}     
//nombrar las vidas
void vidas(int vi)
{
     gotoxy(2,1); printf("VIDAS %d",vi);
}

void Barra_salud(int n)
{
     gotoxy(72,1);printf(" ");
     gotoxy(73,1);printf(" ");
     gotoxy(74,1);printf(" ");
     
     for(v = 0 ; v < n ; v++)
     {
       gotoxy(72+v,1);
       printf("%c",3);
      }   
}
//explosion de la nave al ser atacado por los asteroides...
void Explosion(void)
{
     gotoxy(ix,iy);   puts(explosion_l1);
     gotoxy(ix,iy+1); puts(explosion_l2);
     gotoxy(ix,iy+2); puts(explosion_l3);
     
     Sleep(380);
     
     gotoxy(ix,iy);   puts(explosion_r1);
     gotoxy(ix,iy+1); puts(explosion_r2);
     gotoxy(ix,iy+2); puts(explosion_r3);
     
     Sleep(380);
     
     gotoxy(ix,iy);   puts(nave_l1);
     gotoxy(ix,iy+1); puts(nave_l2);
     gotoxy(ix,iy+2); puts(nave_l3);
     
}     
//el inicio del juego con los asteroides
void jugar(void)
{
     //rutina de los diamantes
     
      gotoxy(x,y);   printf("%c",4);
      gotoxy(xx,yy); printf("%c",4);
      gotoxy(xl,yl); printf("%c",4);
      gotoxy(xr,yr); printf("%c",4);
     
      Sleep(90);
     
      gotoxy(x,y);   printf(" ");
      gotoxy(xx,yy); printf(" ");
      gotoxy(x1,yl); printf(" ");
      gotoxy(xr,yr); printf(" ");
     
      //%90 es el tiempo que se usa...
      if (y > 20)
      {
            y = 6;
            x = (rand() % 90) + 6;

            //la condicion de "cambio de nivel de game"             
            if( x== 6)
            condicion =false;
           
      }
      if(yy >20)
      {
            yy = 6;
            xx = (rand() % 90) + 6;
           
      }
      if(y1 >20)
      {
            yl = 6;
            xl = (rand() % 90) + 6;
           
      }
      if(yr >20)
      {
            yr = 6;
            xr = (rand() % 90) + 6;
           
            }
     
     
      //rutina de mover la nave
      if (kbhit())
      {
                 unsigned char tecla = getch();
                 
                 switch (tecla)
                 {         
                        case ARR:
                             
                             if(iy > 4)
                             {
                                  gotoxy(ix,iy);puts(borrar_nave);
                                  gotoxy(ix,iy+1);puts(borrar_nave);
                                  gotoxy(ix,iy+2);puts(borrar_nave);
                                 
                                  iy -=2;//iy = iy -2;
                                 
                                  gotoxy(ix,iy);puts(nave_l1);
                                  gotoxy(ix,iy+1);puts(nave_l2);
                                  gotoxy(ix,iy+2);puts(nave_l3);
                                 
                              }
                             break;
                             
                       case ABA:
                           
                            if( iy <20)
                            {
                                  gotoxy(ix,iy);puts(borrar_nave);
                                  gotoxy(ix,iy+1);puts(borrar_nave);
                                  gotoxy(ix,iy+2);puts(borrar_nave);
                                 
                                  iy +=2;//iy = iy +2;
                                 
                                  gotoxy(ix,iy);puts(nave_l1);
                                  gotoxy(ix,iy+1);puts(nave_l2);
                                  gotoxy(ix,iy+2);puts(nave_l3);
                                   
                            }
                            break;
                                 
                         case IZQ:
                             
                             if(ix > 4)
                             {
                                  gotoxy(ix,iy);puts(borrar_nave);
                                  gotoxy(ix,iy+1);puts(borrar_nave);
                                  gotoxy(ix,iy+2);puts(borrar_nave);
                                 
                                  ix -=2;//ix = ix -2;
                                 
                                  gotoxy(ix,iy);puts(nave_l1);
                                  gotoxy(ix,iy+1);puts(nave_l2);
                                  gotoxy(ix,iy+2);puts(nave_l3);
                                 
                              }
                             break;
                         
                          case DER:
                             
                             if(ix <20)
                             {
                                  gotoxy(ix,iy);puts(borrar_nave);
                                  gotoxy(ix,iy+1);puts(borrar_nave);
                                  gotoxy(ix,iy+2);puts(borrar_nave);
                                 
                                  ix +=2;//ix = ix +2;
                                 
                                  gotoxy(ix,iy);puts(nave_l1);
                                  gotoxy(ix,iy+1);puts(nave_l2);
                                  gotoxy(ix,iy+2);puts(nave_l3);
                                 
                              }
                             break;           
                 } //fin del switch
                 
      }// Fin if
     
      //rutina para golpes de asteroides 
      if(( x > ix && x<ix + 6 && y == iy-1)|| (x > ix && xx<ix + 6 && yy == iy-1)
          || (xl > ix && xx < ix + 6 && yl == iy-1)|| (xr > ix && xr<ix  + 6 && yr == iy-1))
          {
                 //donde se va disminuyendo las vidas
                 Corazones --;
                 Barra_salud(Corazones);
                 
          }
           
           
      gotoxy(ix,iy);puts(nave_l1);       
      gotoxy(ix,iy+1);puts(nave_l2);
      gotoxy(ix,iy+2);puts(nave_l3);
     
      //numero de vidas restantes
      if(!Corazones)
      {
                     Num_vidas--;
                     vidas(Num_vidas);
                     Explosion();
                     Corazones =3;
                     
                     Barra_salud(Corazones);
                     
      }
     
      //rutina para cambio de nivel
     
      if(!condicion)
      {
        repeticion --;
        //condicionc = true;
      }
      if(repeticion == 4)
      {
          nivel++;
          gotoxy(35,1); printf("NIVEL %i",nivel);               
     
          gotoxy(ix,iy); puts(borrar_nave);     
          gotoxy(ix,iy); puts(borrar_nave);   
          gotoxy(ix,iy); puts(borrar_nave);   
         
          iy -= 2; //iy = iy - 2;
         
          gotoxy(ix,iy); puts(nave_l1);     
          gotoxy(ix,iy); puts(nave_l2);   
          gotoxy(ix,iy); puts(nave_l3);
         
          repeticion = 0;
         
               
      }
      //inicio de los asteroides de derecha a izquieda
      x--;
      xx--;
      xl--;
      xr--;
     
}

int main ()
{
    vidas(Num_vidas);
    Barra_salud(Corazones);
    //cambio de nivel
    gotoxy(35,1); printf("NIVEL %i",nivel);   
   
    gotoxy(ix,iy);puts(nave_l1);
    gotoxy(ix,iy+1);puts(nave_l2);
    gotoxy(ix,iy+2);puts(nave_l3);
   
   
    //ciclo donde al llegar al 6 se termina el juego
    while(Num_vidas > 0 && nivel <= 5 )
         jugar();
   
         
     gotoxy(22,16); printf("Game Over");
     //tiempo lo que dura el juego
     Sleep(120); 
     
    getch();
    return 0;
   
}


solucione el problema de la nave que se duplicaba, pero ahora no cambia de nivel como muestra la imagen 2 y esos son mis unicos problemas que no llego a solucionar... 

eferion


      if(!condicion)
      {
        repeticion --;
        //condicionc = true;
      }
      if(repeticion == 4)
      {
          nivel++;
          gotoxy(35,1); printf("NIVEL %i",nivel);               

          gotoxy(ix,iy); puts(borrar_nave);     
          gotoxy(ix,iy); puts(borrar_nave);   
          gotoxy(ix,iy); puts(borrar_nave);   

          iy -= 2; //iy = iy - 2;

          gotoxy(ix,iy); puts(nave_l1);     
          gotoxy(ix,iy); puts(nave_l2);   
          gotoxy(ix,iy); puts(nave_l3);

          repeticion = 0;


      }


Partiendo de ese código... si lo resumimos para quedarnos con lo importante tenemos:


      if(!condicion)
      {
        repeticion --;
      }
      if(repeticion == 4)
      {
          nivel++;
          repeticion = 0;
      }


Dicho de otra forma... coges un int ( 2^32 combinaciones = 4.294.967.296 combinaciones ) y lo vas decrementando empezando por cero... es decir, de 0 a 4 pasando primero por negativos... tendrías que jugar unos 4.300 millones de turnos para que te cambie de nivel.

En serio, renombra esas variables... no es tan complicado y queda un código más sencillo de seguir:


#include <windows.h>
#include <iostream>
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

#define ARR 72
#define ABA 80
#define IZQ 75
#define DER 77

#define CHAR_SALUD    3
#define CHAR_DIAMANTE 4
#define CHAR_BLANCO   ' '

#define MAX_CORAZONES 3
#define MAX_DIAMANTES 25
#define MAX_PROGRESO  1000
#define MAX_VIDAS     3

#define AVANCE        2

typedef struct
{
  int x;
  int y;
} Coordenadas;

typedef struct
{
  Coordenadas coord_nave;
  Coordenadas coord_diamantes[ MAX_DIAMANTES ];

  int num_vidas;
  int corazones;
  int nivel;
  int progreso;
} DatosJuego;

// Dibujo de la nave
char *nave[]        = { " ***  ", " ** * ", " ***  " };
char *nave_vacia[]  = { "      ", "      ", "      " };
char *explosion1[]  = { "  **  ", " **** ", "  **  " };
char *explosion2[]  = { "* ** *", " **** ", "* ** *" };

void inicializar( DatosJuego* datos_juego )
{
  memset( datos_juego, 0, sizeof( DatosJuego ) );

  datos_juego->coord_nave.x = 1;
  datos_juego->coord_nave.y = 19;

  datos_juego->num_vidas = MAX_VIDAS;
  datos_juego->corazones = MAX_CORAZONES;
  datos_juego->nivel = 1;
}

void gotoxy(int x, int y)
{
  HANDLE hCon;
  COORD dwPos;

  dwPos.X = x;
  dwPos.Y = y;

  hCon = GetStdHandle( STD_OUTPUT_HANDLE );
  SetConsoleCursorPosition( hCon, dwPos );
}

void pintar_nave( Coordenadas coord, char* patron[] )
{
  int i;
  for ( i=0; i<3; i++ )
  {
    gotoxy( coord.x, coord.y + i );
    puts( patron[ i ] );
  }
}

void pintar_nivel( int nivel )
{
  gotoxy( 35, 1 );
  printf( "NIVEL: %d", nivel );
}

void pintar_vidas( int vidas )
{
   gotoxy( 2, 1 );
   printf( "VIDAS %d", vidas );
}

void pintar_salud( int salud )
{
  int i;

  gotoxy( 72, 1 );

  for( i = 0; i < salud; i++ )
    putchar( CHAR_SALUD );

  for ( ; i < 3; i++ )
    putchar( CHAR_BLANCO );
}

void pintar_explosion( Coordenadas coord )
{
  int i;

  for ( i = 0; i < 3; i++ )
  {
    gotoxy( coord.x, coord.y + i );
    puts( explosion1[ i ] );
  }

  Sleep( 380 );

  for ( i = 0; i < 3; i++ )
  {
    gotoxy( coord.x, coord.y + i );
    puts( explosion2[ i ] );
  }

  Sleep(380);

  pintar_nave( coord, nave );
}

void reiniciar_diamante( Coordenadas* coord )
{
  gotoxy( coord->x, coord->y );
  putchar( CHAR_BLANCO );

  if ( coord->x == 0 )
  {
    // Este codigo permite que los asteroides salgan repartidos
    // por el escenario al inicio de la partida
    coord->x = ( rand( ) % 50 ) + 29;
  }
  else
    coord->x = 79;

  coord->y = (rand( ) % 20 ) + 5;
}

void mover_diamante( Coordenadas* coord )
{
  gotoxy( coord->x, coord->y );
  putchar( CHAR_BLANCO );

  if ( coord->x < 2 )
    reiniciar_diamante( coord );
  else
    coord->x--;

  gotoxy( coord->x, coord->y );
  putchar( CHAR_DIAMANTE );
}

int colision( Coordenadas coord_nave, Coordenadas coord_diamante )
{
  int to_return = 0;

  // Comprobamos que el asteroide esta en la misma vertical que
  // la nave
  if ( ( coord_diamante.y >= coord_nave.y )
    && ( coord_diamante.y <= coord_nave.y + 2 ) )
  {
    // Ahora se comprueba si esta en la misma horizontal
    if ( ( coord_diamante.x <= coord_nave.x + 5 )
      && ( coord_diamante.x > coord_nave.x ) )
    {
      to_return = 1;
    }
  }

  return to_return;
}

void jugar( DatosJuego* datos_juego )
{
  //rutina de los diamantes

  int i;
  for ( i = 0; i < MAX_DIAMANTES; i++ )
    mover_diamante( &datos_juego->coord_diamantes[ i ] );

  //rutina de mover la ave
  if( _kbhit( ) )
  {
    unsigned char tecla = _getch( );

    switch (tecla)
    {
      case ARR:
        if ( datos_juego->coord_nave.y > 4 )
        {
          pintar_nave( datos_juego->coord_nave, nave_vacia );
          datos_juego->coord_nave.y -= AVANCE;
        }
        break;

      case ABA:

        if (datos_juego->coord_nave.y < 20 )
        {
          pintar_nave( datos_juego->coord_nave, nave_vacia );
          datos_juego->coord_nave.y += AVANCE;
        }
        break;

      case IZQ:
        if( datos_juego->coord_nave.x > 4 )
        {
          pintar_nave( datos_juego->coord_nave, nave_vacia );
          datos_juego->coord_nave.x -= AVANCE;
        }
        break;

      case DER:
        if( datos_juego->coord_nave.x < 70 )
        {
          pintar_nave( datos_juego->coord_nave, nave_vacia );
          datos_juego->coord_nave.x += AVANCE;
        }
        break;
    } //fin del switch
  }// Fin if

  pintar_nave( datos_juego->coord_nave, nave );

  //rutina para golpes de metoritos
  for ( i = 0; i < MAX_DIAMANTES; i++ )
  {
    if ( colision( datos_juego->coord_nave, datos_juego->coord_diamantes[ i ] ) )
    {
      reiniciar_diamante( &datos_juego->coord_diamantes[ i ] );
      pintar_nave( datos_juego->coord_nave, nave );

      datos_juego->corazones--;

      if( datos_juego->corazones == 0 )
      {
        datos_juego->num_vidas--;
        datos_juego->corazones = MAX_CORAZONES;
        pintar_vidas( datos_juego->num_vidas );
        pintar_explosion( datos_juego->coord_nave );
      }

      pintar_salud( datos_juego->corazones );
      break;
    }
  }

  /*rutina para cambio de nivel*/
  if ( datos_juego->progreso == MAX_PROGRESO )
  {
    datos_juego->nivel++;
    pintar_nivel( datos_juego->nivel );
    datos_juego->progreso = 0;
  }
  else
    datos_juego->progreso++;
}

int main ()
{
  DatosJuego datos_juego;

  inicializar( &datos_juego );

  pintar_vidas( datos_juego.num_vidas );
  pintar_salud( datos_juego.corazones );

  pintar_nivel(datos_juego.nivel );
  pintar_nave( datos_juego.coord_nave, nave );

  while( datos_juego.num_vidas > 0 )
  {
    jugar( &datos_juego );

    int sleep = 80 - datos_juego.nivel * 10;
    if ( sleep < 10 )
      sleep = 10;
    Sleep( sleep );
  }


  gotoxy( 30, 11 );
  puts( "*******************" );
  gotoxy( 30, 12 );
  puts( "*    Game Over    *" );
  gotoxy( 30, 13 );
  puts( "*******************" );

  gotoxy( 0, 24 );
  _getch( );
  return EXIT_SUCCESS;
}


nolasco281

Muy bueno  :D ma~nana lo veo con mas tiempo el codigo. Gracias.

Lo que se puede imaginar... se puede programar.

dmnt82

 :o :o Muchas gracias!! has salvado mi alma de satanás >_<'
muchas gracias y perdona las molestias.... >-<' :-[