Serpent

Contenu du snippet

je commence un jeu de serpent en turbo c++ 3....
le principe du jeu est opérationnel mais je suis en train de l'amélioré!!!!

Source / Exemple :


/* PIXEL.CPP--Example from Chapter 5 of User's Guide */
#include <graphics.h>   // declarations for graphics library
#include <conio.h>      // for getch() function
#include <dos.h>
//#include <time.h>
#include <iostream.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//************CONSTANTES***********************************************

#define MinI 0
#define MinJ 0
#define MaxI 100
#define MaxJ 110

//************VARIABLES GLOBALES***************************************
struct TDep
{
	int I;
	int J;
	int Dir;
};
TDep Coin[5000];

struct Tfleche
{
	int h;
	int b;
	int g;
	int d;
};
Tfleche fl;

struct TDirection
{
	int Avant;
	int Vers;
};

struct Tserpent
{
	int I;
	int J;
};
Tserpent Serpent[5000];

int hasardI,hasardJ;
int i,Idebut,Jdebut,Ifin,Jfin,Vitesse;
int NouveauCoin,DepCoin,Av;
int TailleJ,Coul;
int Point;
TDirection Direction;                            //1 pour gauche, 2 pour en bas, 3 pour la droite, 5 pour en haut

//************PROTOTYPAGES*********************************************
void INITgraph();             //On initialise la carte graphique
void InitSerpent(int coul);   //On initialise le serpent et on le dessine
void GestionTete();           //On gSre la direction de la t^te pour un cycle de jeu
void GestionQueue();          //Idem, pour la queue
void INITt();                 //On initialise les tableaux . z,ro
int MangeCorps();             //Fonction qui renvoie 1, si le serpent . manger son corps
void RempSerp();              //On remplit les cases du tableaux du serpent avec les coordonn,es actuelles
void DessinerContour();       //On dessine les murs
void AffichePomme();          //On affiche une pomme avec des coordonn,es au hasard
void MangePomme();            //On gSre si on doit afficher une nouvelle pomme
void RempSerpPomme();         //On remplie le tableau du serpent quand il mange une pomme
void SupprimeQueue();         //On supprime tous les pixels de la queue
void DessineLangue();         //On dessine une langue . un moment donn, (g,n,r, au hasard)

//************DEBUT DES FONCTIONS ET PROCEDURES************************
int main()
{
	//time_t t;

	INITgraph();		    //Initialisation de la carte graphique
	INITt();

	fl.h=5;//Touches de direction
	fl.b=2;//pourront ^tre chang,es
	fl.g=1;
	fl.d=3;

	NouveauCoin=0;
	DepCoin=0;
	Av=0;
	Coin[NouveauCoin].Dir=fl.d;
	TailleJ=40;
	Coul=6;
	Point=0;

	int midx = MinJ+20;
	int midy = MaxI+20;
	char *ch;

	InitSerpent(Coul);                 //On dessine le serpent du d,but

	Coin[NouveauCoin].I=Idebut;
	Coin[NouveauCoin].J=Jdebut;

	Vitesse=50;                     //On rSgle la vitesse
	Direction.Avant=Idebut;
	Direction.Vers=fl.d;               //Direction du d,but
	DessinerContour();
	AffichePomme();

	while((MangeCorps()!=1) && (Idebut>MinI) && (Idebut<MaxI) && (Jdebut>MinJ) && (Jdebut<MaxJ))
	{

		GestionTete();
		GestionQueue();
		MangePomme();
		DessinerContour();

		window(10,10,20,20);
		cout<<"\\nPoints Gagn,s : "<<Point<<"\\n";
		cout<<"Longueur du serpent : "<<TailleJ<<"\\n";
		cout<<"Tete (i) : "<<Idebut<<"\\n";
		cout<<"Tete (j): "<<Jdebut<<"\\n";
		cout<<"Coordonn,es de la pomme : \\n";
		cout<<"                         I : "<<hasardI<<"\\n";
		cout<<"                         J : "<<hasardJ<<"\\n";
		cout<<"Vitesse : "<<Vitesse;
		delline;
		delay(Vitesse);

       }
       closegraph();//on remet la configuration par d,faut de l',cran

       getch();
       return 0;
}

void MangePomme()
{

	if((Idebut==hasardI)&&(Jdebut==hasardJ)||(Idebut==hasardI+1)&&
		(Jdebut==hasardJ)||(Idebut==hasardI)&&(Jdebut==hasardJ+1)||
		(Idebut==hasardI-1)&&(Jdebut==hasardJ)||
		(Idebut==hasardI)&&(Jdebut==hasardJ-1))
	//Si les coordonn,es de la t^te corrspondent avec celle de la pomme
	{

			//On efface la pomme pr,c,dente qui a ,t, mang,e
			putpixel(hasardJ,hasardI,0);
			putpixel(hasardJ+1,hasardI,0);
			putpixel(hasardJ,hasardI+1,0);
			putpixel(hasardJ-1,hasardI,0);
			putpixel(hasardJ,hasardI-1,0);

			switch(Direction.Vers)
			{
				case 1 :Jdebut--;
					putpixel(Jdebut,Idebut,Coul);
					break;
				case 2 :
					Idebut++;
					putpixel(Jdebut,Idebut,Coul);
					break;
				case 3 :
					Jdebut++;
					putpixel(Jdebut,Idebut,Coul);
					break;
				case 5 :
					Idebut--;
					putpixel(Jdebut,Idebut,Coul);
					break;
			}
			Point++;
			if(Point%10==0)
				Vitesse-=3;//Augmentation de la vitesse
			RempSerpPomme();
			AffichePomme();

	}
}

void RempSerpPomme()
{
	TailleJ++;
	for(int i=1;i<=TailleJ;i++)
	{
	    Serpent[i].I=Serpent[i-1].I;//on d,place les coordonn,es vers la droite dans le tableau
	    Serpent[i].J=Serpent[i-1].J;

	}
	Serpent[0].I=Ifin;//le d,but du serpent prend les nouvelles coordonn,es
	Serpent[0].J=Jfin;
}

void AffichePomme()
{
	int Val;

	Val=1;
	randomize();
	do
	{
		hasardJ=(rand()%(MaxJ-1))+2; //les nouvelles coordonn,es th,oriques de la pomme
		hasardI=(rand()%(MaxI-1))+1;
		//Il ne faut pas que les coordonn,es de la pomme tombent sur le serpent
		for(int j=0;j<=TailleJ;j++)
		{
		       if((Serpent[j].I!=hasardI)&&(Serpent[j].J!=hasardJ))
				Val=0;
		}
	}while(Val==1);
	putpixel(hasardJ,hasardI,2);
	putpixel(hasardJ+1,hasardI,2);
	putpixel(hasardJ,hasardI+1,2);
	putpixel(hasardJ-1,hasardI,2);
	putpixel(hasardJ,hasardI-1,2);
}

void DessinerContour()
{
	int i,j;

	for(i=MinI;i<=MaxI;i++)
	{
		putpixel(MinI,i,3);
		putpixel(MaxJ,i,3);
	}
	for(j=MinJ;j<=MaxJ;j++)
	{
		putpixel(j,MinJ,3);
		putpixel(j,MaxI,3);
	}
}

void RempSerp()
{
	int i;

	for(i=0;i<=(TailleJ-1);i++)
	{
		Serpent[i].I=Serpent[i+1].I;
		Serpent[i].J=Serpent[i+1].J;
	}
}

int MangeCorps()
{
	int i;
	int Toucher;

	Toucher=0;

	for(i=0;i<TailleJ-1;i++)
	{
		if((Serpent[i].I==Idebut) && (Serpent[i].J)==Jdebut)
			Toucher=1;
	}

	return(Toucher);

}
void INITt()
{
	int i;

	for(i=0;i<=5000;i++)
	{
		Serpent[i].I=0;
		Serpent[i].J=0;
		Coin[i].I=0;
		Coin[i].J=0;
		Coin[i].Dir=0;
	}
}

void GestionTete()
{
	int Touche;

	if(kbhit())               //Si on a appuy, sur une touche
	{
		Coin[NouveauCoin].I=Idebut;  //On r,cupSre les nouvelles...
		Coin[NouveauCoin].J=Jdebut;  //...coordonn,es pour chaque changement de direction

		Touche=getch();  //On r,cupSre la valeur de la touche
		switch(Touche)
		{
				 //pour chaque direction : il ne faut pas...
				 //qu'on soit sur la m^me ligne si on veut faire ...
				 //demi-tour

			case 49 : if(Direction.Avant!=Idebut)
				  {
					Direction.Vers=fl.g;
					Direction.Avant=Idebut;
				  }break;

			case 50 : if(Direction.Avant!=Jdebut)
				  {
					Direction.Vers=fl.b;
					Direction.Avant=Jdebut;
				  }break;

			case 51 : if(Direction.Avant!=Idebut)
				  {
					Direction.Vers=fl.d;
					Direction.Avant=Idebut;
				  }break;

			case 53 : if(Direction.Avant!=Jdebut)
				   {
					Direction.Vers=fl.h;
					Direction.Avant=Jdebut;
				  }break;
		}
		NouveauCoin++;
		Coin[NouveauCoin].Dir=Direction.Vers;
	}
	else                     //Si on n'a press, aucune touche, le serpent...
	{                        //...continue . avancer dans la m^me direction
		switch(Direction.Vers)
		{
			case 1 : Jdebut--;
				Serpent[TailleJ].I=Idebut;//pour connaOtre les coordonn,es de tout le serpent
				Serpent[TailleJ].J=Jdebut;
				RempSerp();break;

			case 2 : Idebut++;
				Serpent[TailleJ].I=Idebut;//pour connaOtre les coordonn,es de tout le serpent
				Serpent[TailleJ].J=Jdebut;
				RempSerp();break;

			case 3 : Jdebut++;
				Serpent[TailleJ].I=Idebut;//pour connaOtre les coordonn,es de tout le serpent
				Serpent[TailleJ].J=Jdebut;
				RempSerp();break;

			case 5 : Idebut--;
				Serpent[TailleJ].I=Idebut;//pour connaOtre les coordonn,es de tout le serpent
				Serpent[TailleJ].J=Jdebut;
				RempSerp();break;
		}
	       Coin[NouveauCoin].I=Idebut;  //On r,cupSre les nouvelles...
	       Coin[NouveauCoin].J=Jdebut;  //...coordonn,es pour chaque changement de direction
	}
	putpixel(Jdebut,Idebut,Coul);//on ajoute un pixel pour la t^te
	DessineLangue();
	switch(Direction.Vers)
	{
		case 3:
		putpixel(Jdebut,Idebut-1,Coul);
		putpixel(Jdebut,Idebut+1,Coul);break;

		case 1:
		putpixel(Jdebut,Idebut-1,Coul);
		putpixel(Jdebut,Idebut+1,Coul);break;

		case 2:
		putpixel(Jdebut-1,Idebut,Coul);
		putpixel(Jdebut+1,Idebut,Coul);break;

		case 5:
		putpixel(Jdebut-1,Idebut,Coul);
		putpixel(Jdebut+1,Idebut,Coul);break;
	}
}

void DessineLangue()
{
	switch(Direction.Vers)
	{
		case 1 :
		putpixel(Jdebut-1,Idebut,12);break;

		case 2:
		putpixel(Jdebut,Idebut+1,5);break;

		case 3:
		putpixel(Jdebut+1,Idebut,5);break;

		case 5 :
		putpixel(Jdebut,Idebut-1,5);break;
	}
}

void GestionQueue()
{
		switch(Coin[DepCoin].Dir)
		//selon la direction du Prochain coin (angle o- la t^te du serpent change de direction)
		{
			case 1 : if(Jfin>(Coin[DepCoin].J))
				{
					Jfin--;
					Serpent[0].I=Ifin;
					Serpent[0].J=Jfin;

				}
				else
					DepCoin++;break;
			case 2 :if(Ifin<(Coin[DepCoin].I))
				{
					Serpent[0].I=Ifin;
					Serpent[0].J=Jfin;
					Ifin++;

				}
				else
					DepCoin++;break;
			case 3 : if(Jfin<(Coin[DepCoin].J))
				 {
					Serpent[0].I=Ifin;
					Serpent[0].J=Jfin;
					Jfin++;

				 }
				else
					DepCoin++;break;
			case 5 : if(Ifin>Coin[DepCoin].I)
				 {
					Serpent[0].I=Ifin;
					Serpent[0].J=Jfin;
					Ifin--;

				 }
				else
					DepCoin++;break;
		}

		SupprimeQueue();    //on efface un pixel de la queue

}

void SupprimeQueue()
{
	switch(Coin[DepCoin].Dir)
	{
		case 3:
		putpixel(Jfin,Ifin,0);
		putpixel(Jfin,Ifin-1,0);
		putpixel(Jfin,Ifin+1,0);break;

		case 1:
		putpixel(Jfin,Ifin,0);
		putpixel(Jfin,Ifin-1,0);
		putpixel(Jfin,Ifin+1,0);break;

		case 2:
		putpixel(Jfin,Ifin,0);
		putpixel(Jfin-1,Ifin,0);
		putpixel(Jfin+1,Ifin,0);break;

		case 5:
		putpixel(Jfin,Ifin,0);
		putpixel(Jfin-1,Ifin,0);
		putpixel(Jfin+1,Ifin,0);break;
	}
}

void  InitSerpent(int coul)
{
	Idebut=2;
	Jdebut=TailleJ;
	Ifin=2;
	Jfin=2;

	for(Av=0;Av<=Jdebut;Av++)//On trace le serpent du d,but
	{
		putpixel(2+Av,Idebut,coul);
		putpixel(2+Av,Idebut-1,coul);
		putpixel(2+Av,Idebut+1,coul);
		Serpent[Av].I=Idebut;
		Serpent[Av].J=i;
	}
}
void INITgraph()
{
      // initialize the graphics system
   int graphdriver = DETECT, graphmode;
   initgraph(&graphdriver, &graphmode, "..//bgi");

}

Conclusion :


desole mais pour linstant jai plus winzip.... donc pour l'exe , compilez le ...jen sui vraimen desolé!!


je viens de l'améliorer : 11/12/03 !!!

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.