Jeu de labyrinthe sur dos

Soyez le premier à donner votre avis sur cette source.

Vue 5 557 fois - Téléchargée 575 fois

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

Ajouter un commentaire

Commentaires

MamaSkrillex
Messages postés
1
Date d'inscription
lundi 5 décembre 2011
Statut
Membre
Dernière intervention
5 décembre 2011

Salut,
Je suis débutant dans la programmation et le premier TP que le prof est donné à mon groupe est de faire un labyrinthe incluant des objets tel que 2 capes et 4 fioles.
Les fioles sont censées permettre au joueur, qui en possède une de traverser un mur du labyrinthe. Une cape permet qui joueur qui en a une d'être invisible de l'autre. Le but étant de manger un Panda qui caché au centre du labyrinthe.
Mais je vois pas du tout comment m'y prendre pour afficher les fioles et les capes dans le labyrinthe ni comment le joueur peut s'en servir.

Est-ce que je peux avoir de l'aide ?

Merci d'avance.
cs_Kirua
Messages postés
3006
Date d'inscription
dimanche 14 avril 2002
Statut
Membre
Dernière intervention
31 décembre 2008

les princesses gagnent en beauté de génération en génération ^^

recode tout ça en C++ OO, ça clarifie tellement naturellement :)
cs_Wett
Messages postés
104
Date d'inscription
dimanche 2 mars 2003
Statut
Membre
Dernière intervention
12 juin 2005

Moui effectivement, le code est assez rebutant ^^ Sépare le bien en différents fonctions, donne des noms explicites à tes variables, enfin pense à tous ceux qui vont lire ton programme !
Sinon, l'idée est fun ^^ Ca fait bien old school j'adore ^^

Ah un petit bug, j'ai joué sur 2 maps différentes, en ayant perdu une fois sur la deuxième. J'ai donc rejoué, gagné, il me demande si je veux continue je met 1 et il a planté... Bizarre...
cs_tibur
Messages postés
101
Date d'inscription
samedi 9 février 2002
Statut
Membre
Dernière intervention
5 mai 2009

Tu as aussi foule de variables qui nous tombent dessus en debut de prog. On peut pas comprendre ce qu'elles representent.

Tu as donc deux choix : soit metre des commentaires pour expliquer ce qu'elles font, soit utiliser des noms de variables plus "self explain".
cs_tibur
Messages postés
101
Date d'inscription
samedi 9 février 2002
Statut
Membre
Dernière intervention
5 mai 2009

C'est imbitable ! Crée donc des fonctions afin que l'on puisse suivre exactement ce que tu fais dans ton code. Crée donc par commencer une fonction initialisation, affichage, ...

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.