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.