Wyobraź sobie bardzo prostą strzelankę, coś, co wszyscy wiemy:
Jesteś graczem (zielony). Twój ruch jest ograniczony do X
osi. Nasz wróg (lub wrogowie) znajduje się u góry ekranu, jego ruch jest również ograniczony do X
osi. Gracz strzela we wroga pociskami (żółtymi).
Chciałbym wdrożyć sztuczną inteligencję dla wroga, która powinna być naprawdę dobra w unikaniu pocisków graczy. Moim pierwszym pomysłem było podzielenie ekranu na odrębne sekcje i przypisanie im wag:
Istnieją dwa ciężary: „kula” (szary) jest niebezpieczeństwem nałożonym przez kulę. Im kula jest bliżej wroga, tym większa jest „waga pocisku” ( 0..1
gdzie 1 oznacza najwyższe niebezpieczeństwo). Ścieżki bez pocisku mają wagę 0. Drugi ciężar to „odległość-waga” (limonkowo-zielony). Do każdego pasa dodaję 0.2
koszt ruchu (ta wartość jest teraz trochę arbitralna i może zostać zmieniona).
Następnie po prostu dodaję obciążniki (białe) i idę na tor o najniższej wadze (czerwony). Ale to podejście ma oczywistą wadę, ponieważ może łatwo ominąć lokalne minima, ponieważ optymalnym miejscem do przejścia byłyby po prostu między dwiema nadlatującymi kulami (oznaczonymi białą strzałką).
Oto czego szukam:
- Powinien znaleźć drogę przez burzę, nawet gdy nie ma miejsca, które nie stanowiłoby zagrożenia ze strony kuli.
- Wróg może niezawodnie unikać pocisków, wybierając optymalne (lub prawie optymalne) rozwiązanie.
- Algorytm powinien uwzględniać prędkość ruchu pocisku (ponieważ mogą one poruszać się z różnymi prędkościami).
- Sposoby poprawiania algorytmu, aby można było zastosować różne poziomy trudności (głupie dla superinteligentnych wrogów).
- Algorytm powinien pozwalać na różne cele, ponieważ wróg nie tylko chce unikać pocisków, powinien także móc strzelać do gracza. Oznacza to, że pozycje, w których wróg może strzelać do gracza, powinny być preferowane podczas unikania pocisków.
Jak więc sobie z tym poradzisz? W przeciwieństwie do innych gier tego gatunku, chciałbym mieć tylko kilku, ale bardzo „wykwalifikowanych” wrogów zamiast mas głupich wrogów.
źródło
Odpowiedzi:
Myślę, że twoim podstawowym pomysłem jest dźwięk, ale nie jest on analogowy. Potrzebujesz analogicznego pola wartości, które biegnie przez ekran. Tak więc gradient dyfuzji 1D, z którego można uzyskać wartość dokładnie w punkcie na tej linii, w locie. Gradienty dyfuzji są tanie i mogą być używane przez wielu wrogów jednocześnie, ponieważ opisują one środowisko, a nie widok jednostki na to (trochę jak oświetlenie radia) - prawdopodobnie dlatego zdecydowałeś się na podejście, które masz w swoim pytaniu . Ten gradient powinien być względnie gładki, aby wywoływać organiczny ruch wroga i oczywiście aktualizuje się w miarę postępów gry. Być może średnia krocząca ?
Gradient powinien łączyć:
Aby uniknąć, musimy być w stanie dokładnie znaleźć rozwiązanie, ilekroć takie istnieje . Tak jest w każdym przypadku, gdy istnieje luka wystarczająco mała, aby wróg mógł ją uniknąć. Oznacza to, że możesz robić tylko to, co możesz, więc podejście gradientowe nie będzie działać gorzej niż jakiekolwiek inne podejście w tym sensie, powiedziałbym.
Gradient dyfuzji powinien popchnąć wroga w stronę lokalnych optymów (będących szczytami na wykresie) z mniej imperatywnym ruchem, im bliżej lokalnego minimum, stąd zmniejszający się efekt powrotu przy unikaniu. To otwiera drzwi do bardziej inteligentnego podejmowania decyzji, kiedy wróg ma dobre otwarcie do strzału.
Jeśli potrzeba strzelania jest większa niż potrzeba ruchu, zrób to; Twój kod może to również określić na podstawie ich różnic. Możesz to zaimplementować jako część podstawowego wykresu, w którym to przypadku pozycja gracza zmniejsza otaczające wartości na wykresie (zakładając, że wrogowie grawitują do najniższego punktu), co łączy wszystkie podejmowanie decyzji w jeden wykres, lub możesz zachować „ wykres „pragnienie wystrzelenia” oddzielnie od głównego wykresu „chęć uniknięcia”, który zapewni większą bezpośrednią kontrolę.
IRL, nie zawracałbym sobie głowy unikaniem pocisku, dopóki nie znajdzie się w odległości, o której wiem, że przy mojej najwyższej prędkości unikania zaczyna być trudny do uniknięcia. Doświadczenie z pierwszej ręki rzucania kamieniami jako chłopak. Kula w odległości x przemieszczającej się z prędkością y ma taką samą ocenę zagrożenia jak kula w odległości 2x, podróżującej z prędkością 2 lat. Dlatego należy to odpowiednio uwzględnić.
Sposoby dostrojenia algorytmu do trudności wroga obejmują
Ponownie możesz zaimplementować wszystkie czynniki w jednym wykresie (mniej kontroli i mniej przydatny dla wielu wrogów) lub w kilku wykresach, na które patrzysz razem, aby uzyskać wyniki (bardziej modułowy, prawdopodobnie działa lepiej dla wielu wrogów). Trudno jest być bardziej szczegółowym, ponieważ istnieje wiele kierunków, w których można zastosować to podejście.
źródło
Można to traktować jako problem z pattingiem. Zamiast myśleć, w jaki sposób baddy unika pocisków, obrazowanie pocisków jest statyczne, a baddy musi jechać przez nie do dolnej części ekranu.
E = wróg
B = kula
P = gracz
* = opcje ścieżki na dole ekranu
Po tym, jak złoczyńca nakreśli udaną ścieżkę, musi za każdym razem zrobić kolejny krok. Prawdopodobnie istnieje już kilka dobrych algorytmów do wyszukiwania ścieżek, takich jak ten. Jeśli baddy porusza się z taką samą prędkością jak pociski, może to być jeden przykładowy algorytm;
Zacznij od złego ducha i zaznacz bezpieczne pozycje w pustych miejscach po lewej stronie poniżej, bezpośrednio poniżej i poniżej prawej. Następnie rozważ każdą utworzoną przez siebie bezpieczną przestrzeń i powtórz. Jeśli w dowolnym momencie okaże się, że poniżej nie ma bezpiecznych miejsc, zaznacz to miejsce jako niebezpieczne i cofnij się.
źródło