Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // fonction qui trace le chemin d'un perso (il ne peut aller que sur du DIRT ou RESSOURCES et de Z en Z)
- int compterDistanceChemin(tile_t etape, object_t perso, map_t map){
- liste_t tiles = getListeTilesMap(map);
- liste_t e;
- tile_t dest = NULL;
- tile_t t; tile_t v;
- static int voisins_diff_u[6] = {-1, 0, 1, 1, 0, -1};
- static int voisins_diff_v[6] = {-1, -1, 0, 1, 1, 0};
- int i, n;
- int dx, dy, dist, maxDist, chemin;
- v = getSocleObject(perso);
- n = 0;
- dx = getVTile(etape) - getVTile(v);
- dy = getUTile(etape) - getUTile(v);
- maxDist = (abs(dx) + abs(dy) + abs((dx - dy)))/2;
- // tile marquée comme visitée
- setCheckedTile(etape, 1);
- // cas où on est déjà arrivé (donc pas besoin de chercher la suite)
- if(etape == getSocleObject(perso))
- return 0;
- if(getTypeTile(etape) == DIRTGRASS
- || getTypeTile(etape) == PLAINE
- || getTypeTile(etape) == FORET
- || getTypeTile(etape) == PIERRE)
- return 1;
- else{
- // 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
- for(e = tiles ; e != NULL; e = liste_get_suivant(e)){
- t = liste_get_data_tile(e);
- if(getUTile(t) != getUTile(etape) + voisins_diff_u[i])
- continue;
- if(getVTile(t) != getVTile(etape) + voisins_diff_v[i])
- continue;
- if(getZTile(t) != getZTile(etape) && getZTile(t) != getZTile(etape) + 1 & getZTile(t) != getZTile(etape) - 1)
- continue;
- if(getEnterreTile(t) != 1)
- continue;
- if(getCheckedTile(t) != 0)
- continue;
- if(getTypeTile(t) != DIRTGRASS
- && getTypeTile(t) != PLAINE
- && getTypeTile(t) != FORET
- && getTypeTile(t) != PIERRE)
- continue;
- dx = getVTile(t) - getVTile(v);
- dy = getUTile(t) - getUTile(v);
- dist = (abs(dx) + abs(dy) + abs((dx - dy)))/2;
- if(dist > maxDist)
- continue;
- if(getCheckedTile(t) == 0){
- n += compterDistanceChemin(t, perso, map);
- }
- }
- return n;
- }
- }
- // regarde la distance pour chaque voisin et choisit la plus basse
- tile_t tileDuCheminLePlusCourt(tile_t etape, object_t perso, map_t m){
- // faire ça pour chaque voisin de la tile du perso
- int maxChemin = 0;
- int cheminTampon;
- liste_t tiles = getListeTilesMap(m);
- liste_t e;
- tile_t dest = NULL;
- tile_t t; tile_t v;
- int i;
- static int voisins_diff_u[6] = {-1, 0, 1, 1, 0, -1};
- static int voisins_diff_v[6] = {-1, -1, 0, 1, 1, 0};
- // on calcule le chemin de chaque voisin et on renvoie le voisin qui a le plus court
- for(i = 0 ; i < 6 ; i++){
- for(e = tiles ; e != NULL; e = liste_get_suivant(e)){
- t = liste_get_data_tile(e);
- // tous les checks à 0
- if(getUTile(t) == getUTile(etape) + voisins_diff_u[i]
- && getVTile(t) == getVTile(etape) + voisins_diff_v[i]
- && (getZTile(t) == getZTile(etape) || getZTile(t) == getZTile(etape) + 1 || getZTile(t) == getZTile(etape) - 1)
- && getEnterreTile(t) == 1
- && getCheckedTile(t) == 0
- && (getTypeTile(t) == DIRTGRASS
- || getTypeTile(t) == PLAINE
- || getTypeTile(t) == FORET
- || getTypeTile(t) == PIERRE)){
- resetCheckedTile(m);
- // vrai dénombrage du chemin
- cheminTampon = compterDistanceChemin(t, perso, m);
- if(cheminTampon > maxChemin){
- maxChemin = cheminTampon;
- dest = t;
- }
- if(t == getSocleObject(perso))
- dest = t;
- }
- }
- }
- return dest;
- }
- void trouverCheminOk(object_t perso, map_t map){
- // on a maintenant une tile voisine plus proche de la destination finale
- // ou bien c'est NULL et à ce moment là le perso ne bouge pas
- tile_t dest = tileDuCheminLePlusCourt(getEtapeObject(perso), perso, map);
- if(dest != NULL
- && dest != getDestTileObject(perso)){
- setDestTileObject(perso, dest);
- // alors il y va, puis recommence, jusqu'à sa destination finale (son SOCLE)
- setDestXObject(perso, getXTile(getDestTileObject(perso)));
- setDestYObject(perso, getYTile(getDestTileObject(perso)));
- setNewZObject(perso, getZTile(getDestTileObject(perso)));
- // si ce n'est pas la destination finale on recommence
- }
- else if(dest == NULL)
- console_printf("destination error");
- else if (dest == getDestTileObject(perso)){
- console_printf("identite de destination");
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement