Autor Wątek: generowanie tablicy na podstawie enum  (Przeczytany 3525 razy)

Offline k90

  • Użytkownik

# Sierpień 18, 2013, 23:45:54
Witam,

od jakiegoś czasu uczę się C# oraz xna tworzenie mapy kafelkowej nie jest dla mnie problemem ale jest to uciążliwe. Zacząłem zastanawiać się nad generowanie mapy na podstawie enum o co chodzi mi dokładnie.

enum titles{sand, dirt, grass, water}
na podstawie enum chciał bym wygenerować sobie jakąś plansze np:

tileMap = new int[,]
            {
                {2,2,2,2,2},
                {2,2,0,2,2},
                {2,0,3,0,2},
                {2,2,0,2,2},
                {2,2,2,2,2}
};

fajnie jak by dało się zdefiniować że np 3 to woda i warunek jeżeli w tablicy znajduje się 3 to na około robi piasek

z góry dzięki za odpowiedz.



Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Tinekk

  • Użytkownik

# Sierpień 19, 2013, 00:26:55
pseudokod
for(int z=0;z<10;z++)
{
for(int x=0;x<10;x++)
{
switch(tileMap[x,y])
{
case tile.sand:
{
rysuj_piasek();
break;
}
case tile.water:
{
rysuj_wode();
break;
}
default:
break;
}
}
}

Btw chyba tiles a nie titles.
« Ostatnia zmiana: Sierpień 19, 2013, 00:29:14 wysłana przez Tinekk »

Offline k90

  • Użytkownik

# Sierpień 19, 2013, 00:30:22
oczywiście że tiles.
twój pseudokod odpowiada za rysowanie poszczególnych kafli już z tablicy a mi chodzi o wygenerowanie tablicy.

Offline koirat

  • Użytkownik

# Sierpień 19, 2013, 00:34:29
No ale masz problem w tym żeby w tablicy [n][m] wymiarowej w okół pozycji [q][e] zmienić wszystkie sąsiadujące komórki na wartość którą sobie wybierzesz ?
Dobrze rozumiem ?

Offline k90

  • Użytkownik

# Sierpień 19, 2013, 00:46:33
konkretnie chodzi mi o wygenerowanie tablicy o strukturze takiej jak podałem na podstawie enum i zapisanie jej do tileMap na podstawie tej tablicy będą rysowane kafle.


np
mapWidth = 30;
mapHeight = 30;

generuje mi mapę 30x30

w konstruktor wrzucam sobie map.generate(mapWidth,mapHeight);

w Draw()

dodaje map.draw();

i rysuje mi jakąś tam mapę 30x30
« Ostatnia zmiana: Sierpień 19, 2013, 00:48:26 wysłana przez k90 »

Offline Xenox93

  • Użytkownik

# Sierpień 19, 2013, 01:16:54
A po co masz wypełniać strukturę liczbą? Skoro masz enum? Na dodatek enum nie przeczy stosowaniu liczb ;)
BTW, mógłbyś pomyśleć co nie co i sam napisać ;)

Możesz zastosować najpierw losowanie liczb i w ten sposób wypełniać strukturę, a na koniec jak zostanie cała wypełniona, to jeśli znajdzie się gdzieś woda, to kolejna część kodu wypełnia, podmienia sąsiednie kafle wokół wody, piaskiem i po sprawie, następnie taką tablicę rysujesz jak chciałeś ;)

Tak jak wcześniej pisałem, każda wartość enum posiada swoją cyfrę, tylko nie pamiętam od jakiej cyfry zaczyna się numeracja czy od 0 czy od 1 ;) Ale to już zostawiam dla Ciebie, jako praca domowa.

Offline k90

  • Użytkownik

# Sierpień 19, 2013, 01:20:04
Cytuj
By default, the first enumerator has the value 0, and the value of each successive enumerator is increased by 1. For example, in the following enumeration, Sat is 0, Sun is 1, Mon is 2, and so forth.
http://msdn.microsoft.com/pl-pl/library/sbbt4032.aspx

jak bym miał pomysł na napisanie tego to bym to zrobił, nie oczekuje od was gotowca tylko na naprowadzenie mnie.

Offline Tinekk

  • Użytkownik

  • +1
# Sierpień 19, 2013, 01:37:26
Czyli z tego co zrozumiałem chcesz wypełnić tablice danymi (enum jest tu tylko dodatkiem). Jeżeli tak to

-Wypełnij całą tablice trawą
-Wylosuj punkty gdzie jest środek wody
-Losowo w około tych punktów decyduj czy będzie tam woda czy trawa (dla każdej jedynki)
1  1  1
1  2  1
1  1  1
-Następnie sprawdz kazdy tile wody jeżeli w około jest trawa zmień ją na piasek
(w powyższym przykładzie jeżeli nie wylosowało dla żadnej z jedynek wody - zamień je na piasek)

O to chodziło?
« Ostatnia zmiana: Sierpień 19, 2013, 03:14:15 wysłana przez Tinekk »

Offline k90

  • Użytkownik

# Sierpień 19, 2013, 01:42:09
tak dokładnie o to mi chodzi kurcze nawet może być wypełnienie tablicy samą trawą już olać tą całą resztę, chcę zrozumieć jak działa to wypełnianie tablic

Offline Xenox93

  • Użytkownik

# Sierpień 19, 2013, 01:44:01
Ok, zwracam honor ;)

Czyli najlepsze jest losowe układanie mapy, a następnie tak jak już napisałem, konkretny algorytm sprawdzi czy na jakimś kafelku nie ma wody, jeśli tak, to wypełni sąsiednie kafle piaskiem i po sprawie ;)

Jeśli natomiast chodzi Ci o to, że ty sam wypełniasz mapę, kafelki to nie widzę zastosowania w tym co chcesz uzyskać, bo jeśli sam wypełnisz je to czemu nie miałbyś sam wpisać tam piasku ;)

Bo to, że wypełnisz strukturę, w taki sposób jaki podałeś sam nie ma sensu, bo wtedy idziesz na około ;) Tak więc, losuj sobie liczby, np. w ten sposób:
mapWidth = mapHeight = 30;

titles tileMap[mapWidth][mapHeight];

for( int i = 0; i < mapWidth; i++  )
{
          for( int j = 0; j < mapHeight; j++ )
          {
                      int wylosowana_liczba = odpowiednia_funkcja_w_C#_odpowiedzialna_za_losowanie( od 0 do 3 ) <- tyle ile masz rodzai kafla w enum ;p

                      switch( wylosowana_liczba )
                      {
                               case (int)(titles.sand):
                                               tileMap[i][j] = titles.sand;
                               break;

                               case (int)(titles.dirt):
                                               tileMap[i][j] = titles.dirt;
                               break;

                               case (int)(titles.grass):
                                               tileMap[i][j] = titles.grass;
                               break;

                               case (int)(titles.water):
                                               tileMap[i][j] = titles.water;
                               break;

                               default:
                               break;
                      }
          }
}

No i później stosujesz algorytm, sprawdzający gdzie znajduje się woda i zamienia sąsiednie kafle na piasek, a na koniec pseudokod podany przez @Tinekk rysujący kafle i masz wszystko zrobione ;)

@UP: kolega mnie wyprzedził :D

Offline Tinekk

  • Użytkownik

# Sierpień 19, 2013, 01:50:57
@up
Przynajmniej nie muszę tłumaczyć jak uzupełnić tablice, skoro wrzuciłeś gotowy kod :D

Offline Xenox93

  • Użytkownik

# Sierpień 19, 2013, 01:55:20
Haha, dokładnie, ale mam przynajmniej nadzieję, że nie będzie to copy-paste ;) BTW, można byłoby mój kod zoptymalizować, ale to nie jest wymagane :)

PS. Kurze, jak można nie wiedzieć jak wypełnia się tablice, hehe :D
« Ostatnia zmiana: Sierpień 19, 2013, 01:58:03 wysłana przez Xenox93 »

Offline MoHeR

  • Użytkownik

# Sierpień 19, 2013, 02:25:13
Ja bym to zrobil tak:
enum //TILES
{
    SAND = 0,
    DIRT,
    GRASS,
    WATER
};

//Wypelnij trawa
for(int x = 0; x < MAP_W; x++) {
    for(int y = 0; y < MAP_H; y++) {
        tileMap[x][y] = GRASS;
} }
//Generuj losowo "zrodla" wody, dookola obsypane piaskiem
for(int i = 0; i < 10/*Ilosc zrodel*/; i++) {
    int rx = rand()%MAP_W; //Losuj pozycje x
    int ry = rand()%MAP_H; //Losuj pozycje y
    //Generuj plaze wielkosci 3x3 kafle
    for(int x = 0; x < 3; x++) //3 kolumny kafli
        for(int y = 0; y < 3; y++) //3 wiersze kafli
            if(tileMap[rx+x][ry+y] != WATER) //ZABEZPIECZYC PRZED WYJSCIEM POZA ZAKRES tileMap[][]
                tileMap[rx+x][ry+y] = SAND; //ZABEZPIECZYC PRZED WYJSCIEM POZA ZAKRES tileMap[][]
    //Generuj zrodlo na srodku plazy
    tileMap[rx+1][ry+1] = WATER; //ZABEZPIECZYC PRZED WYJSCIEM POZA ZAKRES tileMap[][]
}
Oczywiscie Tinekk podsunal bardziej "profesjonalny" sposob, lecz biorac pod uwage to, ze pytasz, jak sie wypelnia tablice, radze najpierw zrozumiec moj kod, ktory jest prosty do potegi sizeof(long int).
« Ostatnia zmiana: Sierpień 19, 2013, 02:33:08 wysłana przez MoHeR »

Offline averatec

  • Użytkownik

# Sierpień 19, 2013, 11:23:46
ups do usuniecia
« Ostatnia zmiana: Sierpień 19, 2013, 11:37:34 wysłana przez averatec »