begin process at 2010 09 06 11:38:59
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Jeux

 > AHA! SERPENT, EN C TOUT COURT, AVEC EDITEUR DE NIVEAUX, ENNEMIS ET MODE D'EMPLOI...

AHA! SERPENT, EN C TOUT COURT, AVEC EDITEUR DE NIVEAUX, ENNEMIS ET MODE D'EMPLOI...


 Information sur la source

Note :
5,67 / 10 - par 3 personnes
5,67 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Jeux Niveau :Initié Date de création :04/10/2002 Date de mise à jour :05/10/2002 14:35:13 Vu / téléchargé :9 024 / 400

Auteur : opernes

Ecrire un message privé
Site perso
Commentaire sur cette source (11)
Ajouter un commentaire et/ou une note

 Description

le jeu du serpent, ecrit en c dans le cadre de mon BTS.
Avec des ennemis, un editeur de niveaux etc..
Ne vous attendez pas a un jeu en 4d en 1900*1600, ce jeu n'utilise que les fonctions du C, donc pas de directx ou autres ALLEGRO (c la faute du prof).  

Source

  • /////////////////////////////////////////////////////////////////////////
  • // //
  • // Action Professionelle 2002: //
  • // //
  • // SERPENT //
  • // //
  • // PERNES Olivier BTSIG1 //
  • // //
  • // "COMMUN.H" //
  • // //
  • // //
  • /////////////////////////////////////////////////////////////////////////
  • #include <conio.h>
  • #include <stdlib.h>
  • #include <time.h>
  • #include <stdio.h>
  • int taperdu; //J'suis mort ou pas?? (0 ou 1)
  • int score; //score en cours (0-9)
  • struct { //Structure du serpent:
  • int x; // position en x du serpent
  • int y; // position en y du serpent
  • int dir; // direction du serpent
  • int lgQueue; // longueur de la queue
  • struct { // 'matrice' de queue:
  • int x; // coordonn,e en X
  • int y; // coordonn,e en Y
  • }queue[42]; // 42 elements max
  • }serpent;
  • struct { //Structure des balles:
  • int x; // Position en X
  • int y; // Position en Y
  • int incx; // Incr,mentation en X
  • int incy; // Incr,mentation en Y
  • }baballe[10]; // 10 balles maximum
  • struct { //Structure des niveaux:
  • int EnCours; // Index en cours de Liste
  • int NbMax; // Total de niveaux
  • int Liste[100]; // Liste des num,ros de niveaux
  • } Niveaux;
  • int MAT[43][80]; //Matrice repr,sentant l'ecran (1=mur,2=pomme)
  • void Message(char l1[74],char l2[74],char l3[74]);
  • void FaireNiveau();
  • void ObtenirNiveaux();
  • int Editeur(int nivo);
  • void place_baballes();
  • void deplace_baballes();
  • int menu();
  • /////////////////////////////////////////////////////////////////////////
  • // //
  • // Action Professionelle 2002: //
  • // //
  • // SERPENT //
  • // //
  • // PERNES Olivier BTSIG1 //
  • // //
  • // "EDITOR.C" //
  • // //
  • // //
  • /////////////////////////////////////////////////////////////////////////
  • #include "commun.h"
  • int Editeur(int nivo)
  • {
  • char temp[64]; //Sert pour le nom de fichier lors de l'ecriture
  • FILE *fichier; //Pointeur vers le fichier a ouvrir
  • int touche=0,fin=0; //Quelle touche appuy,e?? Avons nous fini??
  • int x,y; //Variables utilis,es pour parcourir la matrice
  • int curseurx,curseury; //Position du curseur
  • curseurx=40; //Place le curseur au milieu de l'ecran
  • curseury=21;
  • //Definition du nom de fichier en fonction du num,ro en argument
  • sprintf(temp,"level%d.dat",nivo);
  • if (__file_exists(temp)==0) //Detecte si le fichier existe deja
  • {
  • //Dans le cas ou le fichier n'existe pas:
  • //'Dessine' les murs du jeu dans la matrice:
  • //1)R,initialise cette derniere:
  • for (x=0;x<=79;x++)
  • for (y=0;y<=42;y++)
  • MAT[y][x]=0;
  • //2)'Trace' les bordures haute et basse
  • for (x=0;x<=79;x++)
  • {MAT[0][x]=1; MAT[42][x]=1;}
  • //3)'Trace' les bordures gauche et droite
  • for (y=0;y<=42;y++)
  • {MAT[y][0]=1; MAT[y][79]=1;}
  • }
  • else {
  • //Dans le cas ou le fichier existe, charger le niveau dans la matrice
  • fichier = fopen(temp,"r");
  • for (y=0;y<43;y++) //43 lignes (0-42)
  • for (x=0;x<81;x++) //81 car 0-79 + 2 car. de retour ligne
  • {
  • touche=fgetc(fichier); //Stocke le caractere suivant dans touche
  • if (touche>=48) MAT[y][x]=touche-48; //>48 ascii = >0 (donc pas de retour
  • } //charriot ou autre car. systemes
  • fclose(fichier); //Ferme le fichier
  • }
  • textattr((BLUE << 4) | WHITE); //Rend le fond de texte bleu et le txt blanc
  • clrscr();
  • while (!(fin==1)) {
  • //Scanne la matrice pour y trouver des 1:
  • for (x=0;x<=79;x++)
  • for (y=0;y<=42;y++)
  • {
  • if (MAT[y][x]!=0)
  • ScreenPutChar('Û', (BLUE << 4) | WHITE, x, y);//Trace les murs
  • }
  • //Affiche le curseur:
  • if (MAT[curseury][curseurx]==0)
  • ScreenPutChar('_', BLINK | (BLUE << 4) | LIGHTMAGENTA, curseurx,curseury);
  • else
  • //Si l'on est deja sur un mur, changer la couleur du mur.
  • ScreenPutChar('Û', (BLUE << 4) | LIGHTMAGENTA,curseurx,curseury );
  • while (!kbhit()); //Attendre une touche
  • //Efface le curseur avant de repositionner le suivant
  • ScreenPutChar(' ', (BLUE << 4), curseurx,curseury);
  • touche=getch(); //Recupere le code ASCII de la touche
  • if (touche==32) //Si on appuie sur espace: inverser le statut du mur:
  • MAT[curseury][curseurx] = !MAT[curseury][curseurx];// 0=absent et 1=present
  • if (touche==27) //Echap = Terminer
  • {
  • fin=1;
  • break;
  • }
  • if (touche==0) //0: touche ,tendue
  • touche = getch(); //|->r,cuperer le code de la touche ,tendue
  • switch(touche){
  • case 'H': //haut
  • if (curseury>1)
  • curseury--; //Monte le curseur
  • break;
  • case 'M': //droite
  • if (curseurx<78)
  • curseurx++;
  • break;
  • case 'P': //bas
  • if (curseury<41)
  • curseury++;
  • break;
  • case 'K': //gauche
  • if (curseurx>1)
  • curseurx--;
  • break;
  • }
  • }
  • //Demande la confirmation de l'enregistrement du fichier
  • touche = -1;
  • while ((touche <0)||(touche >1))
  • {
  • clrscr();
  • Message("Editeur:","Voulez vous enregistrer???","(tapez 0 pour oui ou 1 pour non): ");
  • ScreenSetCursor(45/2,57); //Place le curseur a la fin de la phrase
  • scanf("%d",&touche); //Saisie du chiffre
  • }
  • if (touche==0)
  • {
  • //Ecrit la matrice MAT dans le fichier...
  • //ouvre le fichier en mode ,criture
  • fichier=fopen(temp,"w");
  • //Pour tous les elements de la matrice:
  • for (y=0;y<43;y++)
  • for (x=0;x<80;x++)
  • {//2)v,rifier la matrice, en cas d'erreur, remplacer par un mur (1)
  • if ((MAT[y][x]>1)||(MAT[y][x]<0)) MAT[y][x] = 1;
  • //3)ecrire dans le fichier le caractere en cours
  • fputc(MAT[y][x]+48,fichier); // 0 + 48 = '0'et 1 + 48 = '1'
  • if (x==79) fputc(10,fichier);}//Si on est en fin de ligne rajouter un
  • fclose(fichier); //LineFeed
  • }
  • return(0);
  • }
  • /////////////////////////////////////////////////////////////////////////
  • // //
  • // Action Professionelle 2002: //
  • // //
  • // SERPENT //
  • // //
  • // PERNES Olivier BTSIG1 //
  • // //
  • // "LEVEL.C" //
  • // //
  • // //
  • /////////////////////////////////////////////////////////////////////////
  • #include <dir.h>
  • #include "commun.h"
  • /////////////////////////////////////////////////////////////////////////
  • // //
  • // FAIRENIVEAU: Lit le fichier de niveau, place //
  • // les infos dans la matrice MAT, et affiche les //
  • // murs. //
  • // //
  • /////////////////////////////////////////////////////////////////////////
  • void FaireNiveau()
  • {
  • int x,y;
  • int lettre;
  • char tmp[50];
  • FILE *fichier;
  • strcpy(tmp,"level"); // "levelX.dat"
  • strcat(tmp,itoa(Niveaux.Liste[Niveaux.EnCours],NULL,9));
  • strcat(tmp,".dat");
  • fichier = fopen(tmp,"r");
  • for (y=0;y<43;y++) //43 lignes (0-42)
  • for (x=0;x<81;x++) //81 car 0-79 + 2 car. de retour ligne
  • {
  • lettre=fgetc(fichier);
  • if (lettre>=48) MAT[y][x]=lettre-48; //>48 ascii = >0 (donc pas de retour
  • } //charriot ou autre car. systemes
  • fclose(fichier); //Ferme le fichier
  • for (y=0;y<43;y++)
  • for (x=0;x<80;x++)
  • if (MAT[y][x]==1) // Si on a un mur (1):
  • ScreenPutChar('Û', WHITE, x, y); // l'afficher
  • return;
  • }
  • /////////////////////////////////////////////////////////////////////////
  • // //
  • // PLACEPOINT: Place al,atoirement le point a //
  • // manger pour le serpent. //
  • // //
  • /////////////////////////////////////////////////////////////////////////
  • void PlacePoint()
  • {
  • int x,y;
  • int good=0;
  • while (!(good==1))
  • {
  • x = (random()%77)+1; //80-2 (pour les murs), soit de 0-77
  • y = (random()%41)+1; //43-2 (pour les murs), soit de 0-41
  • if (MAT[y][x]==0) //V,rifie que la place est libre
  • { //dans la matrice,
  • MAT[y][x]=2; //et y place un 2 . cet endroit
  • good=1;
  • }
  • }
  • ScreenPutChar(48+score, GREEN | (BLUE<<4), x, y); // Afficher le point
  • }
  • /////////////////////////////////////////////////////////////////////////
  • // //
  • // MESSAGE:affiche une boite de dialogue //
  • // avec trois lignes (l1,l2etl3) //
  • // //
  • /////////////////////////////////////////////////////////////////////////
  • void Message(char l1[74],char l2[74],char l3[74])
  • {
  • int lignes=0,nbCarac=0; //Nb de lignes et nb de caracteres
  • int X=0,Y=0; //Position de la fenetre
  • char fnL1[78]={},fnL2[74]={},fnL3[74]={},fnL4[74]={},fnL5[74]={};
  • int i=0;
  • clrscr();
  • //Redessine la matrice
  • for (Y=0;Y<43;Y++)
  • for (X=0;X<80;X++)
  • {
  • if (MAT[Y][X]==1) //Redessine les murs
  • ScreenPutChar('Û', WHITE|(BLUE << 4), X, Y);
  • if (MAT[Y][X]==2) //Redessine les points
  • ScreenPutChar(48+score, BLINK|GREEN|(BLUE << 4), X, Y);
  • if (MAT[Y][X]==3) //Redessine les balles
  • ScreenPutChar('', BLINK|RED|(BLUE << 4), X, Y);
  • }
  • //D,termine le nombre de caract¦res max a afficher et le nb de lignes
  • if (strlen(l1)>0) lignes++;
  • if (strlen(l2)>0) lignes++;
  • if (strlen(l3)>0) lignes++;
  • if ((strlen(l1)>=strlen(l2))&&((strlen(l1)>=strlen(l3)))) nbCarac=strlen(l1);
  • if ((strlen(l2)>=strlen(l1))&&((strlen(l2)>=strlen(l3)))) nbCarac=strlen(l2);
  • if ((strlen(l3)>=strlen(l1))&&((strlen(l3)>=strlen(l2)))) nbCarac=strlen(l3);
  • //Determine la position de la fenetre selon les infos ci dessus (centree)
  • X = (80 / 2) - (nbCarac+4)/2;
  • Y = (43 / 2) - (lignes+2 )/2;
  • //Genere la fenetre ligne par ligne:
  • //ligne 1 (que la bordure sup,rieure)
  • strcpy(fnL1,"É");
  • for (i=0;i<nbCarac+2;i++)
  • strcat(fnL1,"Í"); //remplit la ligne selon le nb de car max
  • strcat(fnL1,"»");
  • //Lignes 2-4 : en 3 parties :
  • sprintf(fnL2,"Ý %s",l1); //1)bordure gauche+texte de la ligne
  • sprintf(fnL3,"Ý %s",l2);
  • sprintf(fnL4,"Ý %s",l3);
  • if (strlen(fnL2)<strlen(fnL1)-2) //2)comble la fin de la ligne si besoin
  • while(strlen(fnL2)<strlen(fnL1)-2) // par des espaces
  • strcat(fnL2," ");
  • strcat(fnL2," Þ"); //3)bordure droite
  • if (strlen(fnL3)<strlen(fnL1)-2)
  • while(strlen(fnL3)<strlen(fnL1)-2)
  • strcat(fnL3," ");
  • strcat(fnL3," Þ");
  • if (strlen(fnL4)<strlen(fnL1)-2)
  • while(strlen(fnL4)<strlen(fnL1)-2)
  • strcat(fnL4," ");
  • strcat(fnL4," Þ");
  • //Ligne Nø5 (bordure basse)
  • strcpy(fnL5,"È");
  • for (i=0;i<nbCarac+2;i++)
  • strcat(fnL5,"Í");
  • strcat(fnL5,"¼");
  • //Affichage proprement dit de la bo¼te
  • ScreenSetCursor(Y,X);
  • printf("%s\n",fnL1);Y++;
  • ScreenSetCursor(Y,X);
  • if (strlen(l1)!=0) {printf("%s\n",fnL2);Y++;}
  • ScreenSetCursor(Y,X);
  • if (strlen(l2)!=0) {printf("%s\n",fnL3);Y++;}
  • ScreenSetCursor(Y,X);
  • if (strlen(l3)!=0) {printf("%s\n",fnL4);Y++;}
  • ScreenSetCursor(Y,X);
  • printf("%s\n",fnL5);
  • }
  • /////////////////////////////////////////////////////////////////////////
  • // //
  • // OBTENIRNIVEAUX:parcours le repertoire pour //
  • // trouver les fichiers *.dat et en determiner le //
  • // nombre //
  • // //
  • /////////////////////////////////////////////////////////////////////////
  • void ObtenirNiveaux()
  • {
  • struct ffblk f;
  • char *tmp;
  • int done = findfirst("*.dat", &f, FA_HIDDEN | FA_SYSTEM);//cherche les .dat
  • tmp=f.ff_name + 5; //Pointe vers le chiffre du nom de fichier,ex:"1.dat"
  • while (!done)
  • {
  • Niveaux.Liste[Niveaux.NbMax] = atoi(tmp);//indexe le nø du niveau
  • Niveaux.NbMax++; //incremente le nombre de niv.
  • done = findnext(&f); //Cherche le .dat suivant
  • }
  • Niveaux.NbMax--; //decremente le nombre max
  • return; //(pour faire correspondre aux index)
  • }
  • /////////////////////////////////////////////////////////////////////////
  • // //
  • // Action Professionelle 2002: //
  • // //
  • // SERPENT //
  • // //
  • // PERNES Olivier BTSIG1 //
  • // //
  • // "SERPENT.C" //
  • // //
  • // //
  • /////////////////////////////////////////////////////////////////////////
  • #include "commun.h"
  • const vitesse=50000; //Vitesse du jeu
  • const HAUT=0,DROITE=1,BAS=2,GAUCHE=3;
  • /////////////////////////////////////////////////////////////////////////
  • // //
  • // INIT: initialise les variables //
  • // //
  • /////////////////////////////////////////////////////////////////////////
  • void init()
  • {
  • int i;
  • score=0;
  • taperdu=0; //ben oui, perdre des le debut c pas le but...
  • srandom(time(NULL)); //initialise le g,n,rateur al,atoire
  • serpent.x = 40; //place le serpent en X au milieu de l'ecran
  • serpent.y = 21; //place le serpent en Y au milieu de l'ecran
  • serpent.dir = random()%3; //direction al,atoire: 0H,1D,2B,3G
  • serpent.lgQueue=0;
  • for (i=0;i<=48;i++)
  • {serpent.queue[i].x = 40; //initialise la queue
  • serpent.queue[i].y = 21;}
  • if (Niveaux.EnCours==0){
  • Message("Bonjour!","Bienvenue dans SERPENT","Niveau 1: 3");
  • sleep(1);
  • Message("Bonjour!","Bienvenue dans SERPENT","Niveau 1: 2");
  • sleep(1);
  • Message("Bonjour!","Bienvenue dans SERPENT","Niveau 1: 1");
  • sleep(1);
  • clrscr(); //efface le message
  • ObtenirNiveaux(); //charge la liste de niveaux
  • }
  • FaireNiveau(); //trace le niveau
  • PlacePoint(); //Place le point a attraper
  • place_baballes(); //Place les balles
  • }
  • /////////////////////////////////////////////////////////////////////////
  • // //
  • // TOUCHE: Se charge de la gestion du score avec //
  • // les points, et d,clenche le changement //
  • // de tableau //
  • // //
  • /////////////////////////////////////////////////////////////////////////
  • void Touche()
  • {
  • char temp[74];
  • score++; //incr,mente le score
  • if (serpent.lgQueue!=0) //augmente la taille de la queue
  • serpent.lgQueue = serpent.lgQueue + (serpent.lgQueue/2);
  • else
  • serpent.lgQueue=2;
  • if (score==10) //passe le niveau
  • {
  • Niveaux.EnCours++; //incr,mente le num,ro du niveau
  • if (Niveaux.EnCours>Niveaux.NbMax) //teste si il y a encore un niveau
  • {
  • Message("Bravo!!","vous avez gagn,","!!!");
  • getkey();
  • taperdu=1;
  • return;
  • }
  • sprintf(temp,"Niveau %d: 3",Niveaux.EnCours+1);
  • Message("","Bravo!!",temp);
  • sleep(1);
  • sprintf(temp,"Niveau %d: 2",Niveaux.EnCours+1);
  • Message("","Bravo!!",temp);
  • sleep(1);
  • sprintf(temp,"Niveau %d: 1",Niveaux.EnCours+1);
  • Message("","Bravo!!",temp);
  • sleep(1);
  • clrscr();
  • init(); //R,initialise les donn,es
  • }
  • else
  • PlacePoint(); //Replace un point
  • }
  • /////////////////////////////////////////////////////////////////////////
  • // //
  • // GAMEOVER: Comme son nom l'indique //
  • // //
  • /////////////////////////////////////////////////////////////////////////
  • void gameover()
  • {
  • int x,y;
  • textattr( (BLUE << 4) | WHITE);
  • Message ("Vous avez perdu","votre score:",itoa(score,NULL,9));
  • taperdu = 1;
  • while(!kbhit());
  • return;
  • }
  • /////////////////////////////////////////////////////////////////////////
  • // //
  • // GESTIONDEPCOL: Gere le deplacement du serpent //
  • // et teste les collisions... //
  • // //
  • /////////////////////////////////////////////////////////////////////////
  • void GestionDepCol()
  • {
  • //Ralentit le jeu de 'vitesse'æs
  • usleep(vitesse);
  • //Gestion du dep. vers le haut
  • if (serpent.dir == HAUT)
  • {
  • if (MAT[serpent.y-1][serpent.x]==0)
  • serpent.y--; //deplace le serpent
  • else if (MAT[serpent.y-1][serpent.x]==2)
  • {Touche();serpent.y--;} //Attrap, un point
  • else taperdu=1; //touch, un mur
  • }
  • if (serpent.dir == DROITE) //Gestion du dep. vers la droite
  • {
  • if (MAT[serpent.y][serpent.x+1]==0)
  • serpent.x++;
  • else if (MAT[serpent.y][serpent.x+1]==2)
  • {Touche();serpent.x++;}
  • else taperdu=1;
  • }
  • if (serpent.dir == BAS) //Gestion du dep. vers le bas
  • {
  • if (MAT[serpent.y+1][serpent.x]==0)
  • serpent.y++;
  • else if (MAT[serpent.y+1][serpent.x]==2)
  • {Touche();serpent.y++;}
  • else taperdu=1;
  • }
  • if (serpent.dir == GAUCHE) //Gestion du dep. vers la gauche
  • {
  • if (MAT[serpent.y][serpent.x-1]==0)
  • serpent.x--;
  • else if (MAT[serpent.y][serpent.x-1]==2)
  • {Touche();serpent.x--;}
  • else taperdu=1;
  • }
  • return;
  • }
  • /////////////////////////////////////////////////////////////////////////
  • // //
  • // GEREQUEUE: Gere le mouvement de la queue //
  • // g,r, en LILO (last in last out) //
  • // //
  • /////////////////////////////////////////////////////////////////////////
  • void GereQueue()
  • {
  • int i;
  • //efface le dernier element de la liste de l',cran
  • ScreenPutChar('Û',BLUE,serpent.queue[serpent.lgQueue].x
  • ,serpent.queue[serpent.lgQueue].y);
  • //remet a 0 dans la matrice le bout de queue effac,e
  • MAT[serpent.queue[serpent.lgQueue].y][serpent.queue[serpent.lgQueue].x]=0;
  • //D,cale tous les ,l,ments de la queue
  • for (i=42;i>0;i--)
  • {
  • serpent.queue[i].x = serpent.queue[i-1].x;
  • serpent.queue[i].y = serpent.queue[i-1].y;
  • }
  • //Ins¦re dans le haut de la pile la nouvelle coord. du serpent.
  • serpent.queue[0].x = serpent.x;
  • serpent.queue[0].y = serpent.y;
  • //Met . jour la matrice
  • for (i=0;i<=serpent.lgQueue;i++)
  • MAT[serpent.queue[i].y][serpent.queue[i].x]=1;
  • }
  • /////////////////////////////////////////////////////////////////////////
  • // //
  • // MAIN: Routine principale //
  • // //
  • /////////////////////////////////////////////////////////////////////////
  • main(int argc,char *argv[])
  • {
  • int retour_menu=0; //Variable contenant le nøde menu selectionne
  • char Touche=0; //Touche contient la touche appuy,e
  • _set_screen_lines(43); //Mode d'ecran:80*43 Texte
  • while (retour_menu!=2)
  • {
  • retour_menu = menu(); //Affiche et gere le menu
  • if (retour_menu < 0)
  • {
  • Editeur(abs(retour_menu));
  • break;
  • }
  • if (retour_menu==0)
  • {
  • init(); //initialise les variables
  • while(taperdu!=1) //Tant qu'on appuie pas sur echap...
  • {
  • while(!kbhit()) //Tant qu'on appuie sur rien...
  • {
  • GestionDepCol(); //Apelle la fonction de dep./collision
  • GereQueue(); //Gere le deplacement de la queue
  • deplace_baballes();
  • if (taperdu==1) gameover();//Teste la mort (?!)
  • ScreenPutChar('Û',WHITE,serpent.x,serpent.y); //Affiche le serpent
  • }
  • Touche=getch(); //Les touches 'normales' renvoient un code
  • //ascii standard (sur un caractere).
  • if (Touche==0) //Ascii 0==> touche ,tendue utilis,e...
  • Touche=getch(); //Ce 2nd getch est pour r,cup,rer les touches
  • switch (Touche) //(codees sur 2 caract¦res (0+code))
  • {
  • case 27: //Echap = byebye
  • taperdu = 1;
  • case 'H': //le haut
  • serpent.dir=HAUT;
  • break;
  • case 'M': //la droite
  • serpent.dir=DROITE;
  • break;
  • case 'P': //le bas
  • serpent.dir=BAS;
  • break;
  • case 'K': //la gauche
  • serpent.dir=GAUCHE;
  • break;
  • }
  • }
  • }
  • }
  • return(0);
  • }
  • /////////////////////////////////////////////////////////////////////////
  • // //
  • // Action Professionelle 2002: //
  • // //
  • // SERPENT //
  • // //
  • // PERNES Olivier BTSIG1 //
  • // //
  • // "BALLES.C" //
  • // //
  • // //
  • /////////////////////////////////////////////////////////////////////////
  • #include "commun.h"
  • const maxbaballes = 5; //Determine le nombre de balles
  • /////////////////////////////////////////////////////////////////////////
  • // //
  • // PLACE_BALLE: Se charge de placer les balles //
  • // dans la matrice et de les afficher //
  • // (phase d'initialisation des balles) //
  • // //
  • /////////////////////////////////////////////////////////////////////////
  • void place_baballes()
  • {
  • int i,fini;
  • for (i=0;i<maxbaballes;i++) //Pour toutes les balles:
  • {
  • fini = 0; //Tant qu'on a pas trouve une place
  • while (fini==0) //libre dans la matrice
  • {
  • baballe[i].x = (random()%77)+1; //Coordonn,es X et Y al,atoires
  • baballe[i].y = (random()%41)+1; // de 1-78 X et 1-24 Y
  • baballe[i].incx = (random()%2)-1; //Incrementation en X,Y al,atoires
  • baballe[i].incy = (random()%2)-1; // de -1 . 1
  • if (baballe[i].incx == baballe[i].incy)
  • if (baballe[i].incx == 0) //Fait en sorte qu'une balle ne soit
  • baballe[i].incx = 1; //pas immobile (incx=incy=0)
  • if (baballe[i].incx != 0) //Mouvements diagonales d,sactiv,s
  • if (baballe[i].incy != 0)
  • baballe[i].incy = 0;
  • if (MAT[baballe[i].y][baballe[i].x]==0)
  • { //Si la place est libre dans la matrice
  • MAT[baballe[i].y][baballe[i].x]=3; //placer a ces coordonnees un 3
  • fini = 1;
  • }
  • }
  • //Affiche les balles
  • ScreenPutChar('', LIGHTRED | (BLUE<<4), baballe[i].x, baballe[i].y);
  • }
  • }
  • /////////////////////////////////////////////////////////////////////////
  • // //
  • // DEPLACE_BALLE: Se charge de d,placer les balles//
  • // dans la matrice et de les afficher //
  • // //
  • /////////////////////////////////////////////////////////////////////////
  • void deplace_baballes()
  • {
  • int i,j;
  • //Pour toutes les balles
  • for (i=0;i<maxbaballes;i++)
  • {
  • if (baballe[i].x+baballe[i].incx == serpent.queue[0].x)
  • if (baballe[i].y+baballe[i].incy == serpent.queue[0].y)
  • taperdu=1;//Si les prochaines coord. de la balle= position de la tete
  • //du serpent, alors on a perdu!!
  • //SI la prochaine coordonn,e de la balle est pratiquable dans la matrice:
  • if (MAT[baballe[i].y+baballe[i].incy][baballe[i].x+baballe[i].incx]==0)
  • {
  • if ((baballe[i].x+baballe[i].incx)>(78-abs(baballe[i].incx))||
  • (baballe[i].x+baballe[i].incx)<(1+abs(baballe[i].incx)))
  • {//Si on sort pas de l'ecran en X
  • baballe[i].incx = -baballe[i].incx;//on inverse l'incrementation X
  • }
  • if ((baballe[i].y+baballe[i].incy)>(41-abs(baballe[i].incy))||
  • (baballe[i].y+baballe[i].incy)<(1+abs(baballe[i].incy)))
  • {//Si on sort pas de l'ecran en Y
  • baballe[i].incy = -baballe[i].incy;//on inverse l'incrementation Y
  • }
  • }
  • else
  • {//Sinon c qu'on a un mur ou le serpent ou une balle ou un point a cet endroit
  • //Si la balle se deplace verticalement uniquement
  • if (baballe[i].incx == 0)
  • baballe[i].incy = -baballe[i].incy; //on inverse l'incrementation Y
  • baballe[i].incx = -baballe[i].incx; //on inverse l'incrementation Y
  • }
  • //RAZ du pt de la matrice a l'ancienne position de la balle
  • MAT[baballe[i].y][baballe[i].x]=0;
  • //Efface la balle de l'ecran
  • ScreenPutChar(' ', LIGHTRED | (BLUE<<4), baballe[i].x, baballe[i].y);
  • //Met a jour en X et Y les coordonn,es de la balle
  • baballe[i].x = baballe[i].x + baballe[i].incx;
  • baballe[i].y = baballe[i].y + baballe[i].incy;
  • //Place la balle dans la matrice (en y mettant un 3)
  • MAT[baballe[i].y][baballe[i].x]=3;
  • //et Affiche a l'ecran la balle
  • ScreenPutChar('', LIGHTRED | (BLUE<<4), baballe[i].x, baballe[i].y);
  • }
  • }
  • /////////////////////////////////////////////////////////////////////////
  • // //
  • // Action Professionelle 2002: //
  • // //
  • // SERPENT //
  • // //
  • // PERNES Olivier BTSIG1 //
  • // //
  • // "MENU.C" //
  • // //
  • // //
  • /////////////////////////////////////////////////////////////////////////
  • #include "commun.h"
  • /////////////////////////////////////////////////////////////////////////
  • // //
  • // TRACE_FOND : remplit l'ecran d'un caractere pour //
  • // simuler un 'beau' fond d'ecran pour le menu //
  • // //
  • /////////////////////////////////////////////////////////////////////////
  • void trace_fond()
  • {
  • int x,y;
  • //Pour dessiner sur fond bleu:
  • textattr(BLUE<<4);
  • //On efface l'ecran
  • clrscr();
  • //Pour tous les caract¦res de l'ecran:
  • for(x=0;x<80;x++)
  • for(y=0;y<43;y++)
  • //Afficher ce caractere en gris sombre
  • ScreenPutChar('²', DARKGRAY | (BLUE << 4), x, y);
  • }
  • /////////////////////////////////////////////////////////////////////////
  • // //
  • // MENU: Affiche et gere le menu //
  • // //
  • /////////////////////////////////////////////////////////////////////////
  • int menu()
  • {
  • int x,y;
  • int choix=0;
  • int finmenu = 0;
  • int touche=0;
  • //Dessine le fond d'ecran
  • trace_fond();
  • while (finmenu == 0) //Tant que l'on a pas fini avec le menu
  • {
  • //Affiche le menu:
  • ScreenPutString("ÛÛÛÛÛÛÛÛÛÛÛÛÛ", WHITE | (BLUE << 4), 34, 20);
  • ScreenPutString("Û JOUER Û", WHITE | (BLUE << 4), 34, 21);
  • ScreenPutString("Û EDITEUR Û", WHITE | (BLUE << 4), 34, 22);
  • ScreenPutString("Û A PROPOS Û", WHITE | (BLUE << 4), 34, 23);
  • ScreenPutString("Û QUITTER Û", WHITE | (BLUE << 4), 34, 24);
  • ScreenPutString("ÛÛÛÛÛÛÛÛÛÛÛÛÛ", WHITE | (BLUE << 4), 34, 25);
  • //Selon le choix (choix MOD 4), on affiche dans une couleur differente
  • switch(abs(choix) % 4){
  • case 0:
  • ScreenPutString(" JOUER ", WHITE | (YELLOW << 4), 35, 21);
  • break;
  • case 1:
  • ScreenPutString(" EDITEUR ", WHITE | (YELLOW << 4), 35, 22);
  • break;
  • case 2:
  • ScreenPutString(" A PROPOS ", WHITE | (YELLOW << 4), 35, 23);
  • break;
  • case 3:
  • ScreenPutString(" QUITTER ", WHITE | (YELLOW << 4), 35, 24);
  • break;}
  • //Attend la prochaine touche
  • touche = getch();
  • if (touche==0) touche=getch(); //Si l'on a une touche ,tendue
  • switch (touche){ //Selon la touche:
  • case 'H': //Si c le haut:
  • choix--; //on d,cr,mente l'index du menu
  • if (choix<0) choix = 3; //Evite que le menu se d,roule dans le sens
  • break; // inverse lorsque l'on monte apres 'jouer'
  • case 'P':
  • choix++; //Si c le haut, simple incrementation de l'index
  • break;
  • case 13: //Si l'on appuie sur entree:
  • textattr((BLUE<<4)|WHITE); //change les couleurs (bleu derriere,blanc
  • clrscr(); //devant), et applique en effacant l'ecran.
  • //Mise a zero de la matrice
  • for (x=0;x<80;x++)
  • for (y=0;y<43;y++)
  • MAT[y][x] = 0;
  • //Selon le num,ro de menu:
  • switch(abs(choix)%4){
  • case 1: //EDITEUR:
  • Message("Editeur:","Veuillez entrer le num,ro","du niveau a editer:");
  • ScreenSetCursor(45/2,48);
  • scanf("%d",&touche);
  • return -touche;
  • break;
  • case 2: //A PROPOS:
  • Message("SERPENT:","AP BTSIG Nø1","2002 PERNES Olivier (opernes@wanadoo.fr)");
  • getkey();
  • trace_fond();
  • break;
  • case 3: //QUITTER:
  • Message("Merci d'avoir jou, a SERPENT","(ok le nom n'est pas original)","Au Revoir!!!!!");
  • getkey();
  • return 2;
  • break;
  • case !2: //Quitte le menu sauf si on a fait a propos
  • return(0);
  • finmenu=1;
  • break;
  • }
  • }
  • }
  • }
/////////////////////////////////////////////////////////////////////////
//                                                                     //
//                     Action Professionelle 2002:                     //
//                                                                     //
//                             SERPENT                                 //
//                                                                     //
//                     PERNES Olivier BTSIG1                           //
//                                                                     //
//                            "COMMUN.H"                               //
//                                                                     //
//                                                                     //
/////////////////////////////////////////////////////////////////////////

#include <conio.h>
#include <stdlib.h>
#include <time.h>
#include <stdio.h>




int taperdu;                  //J'suis mort ou pas?? (0 ou 1)
int score;                    //score en cours (0-9)


struct {                      //Structure du serpent:
 int x;                       // position en x du serpent
 int y;                       // position en y du serpent
 int dir;                     // direction du serpent
 int lgQueue;                 // longueur de la queue
 struct {                     // 'matrice' de queue:
  int x;                      //  coordonn,e en X
  int y;                      //  coordonn,e en Y
 }queue[42];                  //  42 elements max
}serpent;

struct {                      //Structure des balles:
 int x;                       // Position en X
 int y;                       // Position en Y
 int incx;                    // Incr,mentation en X
 int incy;                    // Incr,mentation en Y
}baballe[10];                 // 10 balles maximum

struct {                      //Structure des niveaux:
 int EnCours;                 // Index en cours de Liste
 int NbMax;                   // Total de niveaux
 int Liste[100];              // Liste des num,ros de niveaux
} Niveaux;

int MAT[43][80];              //Matrice repr,sentant l'ecran (1=mur,2=pomme)


void Message(char l1[74],char l2[74],char l3[74]);
void FaireNiveau();
void ObtenirNiveaux();
int  Editeur(int nivo);
void place_baballes();
void deplace_baballes();
int menu();





/////////////////////////////////////////////////////////////////////////
//                                                                     //
//                     Action Professionelle 2002:                     //
//                                                                     //
//                             SERPENT                                 //
//                                                                     //
//                     PERNES Olivier BTSIG1                           //
//                                                                     //
//                            "EDITOR.C"                               //
//                                                                     //
//                                                                     //
/////////////////////////////////////////////////////////////////////////

#include "commun.h"



int Editeur(int nivo)
{
 char temp[64];         //Sert pour le nom de fichier lors de l'ecriture
 FILE *fichier;         //Pointeur vers le fichier a ouvrir
 int touche=0,fin=0;    //Quelle touche appuy,e?? Avons nous fini??
 int x,y;               //Variables utilis,es pour parcourir la matrice
 int curseurx,curseury; //Position du curseur

 curseurx=40;           //Place le curseur au milieu de l'ecran
 curseury=21;


  //Definition du nom de fichier en fonction du num,ro en argument
  sprintf(temp,"level%d.dat",nivo);

 if (__file_exists(temp)==0) //Detecte si le fichier existe deja
 {
 //Dans le cas ou le fichier n'existe pas:
 //'Dessine' les murs du jeu dans la matrice:
 //1)R,initialise cette derniere:
 for (x=0;x<=79;x++)
  for (y=0;y<=42;y++)
   MAT[y][x]=0;
 //2)'Trace' les bordures haute et basse
 for (x=0;x<=79;x++)
  {MAT[0][x]=1;  MAT[42][x]=1;}
 //3)'Trace' les bordures gauche et droite
 for (y=0;y<=42;y++)
  {MAT[y][0]=1;  MAT[y][79]=1;}

 }
 else {
 //Dans le cas ou le fichier existe, charger le niveau dans la matrice
 fichier = fopen(temp,"r");
 for (y=0;y<43;y++)        //43 lignes (0-42)
  for (x=0;x<81;x++)       //81 car 0-79 + 2 car. de retour ligne
   {
    touche=fgetc(fichier); //Stocke le caractere suivant dans touche
    if (touche>=48) MAT[y][x]=touche-48;  //>48 ascii = >0 (donc pas de retour
   }                                      //charriot ou autre car. systemes
  fclose(fichier);                        //Ferme le fichier
 }

 textattr((BLUE << 4) | WHITE); //Rend le fond de texte bleu et le txt blanc

 clrscr();



 while (!(fin==1)) {



 //Scanne la matrice pour y trouver des 1:
 for (x=0;x<=79;x++)
  for (y=0;y<=42;y++)
   {
    if (MAT[y][x]!=0)
    ScreenPutChar('Û', (BLUE << 4) | WHITE, x, y);//Trace les murs
   }

 //Affiche le curseur:
 if (MAT[curseury][curseurx]==0)
  ScreenPutChar('_', BLINK | (BLUE << 4) | LIGHTMAGENTA, curseurx,curseury);
 else
  //Si l'on est deja sur un mur, changer la couleur du mur.
  ScreenPutChar('Û', (BLUE << 4) | LIGHTMAGENTA,curseurx,curseury );


 while (!kbhit()); //Attendre une touche
  //Efface le curseur avant de repositionner le suivant
  ScreenPutChar(' ', (BLUE << 4), curseurx,curseury);
  touche=getch();  //Recupere le code ASCII de la touche

  if (touche==32)  //Si on appuie sur espace: inverser le statut du mur:
   MAT[curseury][curseurx] = !MAT[curseury][curseurx];// 0=absent et 1=present

  if (touche==27)  //Echap = Terminer
  {
   fin=1;
   break;
  }

  if (touche==0)               //0: touche ,tendue
   touche = getch();           //|->r,cuperer le code de la touche ,tendue
   
  switch(touche){
    case 'H':                  //haut
     if (curseury>1)
      curseury--;              //Monte le curseur
     break;
    case 'M':                  //droite
     if (curseurx<78)
     curseurx++;
     break;
    case 'P':                  //bas
     if (curseury<41)
     curseury++;
     break;
    case 'K':                  //gauche
     if (curseurx>1)
     curseurx--;
     break;
  }


 }

  //Demande la confirmation de l'enregistrement du fichier
  touche = -1;
  while ((touche <0)||(touche >1))
  {
  clrscr();
  Message("Editeur:","Voulez vous enregistrer???","(tapez 0 pour oui ou 1 pour non): ");
  ScreenSetCursor(45/2,57); //Place le curseur a la fin de la phrase
  scanf("%d",&touche);      //Saisie du chiffre
  }

  if (touche==0)
  {
  //Ecrit la matrice MAT dans le fichier...
  //ouvre le fichier en mode ,criture
   fichier=fopen(temp,"w");
   //Pour tous les elements de la matrice:
   for (y=0;y<43;y++)
    for (x=0;x<80;x++)
     {//2)v,rifier la matrice, en cas d'erreur, remplacer par un mur (1)
      if ((MAT[y][x]>1)||(MAT[y][x]<0)) MAT[y][x] = 1;
      //3)ecrire dans le fichier le caractere en cours
       fputc(MAT[y][x]+48,fichier);  // 0 + 48 = '0'et 1 + 48 = '1'
      if (x==79) fputc(10,fichier);}//Si on est en fin de ligne rajouter un
   fclose(fichier);                 //LineFeed
  }

return(0);
}



/////////////////////////////////////////////////////////////////////////
//                                                                     //
//                     Action Professionelle 2002:                     //
//                                                                     //
//                             SERPENT                                 //
//                                                                     //
//                     PERNES Olivier BTSIG1                           //
//                                                                     //
//                            "LEVEL.C"                                //
//                                                                     //
//                                                                     //
/////////////////////////////////////////////////////////////////////////
#include <dir.h>
#include "commun.h"


/////////////////////////////////////////////////////////////////////////
//                                                                     //
//                      FAIRENIVEAU: Lit le fichier de niveau, place   //
//                      les infos dans la matrice MAT, et affiche les  //
//                      murs.                                          //
//                                                                     //
/////////////////////////////////////////////////////////////////////////

void FaireNiveau()
{

 int x,y;
 int lettre;
 char tmp[50];
 FILE *fichier;
 strcpy(tmp,"level");      // "levelX.dat"
 strcat(tmp,itoa(Niveaux.Liste[Niveaux.EnCours],NULL,9));
 strcat(tmp,".dat");
 fichier = fopen(tmp,"r");
 for (y=0;y<43;y++)        //43 lignes (0-42)
  for (x=0;x<81;x++)       //81 car 0-79 + 2 car. de retour ligne
   {
    lettre=fgetc(fichier);
    if (lettre>=48) MAT[y][x]=lettre-48;  //>48 ascii = >0 (donc pas de retour
   }                                      //charriot ou autre car. systemes
  fclose(fichier);                        //Ferme le fichier

  for (y=0;y<43;y++)
   for (x=0;x<80;x++)
    if (MAT[y][x]==1)                     // Si on a un mur (1):
     ScreenPutChar('Û', WHITE, x, y);     // l'afficher

  return;
}

/////////////////////////////////////////////////////////////////////////
//                                                                     //
//                      PLACEPOINT: Place al,atoirement le point a     //
//                      manger pour le serpent.                        //
//                                                                     //
/////////////////////////////////////////////////////////////////////////
void PlacePoint()
{
 int x,y;
 int good=0;
 while (!(good==1))
 {
  x = (random()%77)+1;                     //80-2 (pour les murs), soit de 0-77
  y = (random()%41)+1;                     //43-2 (pour les murs), soit de 0-41
  if (MAT[y][x]==0)                        //V,rifie que la place est libre
   {                                       //dans la matrice,
    MAT[y][x]=2;                           //et y place un 2 . cet endroit
    good=1;
   }
 }
 ScreenPutChar(48+score, GREEN | (BLUE<<4), x, y); // Afficher le point
}




/////////////////////////////////////////////////////////////////////////
//                                                                     //
//                      MESSAGE:affiche une boite de dialogue          //
//                      avec trois lignes (l1,l2etl3)                  //
//                                                                     //
/////////////////////////////////////////////////////////////////////////

void Message(char l1[74],char l2[74],char l3[74])
{

 int lignes=0,nbCarac=0; //Nb de lignes et nb de caracteres
 int X=0,Y=0;            //Position de la fenetre
 char fnL1[78]={},fnL2[74]={},fnL3[74]={},fnL4[74]={},fnL5[74]={};
 int i=0;

  clrscr();
  //Redessine la matrice
  for (Y=0;Y<43;Y++)
   for (X=0;X<80;X++)
    {
    if (MAT[Y][X]==1) //Redessine les murs
     ScreenPutChar('Û', WHITE|(BLUE << 4), X, Y);
    if (MAT[Y][X]==2) //Redessine les points
     ScreenPutChar(48+score, BLINK|GREEN|(BLUE << 4), X, Y);
    if (MAT[Y][X]==3) //Redessine les balles
     ScreenPutChar('', BLINK|RED|(BLUE << 4), X, Y);
    }
 
 //D,termine le nombre de caract¦res max a afficher et le nb de lignes
 if (strlen(l1)>0) lignes++;
 if (strlen(l2)>0) lignes++;
 if (strlen(l3)>0) lignes++;
 if ((strlen(l1)>=strlen(l2))&&((strlen(l1)>=strlen(l3)))) nbCarac=strlen(l1);
 if ((strlen(l2)>=strlen(l1))&&((strlen(l2)>=strlen(l3)))) nbCarac=strlen(l2);
 if ((strlen(l3)>=strlen(l1))&&((strlen(l3)>=strlen(l2)))) nbCarac=strlen(l3);

 //Determine la position de la fenetre selon les infos ci dessus (centree)
 X = (80 / 2) - (nbCarac+4)/2;
 Y = (43 / 2) - (lignes+2 )/2;

 //Genere la  fenetre ligne par ligne:
 //ligne 1 (que la bordure sup,rieure)
 strcpy(fnL1,"É");
 for (i=0;i<nbCarac+2;i++)
   strcat(fnL1,"Í");                  //remplit la ligne selon le nb de car max
 strcat(fnL1,"»");


 //Lignes 2-4 : en 3 parties :
 sprintf(fnL2,"Ý %s",l1);             //1)bordure gauche+texte de la ligne
 sprintf(fnL3,"Ý %s",l2);
 sprintf(fnL4,"Ý %s",l3);

 if (strlen(fnL2)<strlen(fnL1)-2)     //2)comble la fin de la ligne si besoin
  while(strlen(fnL2)<strlen(fnL1)-2)  //  par des espaces
    strcat(fnL2," ");
 strcat(fnL2," Þ");                   //3)bordure droite
 
 if (strlen(fnL3)<strlen(fnL1)-2)
  while(strlen(fnL3)<strlen(fnL1)-2)
    strcat(fnL3," ");
 strcat(fnL3," Þ");

 if (strlen(fnL4)<strlen(fnL1)-2)
  while(strlen(fnL4)<strlen(fnL1)-2)
    strcat(fnL4," ");
 strcat(fnL4," Þ");

 //Ligne Nø5 (bordure basse)
 strcpy(fnL5,"È");
 for (i=0;i<nbCarac+2;i++)
   strcat(fnL5,"Í");
 strcat(fnL5,"¼");

 //Affichage proprement dit de la bo¼te
 ScreenSetCursor(Y,X);
 printf("%s\n",fnL1);Y++;
 ScreenSetCursor(Y,X);
 if (strlen(l1)!=0) {printf("%s\n",fnL2);Y++;}
 ScreenSetCursor(Y,X);
 if (strlen(l2)!=0) {printf("%s\n",fnL3);Y++;}
 ScreenSetCursor(Y,X);
 if (strlen(l3)!=0) {printf("%s\n",fnL4);Y++;}
 ScreenSetCursor(Y,X);
 printf("%s\n",fnL5);

}

/////////////////////////////////////////////////////////////////////////
//                                                                     //
//                      OBTENIRNIVEAUX:parcours le repertoire pour     //
//                      trouver les fichiers *.dat et en determiner le //
//                      nombre                                         //
//                                                                     //
/////////////////////////////////////////////////////////////////////////


void ObtenirNiveaux()
{
     struct ffblk f;
     char *tmp;
     int done = findfirst("*.dat", &f, FA_HIDDEN | FA_SYSTEM);//cherche les .dat
     tmp=f.ff_name + 5;  //Pointe vers le chiffre du nom de fichier,ex:"1.dat"
     while (!done)
     {
       Niveaux.Liste[Niveaux.NbMax] = atoi(tmp);//indexe le nø du niveau
       Niveaux.NbMax++;                         //incremente le nombre de niv.
       done = findnext(&f);                     //Cherche le .dat suivant
     }
     Niveaux.NbMax--;             //decremente le nombre max
     return;                      //(pour faire correspondre aux index)
}



/////////////////////////////////////////////////////////////////////////
//                                                                     //
//                     Action Professionelle 2002:                     //
//                                                                     //
//                             SERPENT                                 //
//                                                                     //
//                     PERNES Olivier BTSIG1                           //
//                                                                     //
//                           "SERPENT.C"                               //
//                                                                     //
//                                                                     //
/////////////////////////////////////////////////////////////////////////

#include "commun.h"

const vitesse=50000;         //Vitesse du jeu
const HAUT=0,DROITE=1,BAS=2,GAUCHE=3;




/////////////////////////////////////////////////////////////////////////
//                                                                     //
//                      INIT: initialise les variables                 //
//                                                                     //
/////////////////////////////////////////////////////////////////////////
void init()
{
 int i;
 score=0;
 taperdu=0;                   //ben oui, perdre des le debut c pas le but...
 srandom(time(NULL));         //initialise le g,n,rateur al,atoire
 serpent.x = 40;              //place le serpent en X au milieu de l'ecran
 serpent.y = 21;              //place le serpent en Y au milieu de l'ecran
 serpent.dir = random()%3;    //direction al,atoire: 0H,1D,2B,3G
 serpent.lgQueue=0;
 for (i=0;i<=48;i++)
  {serpent.queue[i].x = 40;   //initialise la queue
   serpent.queue[i].y = 21;}
 if (Niveaux.EnCours==0){
 Message("Bonjour!","Bienvenue dans SERPENT","Niveau 1: 3");
 sleep(1);
 Message("Bonjour!","Bienvenue dans SERPENT","Niveau 1: 2");
 sleep(1);
 Message("Bonjour!","Bienvenue dans SERPENT","Niveau 1: 1");
 sleep(1);
 clrscr();                       //efface le message
 ObtenirNiveaux();               //charge la liste de niveaux
 }
 FaireNiveau();                  //trace le niveau
 PlacePoint();                   //Place le point a attraper
 place_baballes();               //Place les balles
}

/////////////////////////////////////////////////////////////////////////
//                                                                     //
//                      TOUCHE: Se charge de la gestion du score avec  //
//                      les points, et d,clenche le changement         //
//                      de tableau                                     //
//                                                                     //
/////////////////////////////////////////////////////////////////////////

void Touche()
{
 char temp[74];

 score++;                //incr,mente le score

 if (serpent.lgQueue!=0) //augmente la taille de la queue
  serpent.lgQueue = serpent.lgQueue + (serpent.lgQueue/2);
 else
  serpent.lgQueue=2;

 if (score==10)          //passe le niveau
 {
  Niveaux.EnCours++;     //incr,mente le num,ro du niveau
  if (Niveaux.EnCours>Niveaux.NbMax) //teste si il y a encore un niveau
   {
    Message("Bravo!!","vous avez gagn,","!!!");
    getkey();
    taperdu=1;
    return;
   }
  sprintf(temp,"Niveau %d: 3",Niveaux.EnCours+1);
  Message("","Bravo!!",temp);
  sleep(1);
  sprintf(temp,"Niveau %d: 2",Niveaux.EnCours+1);
  Message("","Bravo!!",temp);
  sleep(1);
  sprintf(temp,"Niveau %d: 1",Niveaux.EnCours+1);
  Message("","Bravo!!",temp);
  sleep(1);
  clrscr();
  init();                                //R,initialise les donn,es

 }
 else
 PlacePoint();                           //Replace un point

}




/////////////////////////////////////////////////////////////////////////
//                                                                     //
//                      GAMEOVER: Comme son nom l'indique              //
//                                                                     //
/////////////////////////////////////////////////////////////////////////
void gameover()
 {
  int x,y;
  textattr( (BLUE << 4) | WHITE);
  Message ("Vous avez perdu","votre score:",itoa(score,NULL,9));
  taperdu = 1;
  while(!kbhit());
  return;
 }

/////////////////////////////////////////////////////////////////////////
//                                                                     //
//                      GESTIONDEPCOL: Gere le deplacement du serpent  //
//                      et teste les collisions...                     //
//                                                                     //
/////////////////////////////////////////////////////////////////////////

void GestionDepCol()
{
    //Ralentit le jeu de 'vitesse'æs
    usleep(vitesse);
                                            //Gestion du dep. vers le haut
    if (serpent.dir == HAUT)
     {
      if (MAT[serpent.y-1][serpent.x]==0)
       serpent.y--;                         //deplace le serpent
      else if (MAT[serpent.y-1][serpent.x]==2)
        {Touche();serpent.y--;}             //Attrap, un point
       else taperdu=1;                      //touch, un mur
     }
    if (serpent.dir == DROITE)              //Gestion du dep. vers la droite
     {
      if (MAT[serpent.y][serpent.x+1]==0)
       serpent.x++;
      else if (MAT[serpent.y][serpent.x+1]==2)
        {Touche();serpent.x++;}
       else taperdu=1;
     }
    if (serpent.dir == BAS)                 //Gestion du dep. vers le bas
     {
      if (MAT[serpent.y+1][serpent.x]==0)
       serpent.y++;
      else if (MAT[serpent.y+1][serpent.x]==2)
        {Touche();serpent.y++;}
       else taperdu=1;
     }
    if (serpent.dir == GAUCHE)              //Gestion du dep. vers la gauche
     {
      if (MAT[serpent.y][serpent.x-1]==0)
       serpent.x--;
      else if (MAT[serpent.y][serpent.x-1]==2)
        {Touche();serpent.x--;}
       else taperdu=1;
     }


    return;
}

/////////////////////////////////////////////////////////////////////////
//                                                                     //
//                      GEREQUEUE: Gere le mouvement de la queue       //
//                      g,r, en LILO (last in last out)                //
//                                                                     //
/////////////////////////////////////////////////////////////////////////
void GereQueue()
{
 int i;
 //efface le dernier element de la liste de l',cran
 ScreenPutChar('Û',BLUE,serpent.queue[serpent.lgQueue].x
                       ,serpent.queue[serpent.lgQueue].y);

 //remet a 0 dans la matrice le bout de queue effac,e
 MAT[serpent.queue[serpent.lgQueue].y][serpent.queue[serpent.lgQueue].x]=0;

 //D,cale tous les ,l,ments de la queue
 for (i=42;i>0;i--)
  {
  serpent.queue[i].x = serpent.queue[i-1].x;
  serpent.queue[i].y = serpent.queue[i-1].y;
  }

 //Ins¦re dans le haut de la pile la nouvelle coord. du serpent.
 serpent.queue[0].x = serpent.x;
 serpent.queue[0].y = serpent.y;

 //Met . jour la matrice
 for (i=0;i<=serpent.lgQueue;i++)
  MAT[serpent.queue[i].y][serpent.queue[i].x]=1;
 

}

/////////////////////////////////////////////////////////////////////////
//                                                                     //
//                      MAIN: Routine principale                       //
//                                                                     //
/////////////////////////////////////////////////////////////////////////

main(int argc,char *argv[])
{
 int retour_menu=0;            //Variable contenant le nøde menu selectionne
 char Touche=0;                //Touche contient la touche appuy,e

 _set_screen_lines(43);        //Mode d'ecran:80*43 Texte


while (retour_menu!=2)
{
 retour_menu = menu();         //Affiche et gere le menu
 if (retour_menu < 0)
  {
  Editeur(abs(retour_menu));
  break;
  }

 if (retour_menu==0)
 {
  init();                       //initialise les variables

 

  while(taperdu!=1)             //Tant qu'on appuie pas sur echap...
  {
   while(!kbhit())              //Tant qu'on appuie sur rien...
    {
     GestionDepCol();           //Apelle la fonction de dep./collision
     GereQueue();               //Gere le deplacement de la queue
     deplace_baballes();
     if (taperdu==1) gameover();//Teste la mort (?!)
     ScreenPutChar('Û',WHITE,serpent.x,serpent.y); //Affiche le serpent
    }
    Touche=getch();             //Les touches 'normales' renvoient un code
                                //ascii standard (sur un caractere).
    if (Touche==0)              //Ascii 0==> touche ,tendue utilis,e...
     Touche=getch();            //Ce 2nd getch est pour r,cup,rer les touches

    switch (Touche)             //(codees sur 2 caract¦res (0+code))
    {
     case 27:                   //Echap = byebye
      taperdu = 1;
     case 'H':                  //le haut
      serpent.dir=HAUT;
      break;
     case 'M':                  //la droite
      serpent.dir=DROITE;
      break;
     case 'P':                  //le bas
      serpent.dir=BAS;
      break;
     case 'K':                  //la gauche
      serpent.dir=GAUCHE;
      break;
    }

   }
  }
 }
 return(0);

}






/////////////////////////////////////////////////////////////////////////
//                                                                     //
//                     Action Professionelle 2002:                     //
//                                                                     //
//                             SERPENT                                 //
//                                                                     //
//                     PERNES Olivier BTSIG1                           //
//                                                                     //
//                            "BALLES.C"                               //
//                                                                     //
//                                                                     //
/////////////////////////////////////////////////////////////////////////


#include "commun.h"

const maxbaballes = 5;               //Determine le nombre de balles



/////////////////////////////////////////////////////////////////////////
//                                                                     //
//                      PLACE_BALLE: Se charge de placer les balles    //
//                      dans la matrice et de les afficher             //
//                      (phase d'initialisation des balles)            //
//                                                                     //
/////////////////////////////////////////////////////////////////////////
void place_baballes()
{
 int i,fini;
 for (i=0;i<maxbaballes;i++)           //Pour toutes les balles:
 {
  fini = 0;                            //Tant qu'on a pas trouve une place
  while (fini==0)                      //libre dans la matrice
  {
   baballe[i].x = (random()%77)+1;     //Coordonn,es X et Y al,atoires
   baballe[i].y = (random()%41)+1;     // de 1-78 X et 1-24 Y

   baballe[i].incx = (random()%2)-1;   //Incrementation en X,Y al,atoires
   baballe[i].incy = (random()%2)-1;   // de -1 . 1
   if (baballe[i].incx == baballe[i].incy)
    if (baballe[i].incx == 0)          //Fait en sorte qu'une balle ne soit
     baballe[i].incx = 1;              //pas immobile (incx=incy=0)
   if (baballe[i].incx != 0)           //Mouvements diagonales d,sactiv,s
    if (baballe[i].incy != 0)
     baballe[i].incy = 0;

   if (MAT[baballe[i].y][baballe[i].x]==0)
   {                                   //Si la place est libre dans la matrice
    MAT[baballe[i].y][baballe[i].x]=3; //placer a ces coordonnees un 3
    fini = 1;
   }
  }
 //Affiche les balles
 ScreenPutChar('', LIGHTRED | (BLUE<<4), baballe[i].x, baballe[i].y);
 }
}

/////////////////////////////////////////////////////////////////////////
//                                                                     //
//                      DEPLACE_BALLE: Se charge de d,placer les balles//
//                      dans la matrice et de les afficher             //
//                                                                     //
/////////////////////////////////////////////////////////////////////////

void deplace_baballes()
{
 int i,j;
 //Pour toutes les balles
 for (i=0;i<maxbaballes;i++)
 {
  if (baballe[i].x+baballe[i].incx == serpent.queue[0].x)
   if (baballe[i].y+baballe[i].incy == serpent.queue[0].y)
    taperdu=1;//Si les prochaines coord. de la balle= position de la tete
              //du serpent, alors on a perdu!!

  //SI la prochaine coordonn,e de la balle est pratiquable dans la matrice:
  if (MAT[baballe[i].y+baballe[i].incy][baballe[i].x+baballe[i].incx]==0)
  {
   if ((baballe[i].x+baballe[i].incx)>(78-abs(baballe[i].incx))||
       (baballe[i].x+baballe[i].incx)<(1+abs(baballe[i].incx)))
   {//Si on sort pas de l'ecran en X
    baballe[i].incx = -baballe[i].incx;//on inverse l'incrementation X
   }
   if ((baballe[i].y+baballe[i].incy)>(41-abs(baballe[i].incy))||
       (baballe[i].y+baballe[i].incy)<(1+abs(baballe[i].incy)))
   {//Si on sort pas de l'ecran en Y
    baballe[i].incy = -baballe[i].incy;//on inverse l'incrementation Y
   }
  }
  else
  {//Sinon c qu'on a un mur ou le serpent ou une balle ou un point a cet endroit
   //Si la balle se deplace verticalement uniquement
   if (baballe[i].incx == 0)
    baballe[i].incy = -baballe[i].incy; //on inverse l'incrementation Y
  baballe[i].incx = -baballe[i].incx;   //on inverse l'incrementation Y
  }
  //RAZ du pt de la matrice a l'ancienne position de la balle
  MAT[baballe[i].y][baballe[i].x]=0;
  //Efface la balle de l'ecran
  ScreenPutChar(' ', LIGHTRED | (BLUE<<4), baballe[i].x, baballe[i].y);
  //Met a jour en X et Y les coordonn,es de la balle
  baballe[i].x = baballe[i].x + baballe[i].incx;
  baballe[i].y = baballe[i].y + baballe[i].incy;
  //Place la balle dans la matrice (en y mettant un 3)
  MAT[baballe[i].y][baballe[i].x]=3;
  //et Affiche a l'ecran la balle
  ScreenPutChar('', LIGHTRED | (BLUE<<4), baballe[i].x, baballe[i].y);
 }
}
  



/////////////////////////////////////////////////////////////////////////
//                                                                     //
//                     Action Professionelle 2002:                     //
//                                                                     //
//                             SERPENT                                 //
//                                                                     //
//                     PERNES Olivier BTSIG1                           //
//                                                                     //
//                             "MENU.C"                                //
//                                                                     //
//                                                                     //
/////////////////////////////////////////////////////////////////////////



#include "commun.h"


/////////////////////////////////////////////////////////////////////////
//                                                                     //
//                   TRACE_FOND : remplit l'ecran d'un caractere pour  //
//                   simuler un 'beau' fond d'ecran pour le menu       //
//                                                                     //
/////////////////////////////////////////////////////////////////////////

void trace_fond()
{
 int x,y;
 //Pour dessiner sur fond bleu:
 textattr(BLUE<<4);
 //On efface l'ecran
 clrscr();
 //Pour tous les caract¦res de l'ecran:
 for(x=0;x<80;x++)
  for(y=0;y<43;y++)
   //Afficher ce caractere en gris sombre
   ScreenPutChar('²', DARKGRAY | (BLUE << 4), x, y);
}

/////////////////////////////////////////////////////////////////////////
//                                                                     //
//                   MENU: Affiche et gere le menu                     //
//                                                                     //
/////////////////////////////////////////////////////////////////////////

int menu()
{
 int x,y;
 int choix=0;
 int finmenu = 0;
 int touche=0;

 //Dessine le fond d'ecran
 trace_fond();

 while (finmenu == 0) //Tant que l'on a pas fini avec le menu
 {
  //Affiche le menu:
  ScreenPutString("ÛÛÛÛÛÛÛÛÛÛÛÛÛ", WHITE | (BLUE << 4), 34, 20);
  ScreenPutString("Û   JOUER   Û", WHITE | (BLUE << 4), 34, 21);
  ScreenPutString("Û  EDITEUR  Û", WHITE | (BLUE << 4), 34, 22);
  ScreenPutString("Û  A PROPOS Û", WHITE | (BLUE << 4), 34, 23);
  ScreenPutString("Û  QUITTER  Û", WHITE | (BLUE << 4), 34, 24);
  ScreenPutString("ÛÛÛÛÛÛÛÛÛÛÛÛÛ", WHITE | (BLUE << 4), 34, 25);
  //Selon le choix (choix MOD 4), on affiche dans une couleur differente
  switch(abs(choix) % 4){
   case 0:
    ScreenPutString("   JOUER   ", WHITE | (YELLOW << 4), 35, 21);
    break;
   case 1:
    ScreenPutString("  EDITEUR  ", WHITE | (YELLOW << 4), 35, 22);
    break;
   case 2:
    ScreenPutString("  A PROPOS ", WHITE | (YELLOW << 4), 35, 23);
    break;
   case 3:
    ScreenPutString("  QUITTER  ", WHITE | (YELLOW << 4), 35, 24);
    break;}
  //Attend la prochaine touche
  touche = getch();
  if (touche==0) touche=getch(); //Si l'on a une touche ,tendue
  switch (touche){          //Selon la touche:
   case 'H':                //Si c le haut:
    choix--;                //on d,cr,mente l'index du menu
    if (choix<0) choix = 3; //Evite que le menu se d,roule dans le sens
    break;                  // inverse lorsque l'on monte apres 'jouer'
   case 'P':
    choix++;                //Si c le haut, simple incrementation de l'index
    break;
   case 13:                 //Si l'on appuie sur entree:
    textattr((BLUE<<4)|WHITE);   //change les couleurs (bleu derriere,blanc
    clrscr();                    //devant), et applique en effacant l'ecran.
    //Mise a zero de la matrice
    for (x=0;x<80;x++)
     for (y=0;y<43;y++)
      MAT[y][x] = 0;
    //Selon le num,ro de menu:
    switch(abs(choix)%4){
     case 1:             //EDITEUR:
      Message("Editeur:","Veuillez entrer le num,ro","du niveau a editer:");
      ScreenSetCursor(45/2,48);
      scanf("%d",&touche);
      return -touche;
      break;
     case 2:            //A PROPOS:
      Message("SERPENT:","AP BTSIG Nø1","2002 PERNES Olivier   (opernes@wanadoo.fr)");
      getkey();
      trace_fond();
      break;
     case 3:            //QUITTER:
      Message("Merci d'avoir jou, a SERPENT","(ok le nom n'est pas original)","Au Revoir!!!!!");
      getkey();
      return 2;
      break;
     case !2:           //Quitte le menu sauf si on a fait a propos
      return(0);
      finmenu=1;
      break;
     }
  }
 }


}
 
  

 Conclusion

Bon ok, sur le site on voit pas les tabulations et les caractères ascii un peu speciaux...
Donc la mise en page est crade. Le mieux est de prendre le zip, y'a les sources, les niveaux et le mode d'emploi...
Compilé avec Rhide/djgpp
Si quelqu'un a le courage de réactiver les déplacements en diagonales des ennemis, et qu'il corrige le bug, qu'il me fasse signe, merci (y'avai un bug sur le test de collision, en diagonale, un ennemi pouvait sauter un obstacle).
Bon je pense avoir assez commenté le source, mais si vous avez des question, mailez...
Enjoy!
PS:Désolé ANSI/POSIX...  


VOTEZ, PLEASE!!!!!

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !
  • balles.cTélécharger ce fichier [Réservé aux membres club]Voir ce fichier5 079 octets
  • commun.hTélécharger ce fichier [Réservé aux membres club]Voir ce fichier2 436 octets
  • editor.cTélécharger ce fichier [Réservé aux membres club]Voir ce fichier5 046 octets
  • level.cTélécharger ce fichier [Réservé aux membres club]Voir ce fichier7 426 octets
  • level0.datTélécharger ce fichier [Réservé aux membres club]3 526 octets
  • level1.datTélécharger ce fichier [Réservé aux membres club]3 526 octets
  • level2.datTélécharger ce fichier [Réservé aux membres club]3 526 octets
  • menu.cTélécharger ce fichier [Réservé aux membres club]Voir ce fichier4 760 octets
  • Presentation.docTélécharger ce fichier [Réservé aux membres club]23 552 octets
  • Serpent.cTélécharger ce fichier [Réservé aux membres club]Voir ce fichier9 628 octets

Télécharger le zip


 Sources de la même categorie

Source avec Zip Source avec une capture SNAKE CONSOLE par Maxou1012
Source avec Zip Source avec une capture YI KING, JEU OU ORACLE par AffreuxJojp
Source avec Zip Source avec une capture BEJEWELED EN C par marven23
Source avec Zip Source avec une capture SUDOKU NIVEAU FACIL, MOYEN DIFFICILE (GOOGLE) PAS AU PLUS par cool2source
Source avec Zip PUCKMAN PROJET C GEII par aurelbo

Commentaires et avis

Commentaire de GoldenEye le 04/10/2002 20:26:55

Bien présenté, bien commenté. Je n'ai pas encore compilé mais c'est bien parti je pense

Commentaire de Dalamar le 05/10/2002 03:11:28

Bravo!! Très bon code

Commentaire de chavez le 22/12/2002 22:02:35

Super  je vais essayer ca!!!!

Commentaire de LordBob le 29/12/2002 11:52:37

c vrai je confirme, tres bon code... je vais essayer de le compiler et devoir ce ke ca donne...

Commentaire de LordBob le 29/12/2002 11:53:13

de plus, les sources bien comenté sont rares de nos jours...

Commentaire de LordBob le 29/12/2002 11:53:19

de plus, les sources bien comenté sont rares de nos jours...

Commentaire de xavkill le 29/12/2002 14:32:41

Franchement c null ! Non je plaisante ! C trop bien ! C un bon src ! C bete il oré o - pu utiliser Dos4gw !

Commentaire de TheMalkavien le 03/01/2003 17:39:39

En ennfet cela a l'air vraiment bien fait ! Mais chez moi j'arrive pas a le compiler... il me fait des centaines d'erreurs.. alors plutot que de le refaire entierement.. serait-il possible d'avoir le fichier exe pour que je puisse tester ?
Sinon encore bravo !

Commentaire de LordBob le 05/01/2003 02:50:25

g juste un truc a dire, g pas reussi a la compiler... :(... je suis sous VC++ 6.0

Commentaire de opernes le 05/01/2003 15:19:56

Bon ben bonjour a tous.
Alors les erreurs de compils, a mon avis c normal vu que le jeu a ete fait sous djgpp, et utilise des routines dos... donc vc++ il doit faire pas mal d'erreurs. mais je pense que la conversion ne doit pas etre impossible. Bon , sinon , si vous voulez un executable mailez moi, et au pire je le mettrai dans l'archive. Pour malkavien, tes centaines d'erreurs ca fai un peu beaucoup. compile bien avec les sources du zip, pas avec celui ci dessus en faisant un copier coller, y'a certains caracteres qui passent pas.

Et puis pour tous, le mieux aurait ete de choper djgpp pour compiler, un compilateur gratuit open source, dispo là : http://www.delorie.com/djgpp/zip-picker.html
(laissez vous guider, il vous donne les zip a telecharger)
parce que sinon il faudrai refaire la conversion en vc++, et la je sui pa chaud, mai rien ne vous empeche de me motiver!! ;)
allez a +

Commentaire de molusque le 09/02/2003 21:50:32

ps : vo mieu que ton jeu soit en 4d...
parcque sinon... ben sé rien kune image..

 Ajouter un commentaire




Nos sponsors


Sondage...

CalendriCode

Septembre 2010
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
27282930   

Consulter la suite du CalendriCode

 
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,827 sec (4)

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