Problem do rozwiązania: Wygeneruj losową mapę lochów 2D dla gry opartej na kafelkach, w której wszystkie pokoje są połączone.
Szukam lepszych rozwiązań niż obecnie.
Moje obecne rozwiązanie polega na tym, że uruchamiam dwa algorytmy. Pierwszy generuje loch z pokojami. Po drugie upewnij się, że wszystkie pokoje są połączone. Jestem ciekawy, jakie mogą być inne rozwiązania. Szybsze i / lub łatwiejsze itp. Prędkość nie jest tak naprawdę problemem, ale jeśli prędkość można uzyskać bez rzeczywistych kosztów, to dobrze. Ważniejsze jest to, że ja i inni, którzy czytają, mogę nauczyć się różnych sposobów podejścia i rozwiązania problemu.
Poniżej moja obecna implementacja. Pokoje obecnie nie mają wyjść ani wyjść w żadnym 2, 3 lub 4 kierunkach.
Generowanie pokoi w lochach
Ustawienia: Ustaw bieżący pokój w lewym górnym rogu.
- Zdobądź prawidłowy typ pokoju dla pokoju (gdzie prawidłowy typ pokoju to typ bez wyjść z lochu i który ma wyjścia pasujące do wyjść z pokoju powyżej i pokoju po lewej stronie. Wystarczy sprawdzić powyżej i do pozostawione z powodu kroku 2 poniżej).
- Opuść pokój i przesuń współrzędną X o krok. Jeśli współrzędna x przekracza szerokość lochu, ustaw współrzędną x na 0 i przesuń współrzędną y o jeden krok. Jeśli współrzędna y przekroczy wysokość lochu, jesteśmy skończeni.
- Powtórz od # 1.
Następnie sprawdzam, czy wszystkie pokoje są połączone. Jeśli nie wszystkie są połączone, uruchamiam drugi algorytm, który w nieseksualny, ale zdecydowanie wystarczająco dobry sposób, jeśli chodzi o układ lochów, przechodzi przez pokoje i zmienia je tak, że wszystkie kończą się być połączonym.
Sprawdzanie, czy wszystkie pokoje są połączone
Konfiguracja: Utwórz mapę 2D liczb całkowitych reprezentujących ścieżki i zainicjuj wpisy na wartość „nieprzetworzona” (jeszcze nie przetrawiona), -1. Ustaw liczbę całkowitą indeksu ścieżki początkowej, która śledzi bieżącą ścieżkę na 1. Ustaw bieżący pokój w lewym górnym rogu, dodając go do stosu pokoi do sprawdzenia.
- Jeśli stos zawiera pokoje do sprawdzenia, należy ustawić indeks ścieżki pokoju na bieżący indeks ścieżki. Jeśli stos nie zawiera żadnych pokoi, zwiększ indeks ścieżki i spróbuj uzyskać pokój, przesuwając kolumnę po kolumnie, rząd po rzędzie, aż otrzymamy pokój, który nie został jeszcze przetworzony. Jeśli nie można znaleźć miejsca, jesteśmy skończeni.
- Sprawdź, czy pokój ma wyjście po lewej stronie. Jeśli ma dodać lewy pokój do stosu, jeśli jeszcze go tam nie ma.
- Powtórz krok 2 dla kierunków w dół, w prawo iw górę (ponieważ używamy stosu, co oznacza, że pokoje przechodzą w kolejności zgodnej z ruchem wskazówek zegara, zaczynając od górnego kierunku).
- Powtórz od kroku 1.
- Jeśli liczba ścieżek jest większa niż jeden, pokoje są rozłączone.
Jeśli są rozłączone pokoje, grupuję je według indeksu ścieżki, uzyskuję indeks największej ścieżki i łączę wszystkie inne pokoje z tymi pokojami. To jest praca w toku, ale moim (obecnym, „brutalnym”) planem jest przejście przez każdy pokój w grupie pokoi (z wyjątkiem pierwszego), aby sprawdzić, czy istnieje pozioma lub pionowa ścieżka do dużej grupy pokoi, i jeśli tak, utwórz tam poziomą / pionową ścieżkę, wstrzykując / aktualizując pomieszczenia między nimi. Wypłukać i powtórzyć. Brzydkie, tak, ale jest to coś, co nie będzie zauważalne pod względem wzorca wizualnego, więc działa w tym sensie.
źródło
Odpowiedzi:
Jednym z najlepszych i najczęściej używanych algorytmów jest generowanie lochów za pomocą partycjonowania przestrzeni binarnej.
Najlepsze ogólne wyjaśnienie, które przeczytałem, znajduje się w The Chronicles of Doryen (załączonym na końcu w celu wykonania kopii zapasowej), ponieważ wyjaśnia procedurę bez wchodzenia w kod, pozostawiając implementację czytelnikowi.
Dwa inne samouczki na ten sam temat z kodem można znaleźć na stronie
źródło
Metoda BSP jest najwyraźniej najpopularniejszą metodą generowania lochów, ale nie tylko.
Dla kompletności wyjaśnię generator, który działał dla mnie . Muszę przyznać, że nie pamiętam gdzie czytałem na ten temat, więc powiem tylko, że to nie jest mój wynalazek (an old artykuł przez Jamis Buck brzmi bardzo znajomo).
Labirynt z pokojami
Podstawową ideą jest to, że loch to labirynt z pokojami. Pierwszym krokiem dla tego algorytmu jest wygenerowanie labiryntu :
Następnym krokiem jest uczynienie go rzadkim (usuwanie ślepych zaułków):
Krok numer 3 polega na dodaniu kilku pętli ( spraw, by nie był idealny ), ale pominę obraz, ponieważ jest ledwo zauważalny (nie potrzebowałem idealnego labiryntu, więc skorzystałem z kilku skrótów algorytmu generowania labiryntu, więc już miał pętle do tego momentu).
Następnie w kroku 4 musimy usunąć izolowane komórki:
W tym momencie skończyliśmy z korytarzami i jesteśmy gotowi do dodania pokoi. W tym celu wykonujemy następujące czynności:
Do tej pory nasz loch wyglądałby tak:
Ostatnim krokiem jest dodanie dekoracji.
Kilka ostatnich myśli
źródło