Jeu de labyrinthe sur dos

Description

Petit jeu sur dos : vous (caractère C) etes dans un labyrinthe et vous devez trouver une princesse (caractère X).

Source / Exemple :


#include "perso.h"

int main(int argc, char *argv[])
{

//déclaration des variables
  int i,j,x1,y1,x2,y2,x3,y3,x,y,xp,yp,xa,ya;  
  int lign,col;
  int fin;
  int n1,n2;  
  FILE *fp;
  char **terr;
  char c;
  char niv[10];
  char touche;
  int choix;
  int depv,deph,xbonus,ybonus;
  int n;
  int bcle;
  int vie;
  int score;
  int arretb;
  int arretaffb;
  int arretperd;
  int arretposc;
  int arretreposit;
  int arretaffpause;
  int arretarm;
  int power;
  int arretreposmstre;
  int poss;
  int coppower;
  char cniv;
  
 do{

 //initialisation à un pour permettre la boucle infinie
    bcle=1;
 //initialisation à zéro pour le début du jeu   
    fin=0;
    
//initialisation des variables
n=0;
deph=0;
depv=0;
srand(time(0));
n1=0;
n2=0;
vie=3;
arretb=0;
arretaffb=0;
arretperd=0;
arretposc=0;
arretreposit=0;
arretaffpause=0;
score=0; 
arretarm=0;
power=0;
arretreposmstre=0;
poss=0;
coppower=0;
strcpy(niv,"");

    //effacer l'ecran
    clrscr();
    
    //présentation
    //présentation
    textcolor(YELLOW);
    printf("\t\t************** Sauvez Marianne ****************\n");
    printf("\t\t****************** Acte III *******************\n\n\n");
    textcolor(LIGHTBLUE);
    printf("\t\t************** A vous de jouer ! **************\n\n");

do{
    //choix de la map
    textcolor(LIGHTRED);
    printf("\tNiveau ?\n\n\t\t->map(1)\n\n\t\t->map(2)\n\n\t\t->map(3)\n\n\t\t ... \n\n\t\t->map(9)");
    printf("\n\n\tEntrez le numero de la map a ouvrir : ");
    gets(niv);
    cniv=niv[1];
    clrscr();
}while(cniv!='\0');           
    //On ajoute : .txt au nombre entré par l'utilisateur
    niv[1]='.';
    niv[2]='t';
    niv[3]='x';
    niv[4]='t';
    niv[5]='\0';//pour terminer le chaine de caractères
  
    fp = fopen (niv, "r");//ouverture du fichier
    if (fp == NULL) printf ("Nom de fichier incorrect ou jeton non disponible\n");//signalisation d'erreur
  
     else {
          //effacer l'ecran
          clrscr();
          
          fscanf (fp, "%d", &lign);//lecture du nombre de lignes
          fscanf (fp, "%d", &col);//lecture du nombre de colonnes
        
               
          //allocation dynamique du tableau :
          
          terr = (char**) malloc (lign * sizeof(char*));
          for (i=0; i<col; i++) {
                    terr [i] = (char*) malloc ((col) * sizeof(char));
                    }//fin du for
          
          /*on a maintenant un tableau de caractères à 2 dimensions et au bon nombre de
          lignes et colonnes*/
          
          //copie du fichier texte dans le tableau :
 
              
                          for(i=0;i<lign;i++)
                          {
                          for(j=-1;j<col;j++)
                          {
                          c=fgetc(fp);
                          if(c=='8' || c=='l' || c==' ' || c=='O' ||c=='o') terr[i][j]=c;
                          }
                          }                                     
             
             
           /*le tableau est alors rempli*/
 
                     

/*positionnement aléatoire de Marianne 
sur le terrain représenté par le tableau terr
vérifiant qu'il n'y ait aucun obstacle (buisson)
sur la position choisie*/
do{
x1=(rand()%(col-2))+1;
y1=(rand()%(lign-2))+1;
}while(terr[y1][x1]=='8' || terr[y1][x1]=='O' || terr[y1][x1]=='o');
terr[y1][x1]='X';

/*positionnement aléatoire du chevalier
sur le terrain représenté par le tableau terr
vérifiant qu'il n'y ait aucun obstacle (buisson ou Marianne) 
sur la position choisie*/
do{
x2=(rand()%(col-2))+1;
y2=(rand()%(lign-2))+1;
}while(terr[y2][x2]=='8' || terr[y2][x2]=='X' || terr[y2][x2]=='O' || terr[y2][x2]=='o');
terr[y2][x2]='C';

//affichage du terrain(ou map) (apperçu avant le debut du jeu)
for(i=0;i<lign;i++)
{
for(j=0;j<col;j++)
{
textcolor(GREEN);
putchar(terr[i][j]);
}
printf("\n");
}
textcolor(YELLOW);
gotoxy(x1+1,y1+1);
putchar(terr[y1][x1]);

textcolor(WHITE);
gotoxy(x2+1,y2+1);
putchar(terr[y2][x2]);

//pause avant le debut du jeu
gotoxy(1,lign+2);
system("PAUSE");
gotoxy(1,lign+2);
printf("                                        ");

/*choix des coordonnées du bonus (point de vie supplémentaire) au hasard ou apporte des points*/
do{
xbonus=(rand()%(col-2))+1;
ybonus=(rand()%(lign-2))+1;
}while(terr[ybonus][xbonus]=='8' || terr[ybonus][xbonus]=='X' || terr[ybonus][xbonus]=='C' || terr[ybonus][xbonus]=='O' || terr[ybonus][xbonus]=='o' );
terr[ybonus][xbonus]='*';

/*choix des coordonnées du monstre 1 au hasard*/
do{
xp=(rand()%(col-2))+1;
yp=(rand()%(lign-2))+1;
}while(terr[yp][xp]=='8' || terr[yp][xp]=='X' || terr[yp][xp]=='C' || terr[yp][xp]=='*' || terr[yp][xp]=='O' || terr[yp][xp]=='o' );
terr[yp][xp]='P';

/*choix des coordonnées du monstre 2 au hasard*/
do{
x=(rand()%(col-2))+1;
y=(rand()%(lign-2))+1;
}while(terr[y][x]=='8' ||terr[y][x+1]=='8'|| terr[y][x-1]=='8' || terr[y][x]=='X' || terr[y][x]=='C' || terr[y][x]=='P' || terr[y][x]=='O' || terr[y][x]=='o' || terr[y][x]=='*');
terr[y][x]='M';

/*choix des coordonnées du monstre 3 au hasard*/
do{
x3=(rand()%(col-2))+1;
y3=(rand()%(lign-2))+1;
}while(terr[y3][x3]=='8' || terr[y3][x3]=='X'  || terr[y3][x3]=='*' || terr[y3][x3]=='C' || terr[y3][x3]=='P' || terr[y3][x3]=='M' || terr[y3+1][x3]=='8' || terr[y3-1][x3]=='8' || terr[y3][x3]=='O' || terr[y3][x3]=='o');
terr[y3][x3]='Q';

/*choix de l'arme au hasard*/
do{
xa=(rand()%(col-2))+1;
ya=(rand()%(lign-2))+1;
}while(terr[ya][xa]=='8' || terr[ya][xa]=='X'  || terr[ya][xa]=='*' || terr[ya][xa]=='C' || terr[ya][xa]=='P' || terr[ya][xa]=='M' || terr[ya][xa]=='O' || terr[ya][xa]=='o');
terr[ya][xa]='#';

while(bcle)
{
//affichage du chevalier à l'écran
gotoxy(x2+1,y2+1);
textcolor(LIGHTBLUE);
putchar('C');

//monstre qui poursuit
gotoxy(xp+1,yp+1);
putchar('P');
textcolor(LIGHTRED);
terr[yp][xp]='P';

//affichage du premier monstre à l'écran
gotoxy(x+1,y+1);
textcolor(MAGENTA);
putchar('M');
terr[y][x]='M';

//affichage du second monstre à l'écran
gotoxy(x3+1,y3+1);
textcolor(LIGHTCYAN);
putchar('Q');
terr[y3][x3]='Q';

sleep(100);
gotoxy(xp+1,yp+1);
putchar(' ');
gotoxy(x+1,y+1);
putchar(' ');
gotoxy(x3+1,y3+1);
putchar(' ');

//affichage de la vie
gotoxy(col+4,1+1);
textcolor(RED);
printf("VIE : %d",vie);
//affichage du score
gotoxy(col+4,3+1);
textcolor(YELLOW);
printf("SCORE : %d",score);

//affichage du bonus
gotoxy(xbonus+1,ybonus+1);
textcolor(YELLOW);
putchar('*');
terr[ybonus][xbonus]='*';

//affichage de l'arme
gotoxy(xa+1,ya+1);
textcolor(RED);
putchar('#');
terr[ya][xa]='#';

/*si l'un des monstres rencontre le chevalier
la partie est terminée*/
if(terr[y2][x2]=='M' || terr[y2][x2]=='Q' || terr[y2][x2]=='P') 
{
//perte de vie
if(arretperd==0 && power==0)
{
vie--;
arretperd=1;
}

if(power==1 && arretreposmstre==0)
{
//si l'on possède l'arme le monstre est tué et est alors replacé sur le terrain
if(terr[y2][x2]=='P')
{
/*choix des coordonnées du monstre 1 au hasard*/
do{
xp=(rand()%(col-2))+1;
yp=(rand()%(lign-2))+1;
}while(terr[yp][xp]=='8' || terr[yp][xp]=='X' || terr[yp][xp]=='C' || terr[yp][xp]=='*' || terr[yp][xp]=='O' || terr[yp][xp]=='o' || terr[yp][xp]=='Q' || terr[yp][xp]=='M' || terr[yp][xp]=='#');
terr[yp][xp]='P';
}

if(terr[y2][x2]=='M')
{
/*choix des coordonnées du monstre 2 au hasard*/
do{
x=(rand()%(col-2))+1;
y=(rand()%(lign-2))+1;
}while(terr[y][x]=='8' ||terr[y][x+1]=='8'|| terr[y][x-1]=='8' || terr[y][x]=='X' || terr[y][x]=='C' || terr[y][x]=='P' || terr[y][x]=='O' || terr[y][x]=='o' || terr[y][x]=='*' || terr[y][x]=='Q' || terr[y][x]=='#');
terr[y][x]='M';
}

if(terr[y2][x2]=='Q')
{
/*choix des coordonnées du monstre 3 au hasard*/
do{
x3=(rand()%(col-2))+1;
y3=(rand()%(lign-2))+1;
}while(terr[y3][x3]=='8' || terr[y3][x3]=='X'  || terr[y3][x3]=='*' || terr[y3][x3]=='C' || terr[y3][x3]=='P' || terr[y3][x3]=='M' || terr[y3+1][x3]=='8' || terr[y3-1][x3]=='8' || terr[y3][x3]=='O' || terr[y3][x3]=='o' || terr[y3][x3]=='#');
terr[y3][x3]='Q';
}

arretreposmstre=1;
}

//remise à zéro de la case où se situait le monstre
if(arretreposit==0)
{
gotoxy(x2+1,y2+1);
putchar(' ');
terr[y2][x2]=' ';
arretreposit=1;
}

//si il ne reste pas de vie, la partie est finie 
if(vie==0)
{
gotoxy(col+4,1+1);
textcolor(LIGHTRED);
printf("VIE : %d",vie);
gotoxy(col+4,5+1);
printf("Vous etes un incapable ! (Game over)");
fin=1;
}

//reposition du chevalier sur la carte si il a perdu une vie
if(arretposc==0 && power==0)
{
do{
x2=(rand()%(col-2))+1;
y2=(rand()%(lign-2))+1;
}while(terr[y2][x2]=='8' || terr[y2][x2]=='X' || terr[y2][x2]=='M' || terr[y2][x2]=='Q' || terr[y2][x2]=='P' || terr[y2][x2]=='*' || terr[y2][x2]=='o' || terr[y2][x2]=='O' || terr[y2][x2]=='#');
terr[y2][x2]='C';
arretposc=1;
}

if(vie!=0 && arretaffpause==0 && power==0)
{
//pause lorsqu'on perd une vie 
gotoxy(col+4,1+1);
textcolor(RED);
printf("VIE : %d",vie);
gotoxy(col+4,5+1);
printf("                        ");
gotoxy(col+4,5+1);
printf("Perdu !"); 
gotoxy(1,lign+2); 
system("PAUSE");
gotoxy(col+4,5+1);
printf("       ");
gotoxy(1,lign+2);
printf("                                        "); 
arretaffpause=1;
} 

if(power==1) 
{
power=0;
coppower=0;
gotoxy(col+4,5+1);
printf("                        ");
}

}

//si le chevalier attrape un bonus
if(terr[y2][x2]=='*')
{
terr[y2][x2]==' ';
if(arretb==0)
{
if(rand()%9==0) vie++;
else score +=10;
arretb=1;
}
gotoxy(x2+1,y2+1);
textcolor(YELLOW);
putchar('C');
if(arretaffb==0)
{
do{
xbonus=(rand()%(col-2))+1;
ybonus=(rand()%(lign-2))+1;
}while(terr[ybonus][xbonus]=='8' || terr[ybonus][xbonus]=='X' || terr[ybonus][xbonus]=='C' || terr[ybonus][xbonus]=='O' || terr[ybonus][xbonus]=='o' || terr[ybonus][xbonus]=='P' || terr[ybonus][xbonus]=='Q' || terr[ybonus][xbonus]=='M');
terr[ybonus][xbonus]='*';
arretaffb=1;
}
}

//si le chevalier attrape une arme
if(terr[y2][x2]=='#' && power==0)
{
score+=20;
terr[y2][x2]=' ';
gotoxy(col+4,5+1);
textcolor(LIGHTGRAY);
printf("Le pouvoir est en vous !"); 
gotoxy(x2+1,y2+1);
putchar(' ');
power=1;
poss=1;
}

if(arretarm==0 && rand()%5==0 && poss==1 && coppower==0)
{
coppower=1;
do{
xa=(rand()%(col-2))+1;
ya=(rand()%(lign-2))+1;
}while(terr[ya][xa]=='8' || terr[ya][xa]=='X' || terr[ya][xa]=='C' || terr[ya][xa]=='O' || terr[ya][xa]=='o' || terr[ya][xa]=='P' || terr[ya][xa]=='Q' || terr[ya][xa]=='M' || terr[ya][xa]=='*');
terr[ya][xa]='#';
arretarm=1;
poss=0;
}

//choix entre continuer et quitter 
switch(fin)
{
case 1 :gotoxy(1,lign+2);
        printf("Vous avez perdu\n\n");
        printf("continuer?\n->oui(1)\n->non(0)\n");
        scanf("%d",&choix);
        bcle=0;
        break;
        
}
/*la case avant le prochain déplacement est remise à zéro puisque le
monstre change de case*/
terr[yp][xp]=' ';
terr[y][x]=' ';
terr[y3][x3]=' ';

//Intelligence artificielle des monstres
//déplacement vers la droite ou vers la gauche aléatoire pour le monstre concerné
if((rand()%100)%4==0 && terr[y][x+1]!='8' && terr[y][x+1]!='l'  && terr[y][x+1]!='X' && terr[y][x+1]!='O' && terr[y][x+1]!='o' ) x=x+1;
if((rand()%100)%3==0  && terr[y][x-1]!='8' && terr[y][x-1]!='l' && terr[y][x-1]!='X' && terr[y][x-1]!='O' && terr[y][x-1]!='o' ) x=x-1;

//déplacement vers le haut  ou vers le bas aléatoire pour le monstre concerné
if((rand()%100)%4==0 && terr[y3+1][x3]!='8' && terr[y3+1][x3]!='l' && terr[y3+1][x3]!='X' && terr[y3+1][x3]!='O' && terr[y3+1][x3]!='o' ) y3=y3+1;
if((rand()%100)%3==0  && terr[y3-1][x3]!='8' && terr[y3-1][x3]!='l' && terr[y3-1][x3]!='X' && terr[y3-1][x3]!='O' && terr[y3-1][x3]!='o' ) y3=y3-1;

//poursuite du chevalier par le monstre concerné
if((rand()%100)%2==0)
{
if(xp<x2)
{
//deplacement vers la droite
if((xp+1)<(col-1) && terr[yp][xp+1]!='8'&& terr[yp][xp+1]!='X' && terr[yp][xp+1]!='O' && terr[yp][xp+1]!='o') xp=xp+1;
}
if(yp>y2)
{
//deplacement vers le haut
if((yp-1)>0 && terr[yp-1][xp]!='8'&& terr[yp-1][xp]!='X' && terr[yp-1][xp]!='O' && terr[yp-1][xp]!='o') yp=yp-1;
}
if(xp>x2)
{
//deplacement vers la gauche
if((xp-1)>0 && terr[yp][xp-1]!='8'&& terr[yp][xp-1]!='X' && terr[yp][xp-1]!='O' && terr[yp][xp-1]!='o') xp=xp-1;
}
if(yp<y2)
{
//deplacement vers le bas
if((yp+1)<(lign-1) && terr[yp+1][xp]!='8'&& terr[yp+1][xp]!='X' && terr[yp+1][xp]!='O' && terr[yp+1][xp]!='o') yp=yp+1;
}
}

//le chevalier se déplace si une touche de clavier appropriée est frappée
 if(kbhit())
  { 
  //permet la génération des bonus
  arretb=0;
  arretaffb=0;
  //permet le controle de la vie
  arretperd=0;
  //permet le replacement du chevalier si il meurt
  arretposc=0;
  //permet d'effacer la case ou s'est deja situé le monstre
  arretreposit=0;
  //permet de faire le lancement d'une pause en cas de perte d'une vie
  arretaffpause=0;
  //permet la reposition du monstre
  arretreposmstre=0;
  //permet la generation d'armes
  arretarm=0;
  
  //permet l'affichage point par point du déplacement du chevalier
 if(terr[y2][x2]!='o'&& terr[y2][x2]!='O' && terr[y2][x2]!='Q' && terr[y2][x2]!='P' && terr[y2][x2]!='M')
   {
    gotoxy(x2+1,y2+1);
    putchar(' ');
    terr[y2][x2]=' ';
   }
  
  //maintien de l'affichage des tunnels à l'écran
  else {
   if(terr[y2][x2]=='o')
    {
    gotoxy(x2+1,y2+1);
    textcolor(WHITE);
    putchar('o');
    }
    if(terr[y2][x2]=='O')
    {
    gotoxy(x2+1,y2+1);
    textcolor(WHITE);
    putchar('O');
    }
    }
    //valeur de la touche frappée affectée à la variable touche      
    touche=getch ();
    switch (touche)
          {
          //deplacement vers le bas
            case '2' : depv = 1 ; deph = 0 ; break ;
          //deplacement vers la gauche
            case '4' : depv = 0 ; deph = -1 ; break ;
          //deplacement vers la droite
            case '6' : depv = 0 ; deph = 1 ; break ;
           //deplacement vers le haut 
            case '8' : depv = -1 ; deph = 0 ; break ;   
          }

//changement des coordonnées du chevalier selon la touche frappée
     x2+=deph;
     y2+=depv;

//passage dans un tunnel (téléportation dans une autre zone)
if(terr[y2][x2]=='o')
{
do{
x2=(rand()%(col-2))+1;
y2=(rand()%(lign-2))+1;
}while(terr[y2][x2]!='O');
} 

else if(terr[y2][x2]=='O')
{
do{
x2=(rand()%(col-2))+1;
y2=(rand()%(lign-2))+1;
}while(terr[y2][x2]!='o');
} 
    
/*permet de stopper le déplacement losqu'on fonce vers un obstacle 
ou vers les limites du terrain*/          
if(terr[y2][x2]=='8' || terr[y2][x2]=='l')
   {
   x2-=deph;
   y2-=depv;
   }
   
/*affichage du cavalier sur la map 
au fur et à mesure de ses déplacements*/
if(terr[y2][x2]!='X' && terr[y2][x2]!='o' && terr[y2][x2]!='O')
   {
    gotoxy(x2+1,y2+1);
    textcolor(LIGHTBLUE);
    putchar('C');
    terr[y2][x2]='C';
    }
   
//si Marianne est trouvée, le chevalier reste sur la position de Marianne
if(terr[y2][x2]=='X')  
    {
    gotoxy(x2+1,y2+1);
    textcolor(MAGENTA);
    putchar('C');
    }
    

/*si Marianne est trouvée c'est à dire 
si l'on parvient à la case contenant 
le caractère 'X', la partie est terminée*/   
if(terr[y2][x2]=='X') 
{
   gotoxy(1,lign+2);
   textcolor(YELLOW);
   printf("Vous avez gagne\n\n");
   printf("continuer?\n->oui(1)\n->non(0)\n");
   scanf("%d",&choix);
   
 
   switch(choix)
   {
   case  0 : exit;return 0;
   case  1 : bcle=0;
             break;
   }
 
}
  
}
}

 //liberatioon de la mémoire occupée par le tableau 
   for (i=0; i<col; i++) free(terr [i]);            
   free(terr);
   
    //fermeture du fichier
    fclose(fp);
}//accolade fermante du else d'ouverture de fichier
}while(choix);
system("PAUSE");
return 0;
}

Conclusion :


petit bug: des fois le symbole de l'arme n'est pas effacé automatiquement alors que l'arme apparait ailleurs.

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.