Jakie są idealne algorytmy generowania lochów 2D typu Rogue? [Zamknięte]


47

Jakie są dobre zasoby dotyczące generowania treści proceduralnych w kontekście generowania lochów?

Najbliższym artykułem, jaki udało mi się znaleźć, był Algorytm generowania labiryntu 2D , co nie jest dokładnie tym, czego szukam. Funkcje, takie jak pokoje i połączone korytarze, są idealne.

Dzięki!


1
Zobacz także generowanie labiryntu .
Anthony

Odpowiedzi:


27

To było mniej więcej odpowiedzią wcześniej. Twoje pierwsze miejsce zatrzymania powinno być http://pcg.wikidot.com/

Skoro zostałem oskarżony o to, że wcale nie jest pomocną odpowiedzią (naprawdę? Ktoś prosi o zasoby i zamieszczam link do wiki zajmującej się tym tematem? ), ta strona wiki dotyczy konkretnie generatorów lochów i zawiera linki do różnych artykułów na ten temat.
http://pcg.wikidot.com/pcg-alameterm:dungeon-generation

Nadal zalecam przeglądanie całej wiki, ponieważ generowanie treści proceduralnych jest po prostu bardzo kreatywnym podejściem i wszelkie pomysły są prawidłowe. To wyzwanie dla myślenia lateralnego - i zabawne.


+1 za „wszystkie pomysły są prawidłowe”, ale chciałbym to wyjaśnić: wszystkie pomysły są prawidłowe, ale niektóre będą działać lepiej niż inne. Twój <niejasny żargon komputerowy tutaj> będzie działał i prawdopodobnie będzie to, czego chcesz, ale istnieją inne sposoby na zrobienie tego, które będą bardziej wydajne, bardziej losowe, spójne, bardziej konfigurowalne lub dowolne ich kombinacje, chyba że jesteś albo naprawdę dobrze lub naprawdę szczęśliwy.
Nic Hartley,

20

Udało mi się uzyskać dość dobrze wyglądające poziomy, używając następującego algorytmu opartego na kwadratowej siatce:

Najpierw utwórz zestaw pokoi. Losowe parametry określają wielkość pokoi i ich liczbę. Algorytm adaptacyjny mógłby nawet zdefiniować niektóre strefy wykonane z dużych korytarzy, a inne bardzo małych pomieszczeń.

Następnie musisz upewnić się, że wszystkie pokoje są ze sobą połączone. W tym celu uruchom wizjer, aby wykopać korytarze (powiedzmy A *) pomiędzy każdą parą pokoi, nadając losowo wybraną wagę istniejącym przestrzeniom (pokojom lub innym korytarzom) w porównaniu z przestrzenią jeszcze nie rzeźbioną (ściany). Jeśli różnica w wadze jest niewielka, to kopanie nowych korytarzy będzie stosunkowo tanie, a algorytm wykona wiele korytarzy między pokojami, z wieloma możliwościami przejścia z jednego miejsca do drugiego. Jeśli różnica w wadze jest wysoka, algorytm będzie preferował przechodzenie przez istniejące pokoje i korytarze, co sprawi, że ścieżki będą bardziej kręte i będzie mniej możliwości dotarcia do określonego miejsca docelowego.

Pozwala to, na podstawie niewielkiej liczby parametrów, tworzyć bardzo różne poziomy wyglądu, od rzadkich, masywnych hal z małymi korytarzami łączącymi je do labiryntu przypominającego ul, labiryntu ściśle połączonych komór.

Oto przykład wygenerowanego poziomu.

wprowadź opis zdjęcia tutaj

W oparciu o ten algorytm możesz dodać dekorację ścienną zależną od strefy, zmniejszyć lub powiększyć korytarze, stworzyć specjalne pokoje i tak dalej.


10

Jeśli lubisz czytać kod i potrafisz analizować C #, czy mogę zasugerować generator lochów, którego używa mój roguelike Amaranth? To tutaj . Obsługuje połączone pokoje, rozszerzalne funkcje i inne fajne rzeczy.

Jeśli zburzysz i zbudujesz cały projekt, istnieje niezależne narzędzie, które wygeneruje i narysuje lochy, abyś mógł go ulepszyć i zobaczyć, jak to działa.


1
Natknąłem się na Amaranth, co wydaje się kilka miesięcy temu, ale zapomniałem tego imienia, zanim sam zacząłem generować lochy. Dzięki za link!
Gabriel Isenberg,

2
Twój artykuł na stronie dziennika.stuffwithstuff.com/2014/12/21/rooms-and-mazes też jest naprawdę dobry, używam jego zmodyfikowanej wersji z kilkoma dodatkowymi funkcjami, takimi jak różne silniki genów korytarzowych itp.
Tobsta,

3

Wszystko to świetne pomysły. Wziąłem trochę z RogueBasin i pcg.wikidot.com i napisałem własną implementację w języku C #.

Naprawdę podobał mi się „naturalny” wygląd poziomów przypominających jaskinie, które można wygenerować za pomocą metody automatów komórkowych. Aby zrozumieć, co mam na myśli przez metodę automatów komórkowych, wyobraź sobie grę życia Conwaya. Mój kod używa tak zwanej metody 4-5, co oznacza, że ​​płytka stanie się ścianą, jeśli jest to ściana, a 4 lub więcej z jej dziewięciu sąsiadów jest ścianami, lub jeśli nie jest to ściana, a 5 lub więcej sąsiadów jest ścianami. Zaczynam od wypełnienia mapy losowo ścianami lub spacją, następnie iteracyjnie odwiedzam każdą pozycję x / y i stosuję zasadę 4-5. Aby pomóc w rozwiązaniu problemu z tworzeniem izolowanych jaskiń, po losowym wypełnieniu mapy, pustą poziomą linię na mapie, ustawiając każdy kafelek na pole zamiast ściany, przed zastosowaniem reguły 4-5 do każdego kafelka.

Możesz wyświetlić kod mojej klasy modułu obsługi map i wszelkie ulepszenia, które wprowadzę tutaj

lub zarchiwizowana wersja tutaj .


2
To pytanie ma wiele głosów i byłoby lepiej, gdybyś mógł nieco bardziej otworzyć tę odpowiedź. Linki zazwyczaj umierają, więc spróbuj odpowiedzieć tak, aby nie trzeba było klikać linków. Jak to działa? Jaka jest główna idea? Czym różni się od innych algorytmów?
Katu

1
Link faktycznie umarł.
htmlcoderexe

2

Myślę, że najbardziej bezpośrednim miejscem do znalezienia tego jest sprawdzenie kodu źródłowego. Dwóch głównych graczy w tej dziedzinie, Angband i Nethack, są open source.


3
Chociaż open source, z tego, co pamiętam, żadne z nich nie jest niezwykle dobrze udokumentowanym źródłem lub przejrzystym źródłem lub nie zostało napisane do nauki ze źródła. Łatwo jest włamać się do poprawek, ale ogólnie trudniej jest je omijać.
Tom Hudson,

Być może oryginały nie są świetnymi referencjami, ale istnieje ogromna liczba wariantów, z których niektóre są doskonałe. Na przykład twórca UnAngband wprowadził szereg ulepszeń w generowaniu lochów i napisał serię doskonałych postów na blogu , więc możesz zdecydowanie skorzystać z pomysłów, jeśli nie kod.
congusbongus

Źródło NetHack jest niezwykle trudne do zrozumienia. Generator lochów (JEDEN z nich) jest rozłożony na nie mniej niż TRZY pliki C i około 15 funkcji
Élektra
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.