Jak wygenerować losowy poziom z nasion? [Zamknięte]


46

Jak mógłbym użyć losowego ziarna do wygenerowania poziomu gry? To samo ziarno powinno zawsze generować dokładnie ten sam poziom.

W tym przykładzie byłby to poziom stylu Worms . Każdy poziom miałby więc motyw (łąki, śnieg itp.), Teren podstawowy, różne obiekty, takie jak drzewa.

Więc gdzie miałbym zacząć tworzyć tego rodzaju generator poziomów? Co by było zaangażowane? Jakich pojęć używa?

Dodatkowe punkty za Obojętnie dobrych linków ( premia punkty za cokolwiek związane z, jak to miało miejsce w robaków lub podobny).

Dzięki.


Generowanie losowe jest również znane jako Generowanie treści proceduralnych (PCG). A oto wiki zajmująca się właśnie tym. pcg.wikidot.com Powinien dać ci kilka pomysłów! : o)
Kaj

1
Chris Crawford ma artykuł, który może Cię zainteresować. Został napisany na początku lat 90., ale nadal jest aktualny. Jak zbudować świat
Anthony

Jeśli użyjesz dowolnej formy lub algorytmu, który używa tego samego generatora liczb losowych (z wyjątkiem takiego, który w jakiś sposób zakrada się w niezmiennym czasie, takim jak czas systemowy), to samo ziarno wygeneruje ten sam poziom, naprawdę nie da się tego obejść.
Kaj,

1
Tak, ale myślę, że sztuczka polega na tym, aby w pierwszej kolejności wygenerować poziom. Wcześniej budowałem generatory poziomu losowego, ale nie korzystały z jednego ziarna. Często wybieram losowe punkty, a następnie dla każdego punktu wybieram losowy zasób, aby tam umieścić. Robiąc to w ten sposób, nie ma JEDNEGO prawdziwego nasienia, które zawsze generuje ten sam poziom, ponieważ istnieje wiele rzeczy generujących tam własne losowe liczby.
Adam Harte,

10
Czy na pewno wiesz, co oznacza „ziarno”? Jest to „wektor początkowy” przekazany np srand(int). Przez . Kolejne wywołania do rand()zwrócą kolejne wartości, które zawsze są obliczane w tej samej kolejności, w oparciu o to ziarno. Ustawiasz ziarno raz w swoim programie. Następnie, jeśli algorytm zależy tylko od wyników rand, za każdym razem otrzymasz ten sam wynik.
Heath Hunnicutt,

Odpowiedzi:


7

Kluczem do tego jest użycie własnego generatora liczb pseudolosowych, który inicjujesz przy użyciu znanej wartości początkowej. „Mersenne Twister” jest popularnym algorytmem, tutaj jest wpis w Wikipedii i kilka przykładowych źródeł . Ten i inne algorytmy PRNG faktycznie wytwarzają (bardzo długą) stałą serię liczb, dla których wartość początkowa służy jako punkt początkowy.

Tak długo, jak przestrzegasz dokładnie tej samej procedury generowania świata za każdym razem, każda wartość będzie reprezentować niepowtarzalny, powtarzalny świat.


4

Oto PRNG (generator liczb pseudolosowych) zaimplementowany w ActionScript (dostępny w AS2 lub AS3). Jest lekki i szybki, idealny do gier: http://lab.polygonal.de/2007/04/21/a-good-pseudo-random-number-generator-prng/

Powyższe wdrożenie oparte jest na systemie PRNG Park-Miller-Carta . Ta strona da ci więcej wglądu w matematykę stojącą za tym wszystkim.

Aby zbudować poziom podobny do robaków, prawdopodobnie użyłbym jednak funkcji Perlin-Noise . Jeśli wygenerujesz obraz szumu perlina o wysokości 1px i szerokości swojego świata gry, w zasadzie otrzymasz mapę wysokości, gotową do użycia. Funkcje szumu Perlina również zawsze generują tę samą mapę z tym samym ziarnem.

Następnie możesz użyć wspomnianego powyżej PRNG, aby ustalić, gdzie umieścić losowe obiekty na mapie lub gdzie zrobić dziurę w ziemi. W przypadku otworów można również ponownie skorzystać z hałasu perlin. Po prostu utwórz obraz szumu perlin o wielkości mapy (x, y), a następnie utwórz dziurę w mapie, w której wartość piksela jest poniżej określonego progu (np. 0,2).


Użyłbym szumu perlin, ale nieco inaczej, użyj go do stworzenia mapy wysokości 3D, umieść mapę na zboczu i usuń wszystkie piksele poniżej twojego progu. (if pixel.height - (pixel.distanceToBottom * slopeFactor) <próg) piksel = przezroczysty)
Niels

2

Teoretycznie, jeśli możesz udostępniać mapy za pomocą generatora liczb pseudolosowych (takiego jak Perlin-Noise lub Marsenne Twister)

numery zarodków, możesz także tworzyć własne mapy i redukować je do zarodków, rozwiązując problem braku możliwości tworzenia

mapy niestandardowe podczas korzystania z PRNG. Jest to jednak oparte na kilku założeniach. Mianowicie, że generatory liczb pseudolosowych są

proces odwracalny i ŻADNE dane przekazane wstecz do PRNG wytworzą prawidłowy materiał siewny, a tym bardziej ziarno!

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.