Discussione:
strutture dati per mappe
(troppo vecchio per rispondere)
a***@gmail.com
2016-09-19 06:45:59 UTC
Permalink
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?
Jack
2016-09-20 05:06:21 UTC
Permalink
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?
enoquick
2016-09-20 23:10:22 UTC
Permalink
Questo messaggio potrebbe essere inappropriato. Clicca per visualizzarlo
4ndre4
2016-09-21 07:33:14 UTC
Permalink
Immagina di avere una mappa di questo tipo (senplifico):

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.
4ndre4
2016-09-21 07:37:10 UTC
Permalink
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.
4ndre4
2016-09-21 21:34:08 UTC
Permalink
Post by 4ndre4
GGGGGGGBBBGGG
GGGGGBBBBBBGG
GGGGGGGBBBGGG
GBBBGGGGGBGGG
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
4ndre4
2016-09-22 08:46:20 UTC
Permalink
On Wednesday, 21 September 2016 22:34:18 UTC+1, 4ndre4 wrote:

[...]
Post by 4ndre4
prevc = map[y][x];
}
}
return mapLines;
Corretto in:

if (x < cols) {
prevc = map[y][x];
}

Loading...