Horfee
Messages postés188Date d'inscriptionmercredi 9 avril 2003StatutMembreDernière intervention10 août 2009
-
12 juin 2004 à 23:52
cyberbomber
Messages postés1Date d'inscriptionlundi 3 janvier 2005StatutMembreDernière intervention 5 janvier 2005
-
5 janv. 2005 à 15:01
bon je suis tout nouveau en C et j'ai un petit probleme :
j'ai codé le jeu du serpent, assez rapidement mais j'ai un probleme : dès que j'appuie sur une touche, le serpent réagit apres 2 deplacements...
voici le code
(les touches sont les fleches directionnelles et la touche ESCAPE) :
// variables locales
int FIN=FALSE; //condition d'arret de la boucle principale
int type; //type de labyrinthe : sans labyrinthe ou boite;
int MATRICE[NB_COLONNES][NB_LIGNES];//description du plateau de jeu : utilisée pour le placement des pommes et
//peut etre plus tard un autre mode de jeu (mode Tunnel, Labyrinthe etc...)
// type principal du serpent
// un serpent est une chaine de corp
// chaque corp comporte une référence au corp suivant
typedef struct corp{
int x,y;
int val;
int dir;
int lg;
corp * suivant;
}corp;
int Test_Queue(corp*);
int Test_Pomme(corp*,int [][NB_LIGNES]);
void placer_pomme(int [][NB_LIGNES],corp*);
//enumeration pour l'entree clavier
enum{LEFT=75,RIGHT=77,DOWN=80,UP=72,ESC=27};
//direction du serpent
//chaque element du corps est numeroté par ordre décroissant
void reorganiser(corp* serpent){
//ajoute un bout de corps au serpent
void creer(corp** serpent,int MATRICE[][NB_LIGNES]){
corp* tmp;
tmp=(corp*)malloc(sizeof(corp));
tmp->suivant=(*serpent);
tmp->val=1;
tmp->dir=(*serpent)->dir;
tmp->lg=(*serpent)->lg+1;
switch(tmp->dir)
{
case RIGHT : tmp->x=(*serpent)->x+1;
tmp->y=(*serpent)->y;
break;
case LEFT : tmp->x=(*serpent)->x-1;
tmp->y=(*serpent)->y;
break;
case UP : tmp->x=(*serpent)->x;
tmp->y=(*serpent)->y-1;
break;
case DOWN : tmp->x=(*serpent)->x;
tmp->y=(*serpent)->y+1;
break;
}
(*serpent)=tmp;
reorganiser(*serpent);
}
//teste la collision de la tete avec un mur
int Test_Mur(corp* serpent){
//teste la collision entre la tete du serpent et un des bords
if ((serpent->dir==UP) || (serpent->dir==DOWN))
{
//bord UP
if (serpent->y<0)
return 1;
//bord DOWN
else if (serpent->y>NB_LIGNES-1)
return 2;
}
else
{
//bord LEFT
if (serpent->x<0)
return 3;
//bord RIGHT
else if (serpent->x>NB_COLONNES-1)
return 4;
}
//pas de collision
return 0;
}
//procedure permettant de traverser les murs
int Test_Mur_NoBox(corp* serpent){
switch(Test_Mur(serpent))
{
case 0 : break;
case 1 : //le serpent tente de passer en UP
serpent->y=NB_LIGNES-1; break;
case 2 : //le serpent tente de passer en DOWN
serpent->y=0; break;
case 3 : //le serpent tente de passer a LEFT
serpent->x=NB_COLONNES-1; break;
case 4 : // le serpent tente de passer a RIGHT
serpent->x=0; break;
}
return 0;
}
int Test_Queue(corp* serpent){
corp* tmp=serpent->suivant;
while(tmp!=NULL)
{
if (serpent->x==tmp->x && serpent->y==tmp->y)
return 1;
tmp=tmp->suivant;
}
return 0;
}
int Test_Pomme(corp* serpent,int MATRICE[][NB_LIGNES]){
if (MATRICE[serpent->x][serpent->y]==VALEUR_POMME)
return 1;
//else
return 0;
}
//affichage du contour
int dessiner(int nb_lignes, int nb_colonnes){
int i;
//dessine le UP
for(i=LG_DECALAGE_H+1;i<nb_colonnes+LG_DECALAGE_H+1;i++)
{
gotoxy(i,LG_DECALAGE_V);
printf("-");
}
//dessine le DOWN
for(i=LG_DECALAGE_H+1;i<nb_colonnes+LG_DECALAGE_H+1;i++)
{
gotoxy(i,nb_lignes+LG_DECALAGE_V+1);
printf("-");
}
tmp=serpent;
while (tmp!=NULL)
{
if (tmp->x==x && tmp->y==y)
goto debut;
tmp=tmp->suivant;
}
MATRICE[x][y]=VALEUR_POMME;
}
void afficher(corp* serpent){
corp* tmp;
tmp=serpent;
gotoxy(0,0);
//parcours tout les bouts de corps du serpent
while(tmp!=NULL)
{
//on se place aux coordonnées du corps
gotoxy(tmp->x+LG_DECALAGE_H+1,tmp->y+LG_DECALAGE_V+1);
//test : la tete
if (tmp->val==1)
printf("#");
//la queue
else if (tmp->val==serpent->lg)
printf("+");
//le reste : le corps
else
printf("*");
//on passe a l'élément suivant
tmp=tmp->suivant;
}
}
void affichage_table(int MATRICE[][NB_LIGNES]){
int i,j;
for(i=0;i<NB_COLONNES;i++)
for(j=0;j<NB_LIGNES;j++)
{
if (MATRICE[i][j]!=0)
{
gotoxy(i+LG_DECALAGE_H+1,LG_DECALAGE_V+1+j);
printf("%d",MATRICE[i][j]);
}
}
}
int main(void)
{
char direction='n'; //saisie de la direction par le clavier
corp* serpent; //definition du serpent
int (*MODE[3]) (struct corp*);//pointeurs sur fonctions:le style de jeu(sans labyrinthe ou boite) depend de ces pointeurs
BOOL pomme_presente=FALSE;
MODE[0]= Test_Mur; //Mode boite
MODE[1]= Test_Mur_NoBox; //pas de boite : on passe a travers les murs
MODE[2]= Test_Queue; //teste contact entre la tete et le corps
// initialistion de la console et du serpênt
setcursortype(NOCURSOR);
init(&serpent);
type=1;
//on cree un serpent un peu plus long
creer(&serpent,MATRICE);/*
creer(&serpent);
creer(&serpent);
creer(&serpent);
creer(&serpent);
creer(&serpent);*/
placer_pomme(MATRICE,serpent);
do
{
//affichage sur la console
dessiner(NB_LIGNES,NB_COLONNES);
//si on a appuyé sur une touche on teste la direction ou escape
if (kbhit())
{
direction=getch(); //on regarde quelle touche a été apuyé
fflush(stdin); // on vide le tampon clavier
switch(direction)
{
case UP : if (serpent->dir!=DOWN)
{
serpent->dir=UP;;
}break;
case DOWN : if (serpent->dir!=UP)
{
serpent->dir=DOWN;
}break;
case LEFT : if (serpent->dir!=RIGHT)
{
serpent->dir=LEFT;
}break;
case RIGHT : if (serpent->dir!=LEFT)
{
serpent->dir=RIGHT;
}break;
case ESC : FIN=TRUE;
}
}
direction='n';
clrscrEx(LG_DECALAGE_H+1,LG_DECALAGE_V+1,NB_COLONNES,NB_LIGNES);
afficher(serpent);
avancer(&serpent,MATRICE);
//teste selon different mode de jeu
affichage_table(MATRICE);
//temporiastion
SleepEx(100,TRUE);
if ((*MODE[type])(serpent)!=0)
FIN=TRUE;
/*if ((*MODE[3])(serpent)!=0)
FIN=TRUE;*/
if (Test_Queue(serpent)!=0)
FIN=TRUE;
if (Test_Pomme(serpent,MATRICE))
{
MATRICE[serpent->x][serpent->y]=0;
placer_pomme(MATRICE,serpent);
creer(&serpent,MATRICE);
}
}
while (FIN==FALSE);
gotoxy(0,NB_COLONNES+LG_DECALAGE_V-1);
return 0;
}