Advertisement
Scorpionh

Tp Labyrinthe

Oct 2nd, 2014
190
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.53 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <ctype.h>
  4. #include <assert.h>
  5.  
  6. #pragma warning(disable: 4996)
  7.  
  8. // ESP : espace, MUR : mur
  9. typedef enum {ESP, MUR} Cellule;
  10.  
  11. // Hauteur et largeur du terrain de jeu (il est carré).
  12. enum {TAILLE = 4};
  13.  
  14. // Le terrain doit être initialisé conformément à la valeur de TAILLE.
  15. const Cellule terrain[TAILLE][TAILLE] = {
  16.     {ESP, ESP, ESP, ESP},
  17.     {ESP, MUR, ESP, MUR},
  18.     {ESP, ESP, MUR, ESP},
  19.     {MUR, ESP, ESP, ESP}
  20. };
  21.  
  22. // Coordonnée valide (i.e. dans le plan et cellule non occupée par un mur) ?
  23. // Attention : x désigne le n° de ligne et y le n° de colonne
  24. int estValide(int x, int y) {
  25.     return ( x >= 0 && y>= 0 && x<TAILLE && y<TAILLE && !terrain[x][y] );
  26. }
  27.  
  28. // Création d'une structure contenant un tableau
  29. typedef int Dist[TAILLE][TAILLE];
  30. // Création d'un enum qui sera attribué au case non visitée
  31. enum {PAS_VISIT = -1};
  32.  
  33. int distance(int x, int y, int xa, int ya){
  34.     Dist dst;
  35.     int dmin=0, i, j, comp=1;
  36.      for (i=0; i<TAILLE; ++i){
  37.         for (j=0; j<TAILLE; ++j) dst[i][j]=PAS_VISIT;
  38.      }
  39.      dst[x][y]=dmin;
  40.      do {
  41.      for (i=0; i<TAILLE; ++i) {
  42.          for (j=0; j<TAILLE; ++j) {
  43.              if (dst[i][j]==dmin) {
  44.                  if (estValide(i+1,j) && (dst[i+1][j]==PAS_VISIT)) {
  45.                      ++comp;
  46.                      dst[i+1][j]=dmin+1;
  47.                  }
  48.                  if (estValide (i-1,j) && (dst[i-1][j]==PAS_VISIT)) {
  49.                      ++comp;
  50.                      dst[i-1][j]=dmin+1;
  51.                  }
  52.                  if (estValide (i,j+1) && (dst[i][j+1]==PAS_VISIT) ) {
  53.                      ++comp;
  54.                      dst[i][j+1]=dmin+1;
  55.                  }
  56.                  if (estValide (i,j-1) && (dst[i][j-1]==PAS_VISIT)) {
  57.                      ++comp;
  58.                      dst[i][j-1]=dmin+1;
  59.                  }
  60.              }
  61.          }
  62.      }
  63.      ++dmin;
  64.      while(comp<=(TAILLE*TAILLE-4));}
  65.      if (dst[xa][ya]!=PAS_VISIT)
  66.             return dst[xa][ya];
  67.      else return 6;
  68. }
  69.  
  70. // Coordonnée valide (i.e. dans le plan et cellule non occupée par un mur) ?
  71. // Attention : x désigne le n° de ligne et y le n° de colonne
  72.  
  73.  
  74. // Constante et type utilitaires
  75. // Nb de directions
  76. enum {NB_DIR = 4};
  77. // haut, bas, droite et gauche
  78. const int dir[NB_DIR][2] = {{-1, 0}, {1, 0}, {0, 1}, {0, -1}};
  79.  
  80. // fonction utilitaire
  81. int conversion(char c) {
  82.     switch (c) {
  83.     case 'h': return 0;
  84.     case 'b': return 1;
  85.     case 'd': return 2;
  86.     case 'g': return 3;
  87.     }
  88.     return NB_DIR;
  89. }
  90.  
  91. int main() {
  92.     // Point de départ du joueur et point à atteindre.
  93.     int x = 0, y = TAILLE - 1, xa = TAILLE - 1, ya = TAILLE - 1;
  94.     // Nb minimal de déplacements nécessaires pour atteindre la cible à partir du point de départ.
  95.     const int mindis = distance(x,y,xa,ya);
  96.     // Nb de déplacements du joueur.
  97.     int nbDep = 0;
  98.     printf("vous pouvez gagner en %d deplacements\n", mindis);
  99.  
  100.     while (x != xa || y != ya) {
  101.      char c;
  102.      int d;
  103.      printf("Vous etes en (%d, %d) et vous devez aller en (%d, %d)\n", x, y, xa, ya);
  104.      printf("(h)aut, (b)as, (d)roite, (g)auche ? : ");
  105.      scanf("\n%c", &c);
  106.      d = conversion(tolower(c));
  107.      if (d == NB_DIR)
  108.          printf("direction inconnue");
  109.      else {
  110.          int x1 = x + dir[d][0], y1 = y + dir[d][1];
  111.          if (estValide(x1, y1)) {
  112.              x = x1;
  113.              y = y1;
  114.              ++nbDep;
  115.          }
  116.          else
  117.              printf("il y a un mur\n");
  118.      }
  119.     }
  120.     if (nbDep == mindis)
  121.      printf("Bravo !!!\n");
  122.     else if (nbDep > mindis)
  123.      printf("Vous pouvez faire mieux\n");
  124.     else
  125.      printf("Vous etes plus fort que moi !!!\n");
  126.     system("pause"); system("cls"); return 0;
  127. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement