Tworzę prostą grę opartą na siatce heksadecymalnej i chcę, aby mapa była równo podzielona między graczy. Mapa jest tworzona losowo i chcę, aby gracze mieli mniej więcej taką samą liczbę komórek i stosunkowo małe obszary. Na przykład, jeśli na mapie jest czterech graczy i 80 komórek, każdy z graczy miałby około 20 komórek (nie musi być precyzyjny). Ponadto każdy gracz powinien mieć nie więcej niż cztery sąsiednie komórki. Oznacza to, że podczas generowania mapy największe „fragmenty” nie mogą być większe niż cztery komórki.
Wiem, że nie zawsze jest to możliwe dla dwóch lub trzech graczy (ponieważ przypomina to problem „kolorowania mapy”) i nie mam nic przeciwko robieniu innych rozwiązań (takich jak tworzenie map rozwiązujących problem). Ale jak dla czterech do ośmiu graczy, jak podejść do tego problemu?
źródło
Odpowiedzi:
Oto co bym zrobił:
źródło
Zakładając, że masz w sumie mapę heksadecynalną
n
komórek ip
graczy,p <= n
najlepszym sposobem na rozwiązanie tego problemu jest dystrybucja typu round-robin za pomocą automatów komórkowych (CA).Inicjalizacja
Losowo (i / lub przy użyciu niektórych lub innych metod heurystycznych, takich jak odległość od centrum mapy) wybierz komórkę początkową dla każdego gracza. Ponieważ
p <= n
nie powinno to stanowić problemu.Automaty komórkowe
Potrzebujesz pełnej łączności między komórkami heksadecymalnymi. Sugerowałbym tablicę 6 sąsiadów na komórkę:
Zastosowanie tablic o stałym rozmiarze pozwala istnieć pojęcie kierunków topograficznych między komórkami, czego nie byłoby w przypadku listy lub wektora. Polecam to, ponieważ może to ułatwić pewne operacje nawigacyjne.
Możesz także przechowywać mapę heksadecymalną w układzie 2D z przesunięciami na wiersz. Może to być jednak nieco mniej intuicyjne niż przechowywanie sąsiedniej tablicy na komórkę, tylko ze względu na geometryczne przesunięcie w każdym innym rzędzie.
Upewnij się, że każda komórka jest podłączona do wszystkiego, co jest sąsiadem. Możesz zrobić ten wiersz po rzędzie, komórka po komórce podczas generowania pełnej mapy heksadecymalnej. PS Jeśli ostatecznie chcesz uzyskać mapę heksadecymalną, która nie jest prostokątna, możesz po prostu usunąć pojedyncze komórki i odniesienia do tych komórek, aby utworzyć ujemne przestrzenie, umożliwiając utworzenie konturu mapy organicznej.
Round-robin Distribution
Pseudo kod:
Algorytm ten da każdemu graczowi szansę na powiększenie swojego terytorium o jeden, w sposób okrągły, pod warunkiem, że na terytorium gracza nadal znajduje się ważna przestrzeń do uprawy. Jeśli pewne gracze są zablokowane rośnie dalej, algorytm będzie mimo to nadal rosnąć terytoria graczy, którzy nie mają jeszcze ważne miejsca rośnie. Możesz z łatwością ograniczyć każdego gracza do tej samej liczby komórek, jak tylko jedna z nich osiągnie limit, ale powinno to być na tyle łatwe, abyś mógł się zorientować, jeśli chcesz.
Zapewni to maksymalne rozmiary „terytoriów macierzystych” dla każdego gracza. Jeśli chcesz mieć dodatkowo terytoria wyspiarskie, w celu wypełnienia limitu liczby komórek dla tego gracza, gdy graczowi zabraknie miejsca na rozwój, możesz wybrać nową komórkę początkową z neutralnej listy komórek i stamtąd kontynuuj ten sam proces „wzrostu”. W ten sposób uzyskasz spójne zestawy wysp dla każdego gracza, a nie losowy hałas.
źródło
n
, a następnie zaprzeczasz sobie, mówiąc, że „nie widzisz sposobu”, a ja „wspominam [jak zdobyć wyspy] w późniejszym tekście”. Czy mam lub nie odpowiedziałem na pytanie? Ten uogólniony algorytm można wykorzystać do rozproszenia komórek (ograniczenien
do 1) lub do stworzenia wysp (ustawienie n> 1). Tak więc masz w jednym algorytmie nie tylko umiejętność rozpraszania, ale także grupowania. Jak to nie odpowiada na pytanie PO? Jak warto głosować negatywnie?Innym podejściem byłoby zacząć od dystrybucji, która jest „sprawiedliwa”, ale regularna, a następnie użyć metody podobnej do Symulowanego wyżarzania, aby rozbić regularność bez utraty uczciwości:
Kluczem tutaj jest to, że zamiana dwóch punktów oznacza, że nigdy nie wyważasz kolorów, a także test, który wykonujesz przed sfinalizowaniem zamiany, gwarantuje, że nigdy nie utworzysz zbyt dużych regionów. Jeśli masz jakieś sposoby wyświetlania siatki, możesz nawet zwizualizować ten proces, aby zobaczyć, jak „buduje” swoje regiony poprzez powtarzające się zamiany.
Nawiasem mówiąc, jeśli nie możesz zacząć od równomiernego regularnego kolorowania, powinieneś być w stanie zrobić coś podobnego do równomiernego rozbarwienia: podczas gdy twoje zabarwienie nie jest równomierne, wybierz element losowo; następnie, jeśli jest to jeden z nadmiernie reprezentowanych kolorów, tymczasowo ustaw jego kolor na jeden z niedostatecznie reprezentowanych kolorów, a następnie sprawdź, czy nie tworzy on zbyt dużego obszaru nowego koloru.
źródło