domingo, 25 de agosto de 2013

JUEGO DEL GUSANO EN C++

JUEGO DEL GUSANO EN C++

#include<iostream.h> #include<conio.h> #include<dos.h> #include<ctype.h> #include<stdlib.h> #include<stdio.h> #include<bios.h> struct player{ int anillos; //Es el numero de anillos del gusano. int vidas; int puntos; int x[320], y[320]; /* 120 es la maxima longitud del gusano. En estas dos variables se guardan todas las coordenadas x e y del gusano */ int direccion; // 1 arriba, 2 abajo, 3 izquierda, 4 derecha. int repetir; // Contador que suma puntos y al llegar a un limite:vida extra. int gameover; }; struct player pl[2]; int matriz[40][80]; //todas las coordenadas de la pantalla. int manzanas,nivel=1; int num; int ordenador; // Si juegas a 1 player ordenador=1 y el otro gusano lo // maneja el ordenador class gusano{ public: gusano(); void presentacion(); void setjugador(int); void niveles(); void inicializa_pantalla(); void inicializa_gusano(int); void pantalla(); void imprime(int); int teclado(); void crece(int); void pasada(); void cambio_de_coordenadas(int); int cambio_de_direccion(int); void suma_puntos(int); void unavidamenos(int); void unavidamas(int); void final(); ~gusano(); }; gusano::gusano() { // Constructor clrscr(); nivel=1; pl[0].vidas=3; pl[0].puntos=0; pl[1].vidas=3; pl[1].puntos=0; pl[0].gameover=0; pl[1].gameover=0; pl[0].repetir=0; pl[1].repetir=0; ordenador=0; manzanas=75; num=0; } gusano::~gusano(){ clrscr(); } void gusano::setjugador(int que_jugador){ num=que_jugador; } void gusano::inicializa_pantalla() { clrscr(); int n,m,x,y; for(n=0;n<40;n++) { //Inicializacion de la pantalla a 0 for(m=0;m<80;m++) { matriz[n][m]=0; } } // la cantidad de comida que sale en pantalla niveles(); for(n=0;n<manzanas;n++) { do{ y=random(35)+3; x=random(76)+2; }while(matriz[y][x]!=0); matriz[y][x]=5; } do{ y=random(35)+3; x=random(76)+2; }while(matriz[y][x]!=0); matriz[y][x]=10; //vida extra } void gusano::inicializa_gusano(int num) { //gotoxy(20,20);cout<<"\n\ninicializando el gusano pl"<<num; int n; for(n=1;n<320;n++) { // Inicializacion a 0 de todo el vector gusano menos la 0 pl[num].x[n]=0; pl[num].y[n]=0; } if(num==0) { if(pl[0].vidas<1)unavidamenos(num); pl[0].anillos=1; pl[0].x[0]=5; // El elemento 0 de x e y es el principio del gusano pl[0].y[0]=8; pl[0].direccion=4; } if(num==1) { if(pl[1].vidas<1&&ordenador!=1)unavidamenos(num); pl[1].anillos=1; pl[1].x[0]=74; pl[1].y[0]=34; pl[1].direccion=3; if(ordenador==1) { gotoxy(45,1); textattr(15<<1); cprintf(" GAME OVER "); textattr(0); } } } void gusano::pantalla() { int n,m,color; char c=3; color=random(5)+9; _setcursortype(_NOCURSOR); gotoxy(34,20); textcolor(color); cprintf("N I V E L %d",nivel); delay(1300); gotoxy(34,20);cout<<" "; for(n=1;n<40;n++) { for(m=1;m<80;m++) { gotoxy(m,n); if(matriz[n][m]==5) { // Dibuja una "manzana" textcolor(14); cprintf("O"); } if(matriz[n][m]==10) { // Dibuja un corazon textcolor(LIGHTRED); cprintf("%c",c); } if(matriz[n][m]==1) { //Dibuja un trozo de muro textcolor(color); cprintf("%c",178); } } } for(n=1;n<=80;n++) { // la barra azul de arriba textattr(15<<1);gotoxy(n,1);cprintf(" "); } gotoxy(5,1);cprintf("JUGADOR 1: Vidas:"); // jugador 1 gotoxy(24,1);cprintf("%d Puntos:",pl[0].vidas); gotoxy(35,1);cprintf("%d",pl[0].puntos); gotoxy(45,1);cprintf("JUGADOR 2: Vidas:"); gotoxy(64,1);cprintf("%d Puntos:",pl[1].vidas); gotoxy(75,1);cprintf("%d",pl[1].puntos); textattr(0); } void gusano::imprime(int num) { int n; for(n=0;n<320;n++) { if (pl[num].x[n]!=0 && pl[num].y[n]!=0) gotoxy(pl[num].x[n],pl[num].y[n]); if (pl[num].x[n]==0 && pl[num].y[n]==0) { gotoxy (pl[num].x[n-1], pl[num].y[n-1]); cout<<" "; matriz[pl[num].y[n-1]][pl[num].x[n-1]]=0; // Al borrar algo de la pantalla, se borra de la matriz pantalla break; } if(n==0&&num==0)textcolor(LIGHTCYAN); if(n==0&&num==1)textcolor(LIGHTGREEN); cprintf("@"); textcolor(random(14)+1); matriz[pl[num].y[n]][pl[num].x[n]]=1; //Cuando se dibuja un anillo del gusano, la casilla //de la pantalla correspondiente a la de la coordenada //del anillo pasa de ser 0 a ser 1. } delay(55-nivel*4); } int gusano::teclado() { // Ensamblador puro y duro: __asm { mov ah,01h // ; function 1: is a key ready? int 16h // ; call the interrupt jz empty // ; there was no key so exit mov ah,00h // ; function 0: get the scan code please int 16h // ; call the interrupt mov al,ah // ; result was in ah so put into al xor ah,ah // ; zero out ah jmp done // ; data's in ax...let's blaze! empty: xor ax,ax // ; clear out ax i.e. 0 means no key done: } } void gusano::cambio_de_coordenadas(int num) { // segun la direccion for(int n=pl[num].anillos;n>=1;n--) { //cada x y cada y del gusano pl[num].x[n]=pl[num].x[n-1]; //se convierte en el que esta mas adelantado pl[num].y[n]=pl[num].y[n-1]; } if(pl[num].direccion==1) { pl[num].y[0]--; // va hacia arriba if(pl[num].y[0]<=1)pl[num].y[0]=39; //si sube al tope sale por abajo if(matriz[pl[num].y[0]][pl[num].x[0]]==1)unavidamenos(num); if(matriz[pl[num].y[0]][pl[num].x[0]]==10)unavidamas(num); if(matriz[pl[num].y[0]][pl[num].x[0]]==5) { pl[num].anillos++;manzanas--;suma_puntos(num);pasada(); } //come } if(pl[num].direccion==2) { pl[num].y[0]++; //abajo if(pl[num].y[0]>=39)pl[num].y[0]=2; if(matriz[pl[num].y[0]][pl[num].x[0]]==1)unavidamenos(num); if(matriz[pl[num].y[0]][pl[num].x[0]]==10)unavidamas(num); if(matriz[pl[num].y[0]][pl[num].x[0]]==5){ pl[num].anillos++;manzanas--;suma_puntos(num);pasada(); } } if(pl[num].direccion==3) { pl[num].x[0]--; //izquierda if(pl[num].x[0]<=1)pl[num].x[0]=79; if(matriz[pl[num].y[0]][pl[num].x[0]]==1)unavidamenos(num); if(matriz[pl[num].y[0]][pl[num].x[0]]==10)unavidamas(num); if(matriz[pl[num].y[0]][pl[num].x[0]]==5) { pl[num].anillos++;manzanas--;suma_puntos(num);pasada(); } } if(pl[num].direccion==4) { pl[num].x[0]++; //derecha if(pl[num].x[0]>=79)pl[num].x[0]=1; if(matriz[pl[num].y[0]][pl[num].x[0]]==1)unavidamenos(num); if(matriz[pl[num].y[0]][pl[num].x[0]]==10)unavidamas(num); if(matriz[pl[num].y[0]][pl[num].x[0]]==5) { pl[num].anillos++;manzanas--;suma_puntos(num);pasada(); } } } int gusano::cambio_de_direccion(int num) // Respuesta al teclado { int tecla=teclado(); char s; if(tecla==1) { // ESCAPE do{ gotoxy(25,39); textcolor(15); cprintf("SEGURO QUE QUIERES ABANDONAR? (S/N)"); s=tolower(getch()); if(s=='n') { gotoxy(25,39); textcolor(0);cprintf(" "); goto cont; } if(s=='s')return(7); }while(s!='s'||s!='n'); } cont: // JUGADOR 1 if(tecla==72) { // Cursor Arriba if(pl[0].anillos==1)pl[0].direccion=1; if(pl[0].anillos>1&&pl[0].direccion!=2)pl[0].direccion=1; } if(tecla==80) { // Abajo if(pl[0].anillos==1)pl[0].direccion=2; if(pl[0].anillos>1&&pl[0].direccion!=1)pl[0].direccion=2; } if(tecla==75) { // Izquierda if(pl[0].anillos==1)pl[0].direccion=3; if(pl[0].anillos>1&&pl[0].direccion!=4)pl[0].direccion=3; } if(tecla==77) { // Derecha if(pl[0].anillos==1)pl[0].direccion=4; if(pl[0].anillos>1&&pl[0].direccion!=3)pl[0].direccion=4; } // JUGADOR 2 if(tecla==23) { // I if(pl[1].anillos==1)pl[1].direccion=1; if(pl[1].anillos>1&&pl[1].direccion!=2)pl[1].direccion=1; } if(tecla==37) { // Abajo if(pl[1].anillos==1)pl[1].direccion=2; if(pl[1].anillos>1&&pl[1].direccion!=1)pl[1].direccion=2; } if(tecla==36) { // Izquierda if(pl[1].anillos==1)pl[1].direccion=3; if(pl[1].anillos>1&&pl[1].direccion!=4)pl[1].direccion=3; } if(tecla==38) { // Derecha if(pl[1].anillos==1)pl[1].direccion=4; if(pl[1].anillos>1&&pl[1].direccion!=3)pl[1].direccion=4; } if(tecla==34) { for(int n=0;n<40;n++) { gotoxy(1,n+1);cout<<"\nx["<<n<<"]="<<pl[0].x[n]; cout<<", y["<<n<<"]="<<pl[0].y[n]; } } if(ordenador==1) { // el gusano que maneja el ordenador int num=random(15); // se mueve de una forma int dir=random(4)+1; // un poquillo aleatoria if(num==5) { if(dir==1&&pl[1].direccion!=2)pl[1].direccion=1; if(dir==2&&pl[1].direccion!=1)pl[1].direccion=2; if(dir==3&&pl[1].direccion!=4)pl[1].direccion=3; if(dir==4&&pl[1].direccion!=3)pl[1].direccion=4; } if(pl[1].direccion==1&&matriz[pl[1].y[0]-1][pl[1].x[0]]==1)pl[1].direccion=4; if(pl[1].direccion==2&&matriz[pl[1].y[0]+1][pl[1].x[0]]==1)pl[1].direccion=3; if(pl[1].direccion==3&&matriz[pl[1].y[0]][pl[1].x[0]-1]==1)pl[1].direccion=2; if(pl[1].direccion==4&&matriz[pl[1].y[0]][pl[1].x[0]+1]==1)pl[1].direccion=1; } } void gusano::suma_puntos(int num) { int repetir; // para que te den una vida al ir sumando puntos pl[num].puntos+=10; pl[num].repetir+=10; sound(600); delay(1); nosound(); if(pl[num].vidas>=1) { if(num==0)gotoxy(35,1); if(num==1)gotoxy(75,1); textattr(15<<1); cprintf("%d",pl[num].puntos); textattr(0); if(pl[num].repetir>=1000) { unavidamas(num); pl[num].repetir=0; } } } void gusano::unavidamenos(int num) { int n; for(n=0;n<=pl[num].anillos;n++) { gotoxy(pl[num].x[n],pl[num].y[n]); // el cursor va a la coordenada de cada anillo de gusano cprintf(" "); // e imprime un espacio en su lugar matriz[pl[num].y[n]][pl[num].x[n]]=0; // lo borro de la matriz pantalla } pl[num].vidas--; // una vida menos for(n=1;n<7;n++) { sound(220+n*50); delay(1); nosound(); } if(pl[num].vidas<1)pl[num].gameover=1; if(pl[1].vidas<1&&ordenador==1)pl[1].gameover=1; if(pl[num].gameover==1) { if(num==0)gotoxy(5,1); if(num==1)gotoxy(45,1); textattr(15<<1); cprintf(" GAME OVER "); if(num==1&&ordenador==1)pl[1].gameover=0; } if(pl[num].gameover==0) { inicializa_gusano(num); if(num==1&&ordenador==1)goto fin; textattr(15<<1); if(num==0)gotoxy(24,1); if(num==1)gotoxy(64,1); cprintf("%d",pl[num].vidas); } textattr(0); textcolor(15); fin: } void gusano::unavidamas(int num) { int a; pl[num].vidas++; if(num==0)gotoxy(24,1); if(num==1)gotoxy(64,1); textattr(15<<1); for(a=1;a<7;a++) { sound(340+a*80); delay(5); nosound(); } cprintf("%d",pl[num].vidas); textattr(0); } void gusano::pasada() { if(manzanas<15) { manzanas=35*nivel+90; nivel++; inicializa_pantalla(); pantalla(); niveles(); inicializa_gusano(0); inicializa_gusano(1); } } void gusano::presentacion() { textmode(C4350); _setcursortype(_NOCURSOR); char megaworm[16]="M E G A W O R M"; int a; randomize(); textcolor(14); gotoxy(30,15); cprintf("%s",megaworm); gotoxy(29,16); cprintf("------------------"); gotoxy(33,21); textcolor(10); cprintf("Opciones:"); textcolor(14); gotoxy(24,25); cprintf("F1 - UN JUGADOR");textcolor(CYAN); cprintf(" Teclas: CURSORES"); gotoxy(24,26); textcolor(14); cprintf("F2 - DOS JUGADORES");textcolor(CYAN); cprintf(" Teclas: I,J,K,L"); gotoxy(24,27); textcolor(14); cprintf("ESC - SALIR"); gotoxy(1,35); textcolor(7); cprintf("\n\n\nSi quereis ver nuevas mejoras y programillas que vaya haciendo, visitar:"); textcolor(11); gotoxy(20,38); cprintf("\n\n http://perso.wanadoo.es/ramz"); for(;;) { for(a=16;a>=0;a--) { gotoxy(30+a,20); cprintf(" "); gotoxy(30+a,14); cprintf("%c",megaworm[a]); delay(20); gotoxy(30+a,14); cprintf(" "); gotoxy(30+a,15); textcolor(random(13)+2); cprintf("%c",megaworm[a]); delay(20); int tecla=teclado(); if(tecla==1)exit(1); if(tecla==59){pl[1].vidas=-1;ordenador=1;goto fin;} if(tecla==60)goto fin; } } fin: } void gusano::niveles() { int n,a; if(nivel>5)final(); switch (nivel){ case 1:{ for(n=20;n<38;n++) { // NIVEL 1 matriz[12][n]=1; // 2 barras horizontales matriz[24][n+18]=1; } break; } case 2:{ for(a=1;a<3;a++) { //NIVEL 2 for(n=0;n<13;n++) { // 2 barras verticales matriz[n+12][a*25]=1; } } break; } case 3:{ for(a=0;a<20;a++) { //NIVEL 3 for(n=0;n<15;n++) { // Un cuadrado matriz[n+15][a+30]=1; } } break; } case 4:{ //NIVEL 4 for(a=14;a<27;a++) { matriz[a][55]=1; matriz[a-3][35]=1;} for(n=30;n<56;n++) { matriz[26][n]=1; matriz[23][n-21]=1; } break; } case 5:{ for(a=10;a<34;a++) { matriz[a][20]=1; matriz[a][60]=1; } for(a=21;a<61;a++) { matriz[10][a]=1; matriz[33][a]=1; } for(a=35;a<46;a++) matriz[33][a]=0; break; } default: break; } } void gusano::final() { clrscr(); delay(3000); for(;;){ int color=random(7)+8; gotoxy(24,17); textcolor(color); cprintf("Uau! Lo has/habeis conseguido!"); textcolor(10); gotoxy(12,20); cprintf(" Pues esto es todo lo que hay, asi que tendras/tendreis que esperar "); gotoxy(12,21); cprintf("a que haga mas pantallas o jugar al Space Walls"); textcolor(9); gotoxy(18,30); cprintf("\n Pulsa cualquier tecla para salir"); delay(10); if(teclado()!=0)exit(0); } } ///////////////////////////////////// MAIN /////////////////////////////////////////// void main(){ for(;;){ // Este bucle afecta al menu y a la partida gusano a; a.presentacion(); clrscr(); a.inicializa_pantalla(); a.pantalla(); a.setjugador(0); a.setjugador(1); a.inicializa_gusano(0); a.inicializa_gusano(1); for(;;){ // Este bucle solo afecta a cuando juegas // si la funcion teclado devuelve 7 sale if(pl[0].vidas>=1) a.imprime(0); if(pl[1].vidas>=1||ordenador==1)a.imprime(1); if(a.cambio_de_direccion(0)==7)break; if(a.cambio_de_direccion(1)==7)break; if(pl[0].vidas>=1) a.cambio_de_coordenadas(0); if(pl[1].vidas>=1||ordenador==1)a.cambio_de_coordenadas(1); if(pl[0].vidas<1&&pl[1].vidas<1)break; } } }

No hay comentarios:

Publicar un comentario