begin process at 2012 05 30 02:28:09
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Au secours

 > 

jeu le serpent


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

jeu le serpent

samedi 12 juin 2004 à 23:52:32 | jeu le serpent

Horfee


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;
}
mercredi 5 janvier 2005 à 15:01:53 | Re : jeu le serpent

cyberbomber

i have an error with :
#include "stdafx.h"
and
#include "conio.c"

i'm runnin' VC++ 6


Cette discussion est classée dans : int, nb, tmp, corp, serpent


Répondre à ce message

Sujets en rapport avec ce message

jai un probleme avec ma source!!!!! jai vérifeir et je ne trouve rien...pouvez vous m'aider.... [ par retaks666 ] alors jai veut faire un programme ki génére une suite de caractere d'un nombre donné...et sa marche po... je vous done ma source si vous pouvez m'aide Concaténation int et Cstring [ par maghella ] Salut!Je voudrais concanténer un chiffre et une lettre.Ex: mot="A";Nb=1;mot est de type CString et nb de type int.Je voudrais ke ça donne dans mot: A1 PB poilu de Stack 0verFlow (c++) [ par toufleboss ] Ci joint un algo de détourage d'un bmp de qq lignes :Le Binze c'est que des que la zone a détourée est trop importante je me tape un Stack overflow (l Client/Serveur avec thread sous linux [ par frater_sinister ] J'ai un prblm avec ce programme. Avant tout le but de ce code: le client envoit un fichier au serveur, ce dernier renvoit le nombre de lignes/mots/let Fatal signal: Segmentation Fault (SDL Parachute Deployed) [ par broks ] Je ne comprends vraiment pas pourkoa ca ne marche pas...C'est surement un probleme au niveau de la fonction saisi puisque je plante lorsque je dois sa celà n'enregistre pas [:(!],grrrr [ par oceane67 ] voilà, mon programme n'enregistre toujours pas, je ne sais pas pourquoi, surtout qu'il fait comme si c'etait le cas, je desepesere,voici mon programme interface de jeu [ par cafou ] sltest ce que qu'elqu'un peut me propose une interphase graphique et des animations au jeu en language c si dessousmerci d'avance#include#include#incl boucles et boites de dialogues [ par grems ] salut !Mon appli est censée détecter quand des nouveaux *.hd arrivent dans un dossier . Lorsque ca arrive, une boite de dialogue s'ouvre et une musiqu gcc, prob de compilation [ par Metrox ] 'lut all, je tourne ss une debian (knoppix, pr etre precis), et j'essaie de compiler un truc tt bete, mais il me sort une erreur...que faire?!?CODE(es pb avec fonctions sqrt de math.h [ par fox88 ] voici mon code : void histod::calcul_moyenne_ecartype(){ //CALCUL MOYENNE DU NB D'APPELS MOYEN JOURNALIER unsigned long accu=0; int moyenne=0;<br


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,577 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales