Zwiększenie prawdopodobieństwa wygenerowania podobnych płytek obok siebie


9

Pracuję nad systemem map kafelkowych, który do tej pory wygląda tak (zieleń to trawa, powietrze jest białe, kamień jest szary, a niebieski to woda):

Płytki

Używa prostego generatora liczb losowych, dzięki czemu istnieje 45% szansa, że ​​płytka jest trawą, 30% szansa, że ​​jest to woda, a 25% szansa, że ​​to kamień.

Czy w każdym razie mogę zwiększyć tendencję do zlepiania się bloków trawy / kamienia, tworząc masy lądowe, i tworzenia bloków wodnych z oceanów (coś w rodzaju tego, co można zobaczyć w grze takiej jak Minecraft)?

Odpowiedzi:


17

Możesz użyć algorytmu, który sprawdza bloki i zmienia prawdopodobieństwo w zależności od tego, co tam jest - ale myślę, że jest to w dużej mierze niewłaściwe podejście.

To, na co chcesz patrzeć, to fraktalne typy hałasu - w tym przypadku hałas perlinowy lub simpleksowy. Jeśli generujesz hałas, otrzymasz wartości od -1 do 1.

http://en.wikipedia.org/wiki/Perlin_noise

Następnie możesz wyregulować poziom wody, ustawiając próg progowy wytwarzanej wody. W przypadku innych bloków możesz uruchomić drugi zestaw hałasu, aby przełączyć się między skałą a trawą. (w ten sposób możesz mieć duże plamy wody, ale mniejsze grudki kamienia).

getTerrain(x,y) {
if(perlin_noise(x,y) > 0) {
    if(perlin_noise(x * scale,y * scale) > 0) {
        return rock
    } else {
        return dirt
    }
} else {
    return water
}

Ponieważ uważam, że metoda skanowania i podrzucania jest zbyt skomplikowana i niezbyt skalowalna, zasugeruję inną metodę, która mi się podobała:

Ułóż siatkę na mapie, dzieląc mapę na duże kwadraty.

Wygeneruj losową liczbę na każdym skrzyżowaniu (od 0 do 1 będzie działać dla twoich wartości procentowych)

Podziel, dzieląc każdy kwadrat na 4 równe kwadraty - podążaj za starymi liniami, a tam, gdzie znajdziesz linie podziału, wygeneruj losową liczbę między 2 sąsiadującymi punktami, podobnie dla środka krzyża, wygeneruj punkt, który leży pomiędzy najwyższymi i najniższe wartości.

Wypłukać i powtórzyć. Otrzymasz początkową losowość z pierwszego przejścia, ale te ostatnie podniosą jednolitość Przepraszamy za losowe liczby psuedo:

0-------5  0---3---5 0-1-3-4-5 011233455
|       |  |   |   | | | | | | 012344555
|       |  |   |   | 0-2-4-6-5 002445665
|       |  |   |   | | | | | | 123445666
|       |  2---5---7 2-4-5-7-7 234455777
|       |  |   |   | | | | | | 233455688
|       |  |   |   | 2-3-5-5-9 223455589
|       |  |   |   | | | | | | 233455589
2-------9  2---4---9 2-4-4-5-9 234445579

Działa to jeszcze lepiej w przypadku trójkątów, ponieważ nie masz zgubionej poprzeczki podczas podziału.

Oczywiście, absolutnie najlepszy wynik przyniesie połączenie tych metod - warstwa po warstwie, niektóre techniki dadzą ci wielkie masy lądowe, inne dadzą Ci niesamowite jaskinie, inne pracują na wzgórzach, a inne na systemach wodnych.


+1 Ponieważ myślę, że skok w hałas jest generalnie tam, gdzie to doprowadzi. Zastanawiam się, czy to może nie byłby zbyt duży skok, więc wstępne głosowanie i zmiana procentowa pozwoliły mi głosować :)
James

3

Hałas to jedno dobre rozwiązanie, jak już wspomniano. Inną opcją jest wykonanie drugiego przejścia do danych, aby przesunąć je w stronę odpowiedniego układu. Rozmycie gaussowskie jest jednym z wielu sposobów na osiągnięcie tego. Wykonanie podania z tym powinno dać ci ładne „okrągłe” plamy każdego typu.

Niezależnie od wybranej metody, jedną ważną rzeczą, o której należy pamiętać, jest przechowywanie wyników procesu w nowej lokalizacji. Jeśli zmodyfikujesz mapę w miejscu, części, które już przetworzyłeś, zaczną wpływać na algorytm i skończysz z dziwnymi wzorami.


2

Stosunkowo prostym sposobem na zrobienie tego byłoby utworzenie wielu jąder w losowych pozycjach. Narysuj diagram Voronoi tych punktów. Przypisz element do każdego regionu wyniku.

Powoduje to coś raczej brzydkiego i wyglądającego mechanicznie. Trochę zabłocisz granice, a będziesz w dobrej formie.

Jeśli generujesz dużą mapę, możesz to zrobić na dwóch poziomach. Utwórz swój początkowy diagram Voronoi, używając, powiedzmy, 20 jąder i nazwij każdy wynikowy region narodem. Utwórz kolejny diagram za pomocą 400 jąder i nazwij każdy powstały region plebanią.

Wszystkie plebania całkowicie zawarte w narodzie będą miały element narodu. Wikary, które są częściowo zawarte w dwóch lub więcej narodach, będą losowo wybierać jeden z elementów otaczających ich narodów.

Ten post zasługuje na zdjęcie, ale jestem zbyt leniwy, aby je podać.


2

Generator map wielokątnych byłby dobrym narzędziem do tworzenia map z różnymi „strefami”, które dawałyby również lepiej ukształtowane mapy. Opiera się na diagramach voronoi, ale myślę, że byłby to dobry początek.


0

możesz to zrobić za pomocą tej metody:

  • umieść wszystkie płytki na nieokreślonej liście
  • podczas gdy na nieokreślonej liście znajduje się kafelek
  • zaczynać
  • wybierz jeden kafelek z tej listy
  • sprawdź sąsiadów tego kafelka i wybierz typ w zależności od jego sąsiadów
  • usuń ten kafelek z nieokreślonej listy
  • koniec
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.