Autor
|
Tema: problema con el game en dev c++ (Leído 5,532 veces)
|
dmnt82
Desconectado
Mensajes: 4
|
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; }
|
|
« Última modificación: 21 Marzo 2014, 02:13 am por dmnt82 »
|
En línea
|
|
|
|
eferion
Desconectado
Mensajes: 1.248
|
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; 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; }
La pantalla tiene 80 columnas ( X ) no 80 filas ( Y ). Pondré más cosillas cuando tenga tiempo...
|
|
« Última modificación: 20 Marzo 2014, 12:03 pm por eferion »
|
En línea
|
|
|
|
amchacon
Desconectado
Mensajes: 1.211
|
Veo un uso excesivo del gotoxy: 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: 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: char ave[][]= { {' ','*','*', '*',' ',' ',' ',0}, // dibujo de la nave {' ','*','*', ' ','*',' ',' ',0}, {' ','*','*', '*',' ',' ',' ',0} };
O incluso con comillas dobles: 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.
|
|
|
En línea
|
|
|
|
Yoel Alejandro
|
Ah, .... y debe ser "explosion", no "explocion". Se que es una nimiedad, pero nunca está demás
|
|
|
En línea
|
Saludos, Yoel. P.D..- Para mayores dudas, puedes enviarme un mensaje personal (M.P.)
|
|
|
dmnt82
Desconectado
Mensajes: 4
|
//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):
|
|
|
En línea
|
|
|
|
eferion
Desconectado
Mensajes: 1.248
|
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 ); } }
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 ); } }
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); 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.
|
|
« Última modificación: 20 Marzo 2014, 22:26 pm por eferion »
|
En línea
|
|
|
|
dmnt82
Desconectado
Mensajes: 4
|
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); } } //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 (xx ,yy ); printf("%c",4); gotoxy (xl ,yl ); printf("%c",4); gotoxy (xr ,yr ); printf("%c",4); Sleep(90); //%90 es el tiempo que se usa... if (y > 20) { y = 6; //la condicion de "cambio de nivel de game" if( x== 6) condicion =false; } if(yy >20) { yy = 6; } if(y1 >20) { yl = 6; } if(yr >20) { yr = 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); 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...
|
|
|
En línea
|
|
|
|
eferion
Desconectado
Mensajes: 1.248
|
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 ); } } void pintar_nivel( int nivel ) { gotoxy( 35, 1 ); } void pintar_vidas( int vidas ) { gotoxy( 2, 1 ); } void pintar_salud( int salud ) { int i; gotoxy( 72, 1 ); for( i = 0; i < salud; i++ ) for ( ; i < 3; i++ ) } void pintar_explosion( Coordenadas coord ) { int i; for ( i = 0; i < 3; i++ ) { gotoxy( coord.x, coord.y + i ); } Sleep( 380 ); for ( i = 0; i < 3; i++ ) { gotoxy( coord.x, coord.y + i ); } Sleep(380); pintar_nave( coord, nave ); } void reiniciar_diamante( Coordenadas* coord ) { gotoxy( coord->x, coord->y ); 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 ); if ( coord->x < 2 ) reiniciar_diamante( coord ); else coord->x--; gotoxy( coord->x, coord->y ); } 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 ); gotoxy( 30, 13 ); puts( "*******************" ); gotoxy( 0, 24 ); _getch( ); return EXIT_SUCCESS; }
|
|
|
En línea
|
|
|
|
nolasco281
Desconectado
Mensajes: 319
|
Muy bueno ma~nana lo veo con mas tiempo el codigo. Gracias.
|
|
|
En línea
|
Lo que se puede imaginar... se puede programar.
|
|
|
dmnt82
Desconectado
Mensajes: 4
|
Muchas gracias!! has salvado mi alma de satanás >_<' muchas gracias y perdona las molestias.... >-<'
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Game boy pasó de moda...GAME MAN !
Juegos y Consolas
|
skapunky
|
3
|
4,463
|
28 Junio 2007, 13:57 pm
por peib0l
|
|
|
[Batch Game] Adventure Game - by SmartGenius
Scripting
|
SmartGenius
|
0
|
3,456
|
17 Julio 2009, 06:15 am
por SmartGenius
|
|
|
[Batch Game] The Pair Game - by SmartGenius
Scripting
|
SmartGenius
|
5
|
6,098
|
10 Agosto 2010, 23:36 pm
por DA KILLER
|
|
|
Problema capturadora Avermedia Game Capture Portable
Multimedia
|
RabyzHacks
|
0
|
5,377
|
25 Diciembre 2013, 10:28 am
por RabyzHacks
|
|
|
MOVIDO: Problema capturadora Avermedia Game Capture Portable
Dudas Generales
|
Songoku
|
0
|
1,505
|
25 Diciembre 2013, 13:58 pm
por Songoku
|
|