Jeu le serpent

Horfee Messages postés 188 Date d'inscription mercredi 9 avril 2003 Statut Membre Dernière intervention 10 août 2009 - 12 juin 2004 à 23:52
cyberbomber Messages postés 1 Date d'inscription lundi 3 janvier 2005 Statut Membre Derniè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) :

/* conio.c */
#include <conio.h>
#include <windows.h>

#define STDOUT GetStdHandle(STD_OUTPUT_HANDLE)enum CURSOR {NORMALCURSOR 0,NOCURSOR 100,SOLIDCURSOR = 20,};

void gotoxy( int x, int y ) // Place le curseur en x,y
{
COORD dwCursorPosition = { x, y };
SetConsoleCursorPosition (STDOUT, dwCursorPosition);
}
void setcursortype( int cur ) // type de curseur
{
BOOL visible = cur != NOCURSOR;
CONSOLE_CURSOR_INFO CursorInfo = { cur, visible };
SetConsoleCursorInfo (STDOUT, &CursorInfo);
}
void clrscr(void) // efface l'écran
{
HANDLE hstdout = STDOUT;
CONSOLE_SCREEN_BUFFER_INFO csbi;
if (GetConsoleScreenBufferInfo (hstdout, &csbi))
{
COORD coordScreen = { 0, 0 };
DWORD cCharsWritten;
DWORD dwConSize = csbi.dwSize.X * csbi.dwSize.Y;
FillConsoleOutputCharacter (hstdout, ' ', dwConSize, coordScreen, &cCharsWritten);
FillConsoleOutputAttribute (hstdout, csbi.wAttributes, dwConSize, coordScreen, &cCharsWritten);
SetConsoleCursorPosition (hstdout, coordScreen);
}
}
void clrscrEx(int X,int Y,int NB_COLONNES, int NB_LIGNES) // efface une partie de l'écran
{
int i;
HANDLE hstdout = STDOUT;
CONSOLE_SCREEN_BUFFER_INFO csbi;
if (GetConsoleScreenBufferInfo (hstdout, &csbi))
{
COORD coordScreen = { X, Y };
DWORD cCharsWritten;
DWORD dwConSize = NB_COLONNES;
for (i=0;i<NB_LIGNES;i++)
{
FillConsoleOutputCharacter (hstdout, ' ', dwConSize, coordScreen, &cCharsWritten);
FillConsoleOutputAttribute (hstdout, csbi.wAttributes, dwConSize, coordScreen, &cCharsWritten);
SetConsoleCursorPosition (hstdout, coordScreen);
coordScreen.Y++;
}
}
}

/*====================================*/

/* main.c */

// serpent.cpp : définit le point d'entrée pour l'application console.
//

#include "stdafx.h"
#include <stdio.h>

#include <time.h>
#include "conio.c"

#define LG_DECALAGE_V 5
#define LG_DECALAGE_H 5
#define NB_LIGNES 10
#define NB_COLONNES 20
#define VALEUR_POMME 3
#define TRUE 1
#define FALSE 0

// 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){

corp* tmp=serpent;
int cpt=1;
while(tmp!=NULL)
{
tmp->val=cpt;
cpt++;
tmp=tmp->suivant;
}
}

//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);
}

//permet que le serpent avance sans se rallonger

void avancer(corp** serpent,int MATRICE[][NB_LIGNES]){
creer(serpent,MATRICE);
corp* tmp;
corp* precedent;
tmp=*serpent;
(*serpent)->lg--;
while (tmp->suivant!=NULL)
{
precedent=tmp;
tmp=tmp->suivant;
}
free(tmp);
precedent->suivant=NULL;
}

void init(corp** serpent){

//procedure d'initialisation
//crée une tete centree a (1,1) pres
//qui se dirige vers le UP
*serpent=(corp*)malloc(sizeof(corp));

(*serpent)->dir=RIGHT;
(*serpent)->suivant=NULL;
(*serpent)->val=1;
(*serpent)->x=NB_COLONNES/2;
(*serpent)->y=NB_LIGNES/2;
(*serpent)->lg=1;

}

//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("-");
}

//les cotes
for (i=LG_DECALAGE_V;i<nb_lignes+LG_DECALAGE_V+2;i++)
{
//on decale
gotoxy(LG_DECALAGE_H,i);
printf("|");
gotoxy(nb_colonnes+LG_DECALAGE_H+1,i);
printf("|\n");
}

return 0;
}
void placer_pomme(int MATRICE[][NB_LIGNES],corp* serpent){
time_t cpt;
int x,y;
corp* tmp;
debut :
time(&cpt);
srand(cpt);
x=rand()%NB_COLONNES;
y=rand()%NB_LIGNES;

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;
}

1 réponse

cyberbomber Messages postés 1 Date d'inscription lundi 3 janvier 2005 Statut Membre Dernière intervention 5 janvier 2005
5 janv. 2005 à 15:01
i have an error with :
#include "stdafx.h"
and
#include "conio.c"

i'm runnin' VC++ 6
0
Rejoignez-nous