Tworzę grę z generowanym proceduralnie światem utworzonym na początku gry, składającym się z kilku obszarów reprezentowanych przez siatki (powiedzmy 8x8, 9x6, rozmiary byłyby idealnie dowolne). Te obszary powinny być ze sobą połączone za pomocą listy zależności.
Połączenie istnieje, gdy co najmniej 3 przestrzenie tej siatki są odsłonięte między tymi dwoma obszarami. W środkowej komórce tego 3 obszaru połączenia kosmicznego jest przejście między obszarami:
Próbowałem znaleźć sposób ich połączenia, ale staje się to coraz bardziej złożone, im więcej obszarów musisz wziąć pod uwagę w tym samym czasie.
Próbowałem prototypowania papieru i chociaż jest to bardzo prosty proces, gdy robię to wizualnie, nie znalazłem dobrego zestawu wyrażeń matematycznych, które pozwalają mi umieszczać pokoje o tej samej wydajności według kodu.
Oto „prosty” przykład, z którym obecnie mam problem:
- Obszar „a” należy połączyć z „b” i „c”
- Obszar „b” należy połączyć z „a” i „d”
- Obszar „c” musi być połączony z „a” i „d”
- Obszar „d” należy połączyć z „b” i „c”
Rozważmy, dla uproszczenia, umieszczamy pokoje według kolejności pojawiania się na liście (próbowałem już innych). Podchodzę więc do tego jako do standardowego algorytmu proceduralnego generowania lochów.
Umieszczamy „a” w dowolnym miejscu na planszy, ponieważ jest to pierwszy obszar. Następnie losowo wybieramy ścianę, a ponieważ nic nie jest z nią połączone, możemy umieścić tam „b”:
Teraz musimy umieścić „c”, ale „a” jest już na planszy i ma zajmowaną ścianę, więc postanawiamy umieścić ją na innej ścianie. Ale nie każde miejsce docelowe wystarczy, ponieważ pojawi się litera „d” i należy ją również połączyć z literą „b” i „c”:
Wypróbowałem możliwe ograniczenie, że 2 pokoje z tym samym zestawem zależności nie mogą znajdować się na przeciwległych ścianach, ale nawet to nie gwarantuje sukcesu:
A w innych przypadkach, gdy obszary mają różne rozmiary, znajdowanie się na przeciwległych ścianach może działać:
Nieuwzględnienie użytej ściany jest błędnym założeniem, ponieważ wyklucza prawidłowe rozwiązania:
Próbowałem szukać badań nad innymi algorytmami generowania procedur lub podobnymi, takimi jak optymalne pakowanie prostokątów i algorytmy układu wykresów, ale zwykle algorytmy te nie uwzględniają wszystkich ograniczeń tego problemu i trudno je ze sobą łączyć.
Myślałem o wielu podejściach, w tym o umieszczeniu obszaru i cofnięciu się do znalezienia odpowiedniego miejsca docelowego, ale wydają się one bardzo zależne od prób i błędów i są kosztowne pod względem obliczeniowym. Ale biorąc pod uwagę szeroko zakrojone badania dwóch ostatnich problemów, o których wspomniałem, może to być jedyne / najlepsze rozwiązanie?
Chciałem tylko sprawdzić, czy ktoś miał podobne problemy w przeszłości lub jest gotów pomóc mi to rozgryźć i podać kilka wskazówek, od czego powinienem zacząć od algorytmu. W przeciwnym razie będę musiał rozluźnić ograniczenia, które nałożyłem.