Snake gp v1.0 (vc++) un serpent

Description

Bon bah c'est un serpent à la différence près que je ne trouve pas de moyen de faire grandir mon serpent ! Bon bah c plus un serpent me direz vous, mais c t l'idée de base. Comme j'en ai marre de chercher comment faire pour que le serpent grandisse, je publie le code en espérant que qqn me dira comment faire. Merci

Source / Exemple :


/*--------------------------------------SNAKE GP v1.0------------------------------------*/
//|||||||||||||||||||||||||||||||||||||||||By NEO||||||||||||||||||||||||||||||||||||||||//
/*---------------------------------------------------------------------------------------*/

#include "stdafx.h"
#include "windows.h"
#include "conio.h"
#include "iostream.h" //Gestion des entrées/sorties à l'écran;
#include "stdio.h"
#include "stdlib.h"
#include "econio.h"
#include "econio.cpp"
#include "time.h" //Pour mon nombre aléatoire

#define CLEAN clrscr(); //Efface l'écran
#define TERRAIN_JEU 200
#define RESET_KEY key=getch()//Pour remettre key à 0 utile dans certain cas ;-)
#define CENTRE 33,9 //PLUS BESOIN DE DE ME SOUVENIR DES COORDONEES DU CENTRE DE L'ECRAN

		/*TOUCHES DE DIRECTION*/
//-------------------------------------//
#define HAUT 72							
#define BAS 80     
#define GAUCHE 75  
#define DROITE 77
//------------------------------------//
int i; //Variable servant à tous les compteurs for();
int j; // " " " " " " " " " " " " " " " " " " " " " "
int xT, yT;//coordonnées xTête yTête
int rnd1,rnd2; //Nombre aléatoire pour les places XY des pommes
int points=0; //Les points du joueur
int secondes, minutes, heures; //Bah, le temps quoi!
int Dsecs,Dsecs2;//Différences Secondes
int Vitesse=60,Vitesse2=55,Vitesse3=50,Vitesse4=45,Vitesse5=40,Vitesse6=35;
//		^
//		|
//		|
//les différentes Vitesses : Plus le NB est petit, plus ça va vite.
int key; //Key pour la gestion du déplacement ----->cette partie avec key me vient de Neurokida merci ;-)
int serpent[200][200]; //Le fameux serpent, nécessite d'un tableau pour gerer la collision.
int tableau[TERRAIN_JEU][TERRAIN_JEU]; /* tableau, de 200 colonnes (pour réserver assez de mémoire), 
						imaginaire servant à délimiter le terrain en mettant à 1 les endroits 
						pris par le tableau : si le serpent va à cet endroit, il perd*/
int pommes[100][100]; //Tableau pour FAIRE une grille IMAGINAIRE NON affichée avec des pommes
char pommesO[100][100]; 
char cLongSerp[]="o";
char nLongSerp[]="o";

/*-------------------|||||||||||||||||JE PLACE TOUS LES NOMS DE FONCTIONS|||||||||||||||||||-----------*/
void menu();
void Tpommes();
void Dbas();
void Dhaut();
void Dgauche();
void Ddroite();
void fin();
void GetKeyPressed();
void intro();
void menu();
void RecupererHeure();
void start();
void TracageT_Xi();
void TracageT_XiY23();
void TracageT_Yi();
void TracageT_YiX79();
void Tserpent();
void vitesse();
/*-------------------||||||||||POUR EVITER LES MESSAGES : UNDECLARED INDENTIFIERS|||||||||||------------*/

#include <ddraw.h>

void reinitval()//Cette fonction remet toutes les données à leur valeur initiales
{			    //Car quand on perd, les données ne sont pas remises directement à 0		
	rnd1=0;		//Il faut que le prog redémarre si il n'y a pas cette fonction
	rnd2=0;
	Vitesse=60;
	points=0;
	xT=0;
	yT=0;
}

void attrpommes()//Fonction de vérification de "l'attrapage des pommes"
{
	
	if (xT==rnd1 && yT==rnd2)//Verifie si le serpent Attrape une pomme ou pas.
			{	
				rnd1=0;				 //Si oui, on remet les valeurs rnd1 et rnd2 à 0...			 
				rnd2=0;
				pommes[rnd1][rnd2]=0;
				Tpommes();
				points++;			 //...et on ajoute 1 point
				gotoxy(1,24);		 //On va en bas à gauche puis...
				textbackground( BLACK );//...on met en noir et enfin...
				cout<<"Points : "<<points<<flush; //...on affiche les points						
			}
}

void vitesse()//Les différent niveaux de vitesse(s) en fonction des points.
{
	if (points>=12)
	{
		Vitesse=Vitesse2;
	}

	if (points>=32)
	{
		Vitesse=Vitesse3;
	}

	if (points>=56)
	{
		Vitesse=Vitesse4;
	}

	if (points>=80)
	{
		Vitesse=Vitesse5;
	}

	if (points>=120)
	{
		Vitesse=Vitesse6;
	}

	if (points>=150)
	{
		Vitesse--;
		if (Vitesse<=0) //Pour éviter tout plantage du programme
		{
			Vitesse=0;
		}
	}	
}

void RecupererHeure()//Fonction récupérée sur cppfrance : Kyoko
{
time_t timer1;
time(&timer1);
struct tm *newTime1;
newTime1 = localtime(&timer1);
heures = newTime1->tm_hour;     // Les heures sont dans "heures"
minutes = newTime1->tm_min;     // Les minutes sont dans "minutes"
secondes = newTime1->tm_sec;        // Les secondes sont dans "secondes"
gotoxy(71,24);
	if (secondes<10)  //Si il n'y a pas cette vérif, quand les secondes n'ont qu'1
					  //chiffre, et ben si par ex.les secs étaient : 59 quand on passe à
					  //une seconde, ça fait : 59,19,29,39,49,59,69,79,89,99,10,11,12...
	{
		cout<<" "<<flush;
	}
	textbackground( WHITE );
cout<<heures<<":"<<minutes<<":"<<secondes<<flush;
} 

void Tpommes()
{
	
	if (rnd1>=1 && rnd2>=1)
	{
		return;
	}
	for (srand( (unsigned)time( NULL ));;)
	{
		rnd1=rand();
		if (rand()>78) 
		{
re1:
			rnd1=rand()/400;
			if (rnd1<=78 && rnd1>0)
			{
				break;
			}
			else goto re1;
			
		}
		
	};

	for (srand( (unsigned)time( NULL ));;)
	{
		rnd2=rand();
		if (rand()>22) 
		{
re2:
			rnd2=rand()/750;
			if (rnd2<=22 && rnd2>0)
			{
				break;
			}
			else goto re2;
			
		}
	};
	pommes[rnd1][rnd2]=1;
	pommesO[rnd1][rnd2]='@';
	gotoxy(rnd1,rnd2);
	textbackground( GREEN );
	if (pommes[rnd1][rnd2]!=0)
		{
			gotoxy(rnd1,rnd2);
			cout<<pommesO[rnd1][rnd2]<<flush;
			}					/*A quoi ça sert ? Explications : 
								De temps en temps, même si c'est rare, deux pommes apparai-
								ssent très très proches l'une de l'autre. Les serpent les prend
								quasiment en même temps et à ce moment là, les 2 pommes dispa-
								raissent mais le prog n'enregistre pas le fait que la 2ème pomme
								a été mangée par le serpent et il attends que le serpent repasse
								à l'endroit où était la pommes, avant d'attribuer le point et 
								dessiner une autre pommes.Mais comme la pomme à disparue, on 
								ne sait pas où il faut aller.								

  • /
}; void fin() //Fonction servant quand le joueur perd { CLEAN; textbackground( RED ); textcolor(9); for (i=0;i<90;i++) { textcolor(i); gotoxy(30,9); cout<<"VOUS AVEZ PERDU !!!!"<<flush; Sleep(20); CLEAN; } gotoxy(12,30); //va ailleurs que là où on as inscrit PERDU! pour que ce soit propre reinitval(); Sleep(2000); menu(); }; void start() //fonction pour que le terrain change de couleur à chaque nouvelle partie { CLEAN; int f; for (srand( (unsigned)time( NULL ));;) //Génération aléatoire du nombre if (rand()>100) { f=rand()/100;break; }; for (i=0;i<f;i++) { gotoxy(35,10); Sleep(1); textbackground(i); cout<<"START !!!"<<flush; if (kbhit()) { break; }; } }; void TracageT_Xi()//Barre du haut on trace X à l'emplacement Y=0 { for (i=1;i<80;i++) /*Valeur 80 pour tracer le tableau comme ceci : 0 78 0 yxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx --->Barre Tracée y 78x y y 23y y y y y y 23 y
  • /
{ for (j=0;j<80;j++) //boucle inutile mais flemme de l'enlever { tableau[i][0]=1; /*On met le tableau à 1 (pour l'instant, pas d'affichage)*/ }; gotoxy(i,0); //On met le curseur a : x = i, y = 0; cout<<"*"<<flush;/*Le curseur est à la position i et le tableau aussi. si i=12 gotoxy(i,0) = gotoxy(12,0); On sort alors le * à l'écran.*/ }; }; void TracageT_Yi()//Colonne de gauche : on trace Y, à l'emplacement X=0 { for (i=0;i<24;i++) { for (j=0;j<24;j++) { tableau[0][i]=1; } /*Tableau : 0 78 0 yxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx y y y y y y ----> Tracage Y y y y y 23 y
  • /
gotoxy(0,i); cout<<"*"<<flush; }; }; void TracageT_XiY23()//Barre du bas on trace X à l'emplacement Y=23 { for (i=1;i<80;i++) /*Valeur 80 pour tracer le tableau comme ceci : 0 y y y y 23y y y y y 23 yxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ----->Barre Tracée 0 78x 78 */ { for (j=0;j<80;j++) { tableau[i][24]=1; /*On insère le caractère $ dans le tableau (pour l'instant, pas d'affichage)*/ } gotoxy(i,23); //On met le curseur a : x = i, y = 23; cout<<"*"<<flush;/*Le curseur est à la position i et le tableau aussi. si i=12 gotoxy(i,23) = gotoxy(12,23); On sort alors le * à l'écran.*/ }; } void TracageT_YiX79()//Colonne de droite on trace Y à l'emplacement X=78 { for (i=0;i<24;i++) { for (j=0;j<24;j++) { tableau[80][i]=1; } gotoxy(79,i); /* tableau : 0 78 0 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxy y y Tracage Y <------- y 24y y y y y
  • /
cout<<"*"<<flush; }; } void Dhaut() //On appelle cette fonction pour que le serpent aille vers le haut { Tpommes(); while(!kbhit()) { Sleep(Vitesse); //Ralenti la boucle et donc ralenti la vitesse du curseur attrpommes(); vitesse(); gotoxy(xT,yT-1); //Pour que le curseur avance dans la direction voulue. yT--; /*Ceci enregistre la dernière position Y du curseur à chaque boucle Y est décrémenté de 1 et le curseur va vers le haut */ textbackground( RED ); cout<<cLongSerp<<flush; gotoxy(xT,yT+1); cout<<" "<<flush; if (serpent[xT+1][yT+1]+tableau[xT][yT]>=2)/*Bon c'est pas difficile à comprendre comme if... j'ai initialisé le tableau serpent[100][100] en entier. Donc TOUT le tableau est à 1. Quand le serpent se déplace, l'ordi vérifie que la posi- tion X et Y du serpent n'est pas égale à celle du tableau : exemple : Position X du serpent : 15 Position Y du serpent : 23 si serpent[15+1][23+1]+tableau[15+1][23+1]>=2 alors on perd. Les tableau[][] n'est pas mis en entier à 1 c'est juste les bord tracés 1111111111111111 1000000000000001 1000000000000001 1000000000000001 1000000000000001 1111111111111111 0000000000000000 --->ici c'est un espace réservé pour écrire les statistiques du joueur qui sont mis à 1
  • /
{ fin(); RESET_KEY; }; } RESET_KEY; }; void Dbas() //On appelle cette fonction pour que le serpent aille vers le bas { Tpommes(); while(!kbhit()) { RecupererHeure(); Sleep(Vitesse); attrpommes(); vitesse(); gotoxy(xT,yT+1); yT++; textbackground( RED ); cout<<cLongSerp<<flush; gotoxy(xT,yT-1); cout<<" "<<flush; if (serpent[xT+1][xT+1]+tableau[xT+1][yT+1]>=2) { fin(); RESET_KEY; }; } RESET_KEY; }; void Ddroite() //On appelle cette fonction pour que le serpent aille vers la droite { Tpommes(); while(!kbhit()) { RecupererHeure(); Sleep(Vitesse); attrpommes(); vitesse(); gotoxy(xT+1,yT); xT++; textbackground( RED ); cout<<cLongSerp<<flush; gotoxy(xT-1,yT); cout<<" "<<flush; if (serpent[xT+1][yT+1]+tableau[xT+1][yT+1]>=2) { fin(); RESET_KEY; }; } RESET_KEY; }; void Dgauche() //On appelle cette fonction pour que le serpent aille vers la gauche { Tpommes(); while(!kbhit()) { RecupererHeure(); Sleep(Vitesse); attrpommes(); vitesse(); gotoxy(xT-1,yT); xT--; textbackground( RED ); cout<<cLongSerp<<flush; gotoxy(xT+1,yT); cout<<" "<<flush; if (serpent[xT][yT+1]+tableau[xT][yT+1]>=2) { fin(); RESET_KEY; }; } RESET_KEY; }; void GetKeyPressed() { setcursortype(100); //Curseur invisible textbackground( RED ); textcolor( LIGHTGRAY ); clav: while(!kbhit()) //Attente d'un appui sur le clavier { key=toupper(getch()); } if (key==224 || key==0) key=getch(); //----------------------------------- if (key==HAUT) { Dhaut(); goto clav; } //----------------------------------- if (key==BAS) { Dbas(); goto clav; } //----------------------------------- if (key==DROITE) { Ddroite(); goto clav; } //----------------------------------- if (key==GAUCHE) { Dgauche(); goto clav; } //----------------------------------- }; void intro() //Ma petite intro { textbackground(15); setcursortype(100); gotoxy(5,5); cout<<"Neo's Coporation(hum... I'm the only employed in this corporation ;-) )"<<"\n"<<flush; gotoxy(35,6); cout<<"PRESENT : "<<flush; gotoxy(CENTRE); cout<<"SNAKE GP V1.0"<<flush; Sleep(4000); }; void Tserpent() { for (i=0;i<200;i++) { for (j=0;j<200;j++) { serpent[i][j]=1; /* facile à comprendre : !TOUT! le tableau est mis à 1 car avec une seule boucle for (i...) avec tableau[i][i] seul les données égales du tableau sont iniatlisées : exemple : si i=25 seules les données tableau[25][25] sont mises à 1 */ } } }; void menu() //Menu Principal { mnuprinc: textbackground( WHITE ); textcolor( BLACK ); CLEAN; gotoxy(0,0); cout<<"*"<<flush; //sans ça il manque une étoile en haut à gauche. par flemme je fais ça ! TracageT_Xi(); //juste pour faire joli ! gotoxy(3,3); int choix; cout<<"1 : Jouer"<<flush; gotoxy(3,4); cout<<"2 : Regles"<<flush; gotoxy(3,5); cout<<"3 : Exit"<<flush; gotoxy(3,6); cout<<"Votre choix : "<<flush; cin>>choix; if (choix>3 || choix<1) { gotoxy(3,2); textbackground( RED ); cout<<"VOUS DEVEZ CHOISIR ENTRE 1, 2 OU 3"<<flush; Sleep(2000); goto mnuprinc; //JE SAIS LES GOTO C PAS BIEN } switch (choix) { case 1: { mnustart: CLEAN; Tserpent(); textcolor( LIGHTGRAY ); textbackground( YELLOW ); CLEAN; TracageT_Yi(); TracageT_Xi(); TracageT_XiY23(); TracageT_YiX79(); gotoxy(39,12); //on met le curseur au centre de l'écran xT=39;yT=12; //Les valeurs de départ de X et Y pour le déplacement du serpent cout<<"o"<<flush; GetKeyPressed(); }; case 2: { lblchoix2: textbackground( WHITE ); CLEAN; int choix2; gotoxy(10,9); cout<<"Vous ne connaissez pas les regles du serpent ?"<<flush; gotoxy(10,10); cout<<"Vous devez recuperer ce qui ressemble a des pommes."<<flush; gotoxy(10,11); cout<<"Plus vous en avez, plus vous devenez grand et plus c'est difficile"<<flush; gotoxy(10,14); cout<<"1 : RETOUR"<<flush; gotoxy(10,15); cout<<"2 : JOUER"<<flush; gotoxy(10,16); cin>>choix2; if (choix2>2 || choix2<1) { gotoxy(10,13); textbackground( RED ); cout<<"CHOISIR ENTRE 1 OU 2 !"<<flush; Sleep(2000); goto lblchoix2; } switch (choix2) { case 1: { goto mnuprinc; }; case 2: { goto mnustart; }; }; }; case 3: { CLEAN; exit(0); }; }; } void main() { intro(); menu(); }

Conclusion :


Un des bugs de ce prog : de temps en temps, le programme ne détecte pas qu'on a pris la pomme et n'en affiche pas une nouvelle avant que l'on soit repassé à l'endroit où était la pomme mais comme on ne voit plus la pomme, c'est difficile. Euh g été clair? g du mal à m'exprimer !
Ds le zip se trouve l'éxécutable et les bibliothèques conio.h, econio.h et econio.cpp à mettre dans le répertoire /include

SVP aidez moi pour le faire grandir ce fichu serpent !!!!

Codes Sources

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.

Du même auteur (Boby009 NeoMorph)