Ja i zespół pracujemy nad grą budowniczą fabryk, która daje graczowi losową fabrykę na początku gry. Aby upewnić się, że istnieje poczucie „uczciwości”, idealnie losowo wygenerowana fabryka miałaby obszar w obrębie kilku jednostek (wartość zastępcza) 30.
Stosunkowo prosty jest napisanie prostego generatora losowych prostokątów, aby spełnić te specyfikacje, ale naszym celem jest, aby fabryka była bardziej złożona, być może złożona z 2, 3 lub nawet 4 przecinających się prostokątów, tworząc bardziej złożone kształty (pomyśl o L, Budynki w kształcie litery U i O).
Próbowałem wygenerować losowy prostokąt, a następnie użyć podstawowej algebry do wypełnienia drugiego prostokąta, ale jak dotąd nie miałem szczęścia wdrożyć więcej niż 2 prostokąty, a nawet wtedy nie jestem zadowolony z wyników dla projektu tylko 2 prostokątów .
Kilka bardziej istotnych informacji: 2D z góry na dół Niektóre mechaniki są w stylu factorio, więc pokoje powinny mieć rozsądną długość i szerokość, aby umożliwić miejsce na maszyny Obecnie w Javie i Lua (w razie potrzeby można użyć wbudowanych bibliotek)
Z góry dziękuję!
EDYCJA: Kiedy mówię „dobre” lub „złe” wyjścia, złym wyjściem byłoby każde wyjście, na którym odtwarzacz nie ma miejsca. Fabryczne granice kształtu, w których gracz może umieszczać maszyny fabryczne, takie jak przenośniki taśmowe. Idealnie, fabryka nie powinna mieć obszarów o szerokości tylko 1-2 bloków, kształt nie powinien być jednym lub dwoma dużymi prostokątami z linią 1-2 bloków „zwisającymi” na bok. Dobrym wyjściem byłoby, gdy cała powierzchnia podłogi jest „wykonalna”, więc wszystkie obszary mają szerokość co najmniej 3-4 bloków. Dobry wynik nie zawsze musi być złożony (1 lub 2 prostokąty są w porządku), ale powinien mieć spore szanse, jeśli składa się z więcej niż 1-2 prostokątów.
Biorąc pod uwagę ograniczenie „wszystkie obszary mają co najmniej 3-4 bloki szerokości”, pierwszy pomysł, który przychodzi mi do głowy, wygląda następująco:
Podstawową ideą jest to, że biorąc pod uwagę, że chcesz, aby wszystkie obszary miały co najmniej dany rozmiar, działają tylko w obszarach o tym rozmiarze. Mówiąc bardziej ogólnie, jeśli chcesz, aby coś było prawdą dla wszystkich generowanych wyników, sprawdź, czy można to zrobić dla wszystkich częściowo wygenerowanych wyników.
źródło
Rozważ użycie booleanów NOT i UNION i wybieranie między nimi losowo.
Następnie obliczyłem obszar i przeskalowałem go w górę lub w dół, aby dokładniej dopasować przybliżony rozmiar, którego szukasz, a następnie przetestować, czy nie ma wymiarów mniejszych niż wymagana minimalna ilość.
źródło