Zrozumienie wymagań
- Wszyscy gracze mają ograniczoną liczbę sąsiadujących wrogów.
Po pierwsze, mówimy o punktach odradzania się graczy, a nie o bieżącej pozycji graczy w danym punkcie gry. Po prostu usuwam to z drogi.
Przylegający jest dobrze zdefiniowany, gdy mówimy o wykresie. Możemy wymyślić mapę, która reprezentuje nawigację na mapie - odtąd „wykres”.
Jeśli węzeł może mieć co najwyżej jeden punkt odradzania, wówczas mówienie o tym, że są „sąsiadujące” ma sens. Uwaga: nie będę ograniczać węzłów do posiadania jednego pojedynczego punktu odradzania, z powodów, które pojawią się później.
Aby zbudować wykres, musimy wziąć pod uwagę takie rzeczy, jak ściany, mosty, drabiny, punkty teleportacji, a nawet wziąć pod uwagę przestrzeń lotu, jeśli może istnieć gracz, który potrafi latać. Każdy węzeł reprezentuje ruchome położenie; każde połączenie reprezentuje możliwy ruch.
Uwaga: poznaj rozmiar i kształt węzłów i pracuj z faktycznie sąsiadującymi węzłami. Nie uważaj węzłów za punkt. Nie traktuj połączeń jako posiadających długość. Użyj również wypukłych węzłów.
Wykres mógł zostać wstępnie skompilowany (mapa została stworzona przez projektanta); w przeciwnym razie można go utworzyć w locie, jeśli mapa jest generowana losowo.
- Wszyscy gracze mają równe szanse na spotkanie z sąsiadującymi wrogami.
Zakładam, że wrogami są inni gracze. Ponownie, po prostu usuwam to z drogi.
Zakładając, że każdy gracz wykona losowy spacer, prawdopodobieństwo znalezienia gracza w danym punkcie - na płaskiej przestrzeni, wolnej od przeszkód - zostanie określone przez (Gaussowską) funkcję odległości do punktu odrodzenia - od teraz „ funkcjonować".
Ponieważ pracujemy na wykresie, zamiast tego adnotujemy wartości na wykresie.
- Rozmiar mapy nie musi zwiększać się proporcjonalnie do liczby graczy.
Gdybyśmy mieli ograniczenie posiadania jednego punktu odradzania na węzeł, to aby dodać więcej graczy, potrzebowalibyśmy mniejszych węzłów. Jeśli zdecydujemy się na wykresie, zanim będziemy wiedzieć, ilu graczy będziemy mieli, być może będziemy musieli podzielić węzły dla konkretnej gry.
- Ograniczenia te nie są egzekwowane w przypadku dowolnych nieprzekraczalnych przestrzeni.
Nie zamierzam dodawać przeszkód, aby rozwiązać problem. Au contraire , muszę pracować wokół przeszkód. Gdyby ich nie było, wdrożenie byłoby prostsze.
Rozwiązanie
Próbujemy umieścić N punktów odradzania w taki sposób, aby szanse na spotkanie z innym graczem we wszystkich punktach odradzania były równe.
Możemy otrzymać miarę błędu jako sumę różnic szans do średniej szans. Staramy się to zminimalizować (w rzeczywistości chcemy, aby było to 0).
Aby to zrobić, musimy znać szansę napotkania gracza na każdym węźle wykresu.
Aby obliczyć tę szansę, zacznij od zera. Ponieważ szansa na znalezienie gracza w dowolnym węźle, gdy nie ma graczy, wynosi zero. Następnie dla każdego punktu odradzania przejdź wykres, dodając do opisanej szansy wartość funkcji dla bieżącego punktu odradzania.
Uwaga 1: Dodanie lub przesunięcie punktu odradzania wpłynie na szansę spotkania gracza na całej mapie.
Uwaga 2: Śledzenie, jak bardzo każdy punkt odradzania wpływa na szansę, ułatwi sprawy.
Uwaga 3: Ponieważ węzły mają rozmiar, to, jak blisko można dostać się do błędu = zero, zależy od wielkości węzłów. Możesz być bardziej precyzyjny, pracując z zakresami wartości (szansa minimalna i maksymalna, zależnie od konkretnej pozycji punktów odradzania w węźle).
Umieść losowo punkty odradzania, a następnie zacznij je przesuwać w taki sposób, aby błąd się zmniejszył (rozważ możliwy ruch, a jeśli spowoduje zmniejszenie błędu, zatrzymaj go, w przeciwnym razie cofnij). I rób to dalej, dopóki nie będziemy mogli dalej poprawiać (zbyt wiele iteracji bez poprawy lub błąd wynosi zero).
Uwaga 4: Podczas przenoszenia punktu odrodzenia możesz wykorzystać szansę na spotkanie z graczem (z wyłączeniem punktu odrodzenia, który przeniesiesz), aby losowo wybrać nową pozycję dla punktu odrodzenia, taką pozycję, która ma szansę spotkać gracza bliżej średnie są bardziej prawdopodobne. Przypominam, że przesunięcie punktu odradzania wpłynie na średnią.
Oczekiwanym zachowaniem jest to, że punkty odradzania, które są zbyt blisko siebie, oddalają się od siebie, a punkty odradzania, które są zbyt daleko od siebie, zbliżają się. Dopóki nie osiągną równowagi.
Jeśli w dowolnej iteracji masz wiele punktów odradzania w węźle (co jest mało prawdopodobne, ponieważ powinny mieć tendencję do rozsuwania się, ale możliwe, jeśli masz wystarczająco duże węzły), podziel węzeł i kontynuuj rozwiązywanie. Każdy podział węzła jest poprawny.
Powyższe rozwiązanie zbliży się do błędu = zero, ale nie ma gwarancji, że osiągnie zero. Możesz go uruchomić, dopóki nie osiągnie lokalnego minimum ... Teoretycznie możesz następnie podzielić węzły, aby było dokładnie zero ... To jednak jest równoważne z poprawieniem współrzędnych punktu odradzania!
Spróbuj symulować wyżarzanie, aby przenieść punkt odradzania w węźle. Chociaż, szczerze mówiąc, prawdopodobnie nie warto zawracać sobie głowy takim poziomem szczegółowości.
Chcę wyjaśnić, że wynikiem płaskiej mapy wolnej od przeszkód nie będą równomiernie rozmieszczone punkty. Zamiast tego, jeśli mapa ma krawędzie (to znaczy, jeśli się nie zawija), wówczas więcej punktów odradzania będzie bliżej krawędzi, ponieważ punkty w centrum można dotrzeć z większej liczby kierunków, co zwiększa szansę na spotkanie inni gracze tam. W ten sposób punkty są dalej od siebie w pobliżu środka, aby to zrekompensować.