
Implementación del juego del Gusano en C++
C/Visual C
Publicado el 19 de Noviembre del 2002 por Ramiro
33.788 visualizaciones desde el 19 de Noviembre del 2002
Implementación del juego del Gusano en C++. Utilización de clases.
// M E G A W O R M
// Tipico juego de un gusano que no tiene que chocar con nada
// Esta realizado en modo de texto
// Este programa es FREEWARE y puedes utilizarlo libremente para
// cualquier uso. Puedes coger trozos de codigo para tus
// propios programas.
// Si tienes alguna sugerencia o algun comentario, no dudes en
// ponerte en contacto conmigo en la direccion:
// ramz @ wanadoo.es
// http://perso.wanadoo.es/ramz
#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;
}
}
}
Comentarios sobre la versión: Versión 1 (7)
thanks