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.
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.
źródło
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ć.
źródło
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.
źródło
możesz to zrobić za pomocą tej metody:
źródło