Advertisement
Guest User

Untitled

a guest
Oct 21st, 2014
140
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.19 KB | None | 0 0
  1. // fonction qui trace le chemin d'un perso (il ne peut aller que sur du DIRT ou RESSOURCES et de Z en Z)
  2. int compterDistanceChemin(tile_t etape, object_t perso, map_t map){
  3.     liste_t tiles = getListeTilesMap(map);
  4.     liste_t e;
  5.     tile_t dest = NULL;
  6.     tile_t t; tile_t v;
  7.     static int voisins_diff_u[6] = {-1, 0, 1, 1, 0, -1};
  8.     static int voisins_diff_v[6] = {-1, -1, 0, 1, 1, 0};
  9.     int i, n;
  10.     int dx, dy, dist, maxDist, chemin;
  11.    
  12.     v = getSocleObject(perso); 
  13.     n = 0;
  14.    
  15.     dx = getVTile(etape) - getVTile(v);
  16.     dy = getUTile(etape) - getUTile(v);
  17.     maxDist = (abs(dx) + abs(dy) + abs((dx - dy)))/2;
  18.    
  19.     // tile marquée comme visitée
  20.     setCheckedTile(etape, 1);
  21.    
  22.     // cas où on est déjà arrivé (donc pas besoin de chercher la suite)
  23.     if(etape == getSocleObject(perso))
  24.         return 0;      
  25.     if(getTypeTile(etape) == DIRTGRASS
  26.         || getTypeTile(etape) == PLAINE
  27.         || getTypeTile(etape) == FORET
  28.         || getTypeTile(etape) == PIERRE)
  29.         return 1;  
  30.     else{
  31.     // l'idée est de check les voisins de la tile où se trouve le perso pour trouver une qui le rapproche de sa destination finale
  32.         for(e = tiles ; e != NULL; e = liste_get_suivant(e)){
  33.             t = liste_get_data_tile(e);  
  34.            
  35.             if(getUTile(t) != getUTile(etape) + voisins_diff_u[i])
  36.                 continue;
  37.            
  38.             if(getVTile(t) != getVTile(etape) + voisins_diff_v[i])
  39.                 continue;
  40.            
  41.             if(getZTile(t) != getZTile(etape) && getZTile(t) != getZTile(etape) + 1 & getZTile(t) != getZTile(etape) - 1)
  42.                 continue;
  43.            
  44.             if(getEnterreTile(t) != 1)
  45.                 continue;
  46.            
  47.             if(getCheckedTile(t) != 0)
  48.                 continue;
  49.                
  50.             if(getTypeTile(t) != DIRTGRASS
  51.             && getTypeTile(t) != PLAINE
  52.             && getTypeTile(t) != FORET
  53.             && getTypeTile(t) != PIERRE)   
  54.                 continue;
  55.            
  56.             dx = getVTile(t) - getVTile(v);
  57.             dy = getUTile(t) - getUTile(v);
  58.             dist = (abs(dx) + abs(dy) + abs((dx - dy)))/2;
  59.            
  60.             if(dist > maxDist)
  61.                 continue;
  62.            
  63.             if(getCheckedTile(t) == 0){
  64.                 n += compterDistanceChemin(t, perso, map);
  65.             }
  66.         }
  67.         return n;
  68.     }  
  69. }
  70.  
  71. // regarde la distance pour chaque voisin et choisit la plus basse
  72. tile_t tileDuCheminLePlusCourt(tile_t etape, object_t perso, map_t m){
  73.     // faire ça pour chaque voisin de la tile du perso
  74.     int maxChemin = 0;
  75.     int cheminTampon;
  76.     liste_t tiles = getListeTilesMap(m);
  77.     liste_t e;
  78.     tile_t dest = NULL;
  79.     tile_t t; tile_t v;
  80.     int i;
  81.     static int voisins_diff_u[6] = {-1, 0, 1, 1, 0, -1};
  82.     static int voisins_diff_v[6] = {-1, -1, 0, 1, 1, 0};
  83.    
  84.     // on calcule le chemin de chaque voisin et on renvoie le voisin qui a le plus court
  85.     for(i = 0 ; i < 6 ; i++){
  86.         for(e = tiles ; e != NULL; e = liste_get_suivant(e)){
  87.             t = liste_get_data_tile(e);  
  88.             // tous les checks à 0
  89.             if(getUTile(t) == getUTile(etape) + voisins_diff_u[i]
  90.             && getVTile(t) == getVTile(etape) + voisins_diff_v[i]
  91.             && (getZTile(t) == getZTile(etape) || getZTile(t) == getZTile(etape) + 1 || getZTile(t) == getZTile(etape) - 1)
  92.             && getEnterreTile(t) == 1
  93.             && getCheckedTile(t) == 0
  94.             && (getTypeTile(t) == DIRTGRASS
  95.             || getTypeTile(t) == PLAINE
  96.             || getTypeTile(t) == FORET
  97.             || getTypeTile(t) == PIERRE)){
  98.                 resetCheckedTile(m);
  99.                 // vrai dénombrage du chemin
  100.                 cheminTampon = compterDistanceChemin(t, perso, m);
  101.                
  102.                 if(cheminTampon > maxChemin){
  103.                     maxChemin = cheminTampon;
  104.                     dest = t;
  105.                 }
  106.                 if(t == getSocleObject(perso))
  107.                     dest = t;  
  108.             }
  109.         }
  110.     }
  111.    
  112.     return dest;
  113. }
  114.  
  115. void trouverCheminOk(object_t perso, map_t map){
  116.     // on a maintenant une tile voisine plus proche de la destination finale
  117.     // ou bien c'est NULL et à ce moment là le perso ne bouge pas
  118.     tile_t dest = tileDuCheminLePlusCourt(getEtapeObject(perso), perso, map);
  119.    
  120.     if(dest != NULL
  121.     && dest != getDestTileObject(perso)){
  122.         setDestTileObject(perso, dest);
  123.         // alors il y va, puis recommence, jusqu'à sa destination finale (son SOCLE)
  124.         setDestXObject(perso, getXTile(getDestTileObject(perso)));
  125.         setDestYObject(perso, getYTile(getDestTileObject(perso)));
  126.         setNewZObject(perso, getZTile(getDestTileObject(perso)));
  127.         // si ce n'est pas la destination finale on recommence
  128.     }  
  129.     else if(dest == NULL)
  130.         console_printf("destination error");
  131.     else if (dest == getDestTileObject(perso)){
  132.         console_printf("identite de destination");
  133.     }
  134. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement