Newsgroup: it.comp.lang.c
Titolo: strutture dati per mappe

Dovrei rappresentare delle mappe.
Pensate per un attimo ad un gioco del golf.
Mediante le formule della fisica posso sapere le coordinate dove andra' a finire la pallina, ma come faccio a rappresentare i vari spazi del campo da golf? Per esempio se la pallina finisce in un bunker di sabbia, se finisce sul green, ecc ecc...
VOi come fareste a rappresentare in memoria una mappa del genere?


In che senso rappresentare? Disegnarle a schermo o cosa?
Usa una libreria grafica, ad esempio OpenGL.
 
Ciao Jack
-- 
Yoda of Borg am I! Assimilated shall you be! Futile resistance is, hmm?


Ti fai una matrice dove il contenuto e' un flag tipo di contenuto
Il tipo di contenuto lo fai con una enum ed una matrice con un array n 
dimensionale con n il numero di dimensioni di cui hai bisogno (dovrebbe 
essere 2 nel tuo caso)
Se qualcuno ha una idea migliore e' bene accetta
 

Immagina di avere una mappa di questo tipo (semplifico): 
 
GGGGGGGBBBGGG 
GGGGGBBBBBBGG 
GGGGGGGBBBGGG 
GBBBGGGGGBGGG 
GBBBGGGGGBGGG 
 
Dove G è erba e B rappresenta la tua area sabbiosa, puoi dividere la mappa in linee orozzontali e usare tipo*lunghezza come coordinate di ciascuna area su ogni linea. In pseudo codice: 
 
map[0]=G*7,B*3,G*3 
map[1]=G*5,B*6,G*2 
map[2]=G*7,B*3,G*3 
map[3]=G*1,B*3,G*5,B*1,G*3 
map[4]=G*1,B*3,G*5,B*1,G*3 
 
Conoscendo la coordinata (7,3) sulla mappa, sai che cade sull'erba perché in map[3] l'ascissa 7 cade nell'area G*5. 

 GBBBGGGGGBGGG
 
[...]
 
Per intenderci, qualcosa di questo tipo (bada che e` un esempio scritto 
al volo, ci possono essere errori - manca tutta la deallocazione):
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
typedef struct {
     char type;
     int length;
} mapLineSegment_t;
 
typedef struct {
     int segCount;
     mapLineSegment_t *segments;
} mapLine_t;
 
mapLine_t* translateMap(char *map[], int rows, int cols) {
     mapLine_t* mapLines = calloc(rows, sizeof(mapLine_t));
     int x, y;
     for (y = 0; y < rows; y++) {
         mapLines[y].segments = calloc(cols, sizeof(mapLineSegment_t));
         mapLines[y].segCount = 0;
         int length = 1;
         char prevc = map[y][0];
         for (x = 1; x <= cols; x++) {
             if (map[y][x] != prevc || x == cols) {
                 mapLines[y].segments[mapLines[y].segCount].type = prevc;
                 mapLines[y].segments[mapLines[y].segCount].length = length;
                 mapLines[y].segCount++;
                 length = 0;
             }
             ++length;
             prevc = map[y][x];
         }
     }
     return mapLines;
}
 
int isType(char type, int x, int y, mapLine_t* mapLines) {
     mapLine_t mapLine = mapLines[y];
     int offset = 0;
     int i;
     for (i = 0; i < mapLine.segCount; i++) {
         mapLineSegment_t segment = mapLine.segments[i];
         if (x >= offset && x < offset + segment.length && segment.type 
== type) {
             return 1;
         }
         offset += segment.length;
     }
     return 0;
}
 
int main()
{
     char *map[] = {
         "GGGGGGGBBBGGGGGGGGGGBBBGGG",
         "GGGGGBBBBBBGGGGGGGGGBBBGGG",
         "GGGGGGGBBBGGGGBBBBBBBBGGGB",
         "GBBBGGGGGBGGGGGBBBBBBBBGGG",
         "GBBBGGGGGBGGGGBBBBGGBBBGGG"
     };
 
     int rows = sizeof map / sizeof map[0];
     int cols = strlen(map[0]);
 
     mapLine_t* mapLines = translateMap(map, rows, cols);
 
     int x, y;
 
     for (y=0; y < rows; y++) {
         mapLine_t mapLine = mapLines[y];
         printf("map line #%d: ", y);
         int i;
         for (i = 0; i < mapLine.segCount; i++) {
             mapLineSegment_t mapLineSegment = mapLine.segments[i];
             if (i>0) {
                 printf(", ");
             }
             printf("%c*%d", mapLineSegment.type, mapLineSegment.length);
         }
         printf("\n");
     }
 
     for (y = 0; y < rows; y++) {
         for (x = 0; x < cols; x++) {
             printf("%c", isType('G', x, y, mapLines) ? 'G' : 'B');
         }
         printf("\n");
     }
     return 0;
}
 
 
-- 
4ndre4

      return mapLines;
 
Corretto in:
 
             if (x < cols) {
