Więc zaczynam uczyć się Java i trochę OpenGL podczas korzystania z LWJGL. Na początek piszę klon Atari Pong. Mam poprawnie skonfigurowany ekran gry, wykrywanie kolizji, a cała gra działa właściwie, jeśli byłaby to gra dla dwóch graczy, zrobiłbym to teraz, ale ponieważ planuję zrobić to dla jednego gracza , Muszę wymyślić prostą sztuczną inteligencję, aby kontrolować drugiego gracza.
Wiedza, gdzie piłka uderzy, wydaje się dość trywialna, a tworzenie sztucznej inteligencji, która zawsze uderza piłkę, wydaje się łatwą rzeczą, ale chcę, aby gra mogła zostać wygrana, więc nie zawsze mogę sprawić, by IA uderzyła w piłka.
Oto moje pytanie, jak mam to kodować, aby dodać ludzkie niedoskonałości do sztucznej inteligencji. Czy powinienem losowo decydować, czy sztuczna inteligencja zawiedzie w danym momencie? A może brakuje mi mądrzejszej (a może po prostu oczywistej) rzeczy?
Dziękuję Ci bardzo.
Odpowiedzi:
Moja ulubiona niedoskonała sztuczna inteligencja ponga jest brutalnie prosta, ale pozwala mi zrobić całkiem niezłą awarię AI.
Invisible Ball AI
Konfiguracja AI : kiedy piłka odbija się od wiosła, wiesz, gdzie jest i jak szybko jedzie. Odradzaj niewidzialną piłkę w tym punkcie, ale z większą prędkością. Skończy się tam, gdzie zmierza widoczna kula. Każda klatka niech AI przesunie się w stronę niewidzialnej piłki. Zatrzymaj niewidzialną piłkę, gdy dotrze ona do boku AI, więc to tam AI powinna poruszyć wiosło.
Wyniki : AI wygląda na to, że próbuje przewidzieć ścieżkę piłki. Powiedz, że gracz odbił piłkę pod dużym kątem, tak aby odbiła się od ściany. Sztuczna inteligencja będzie śledzić piłkę na kilka sposobów, a następnie - będąc wolniejszym od piłki - nie zdoła wytropić jej wystarczająco szybko. Oszukałeś sztuczną inteligencję i wygląda to dość logicznie z ludzkiego punktu widzenia. Możesz zobaczyć, jak komputer próbuje przewidzieć, dokąd pójdzie piłka, a potem - och, spudłowała, była zbyt wolna i wygrałeś punkt.
Jest to znacznie lepsze niż wstawianie losowości, ponieważ sprawia, że AI wygląda stosunkowo inteligentnie. Godny przeciwnik. Pozwala także AI grać na tych samych zasadach, co człowiek, co wygląda lepiej dla gracza i ułatwia twoją pracę.
Ustawienia : Możesz również dostosować prędkość niewidzialnej piłki, ponieważ to określi, jak daleko AI planuje. Im szybciej niewidzialna piłka, tym więcej czasu wiosło będzie musiało przesunąć, aby zablokować, i tym lepiej gracz będzie musiał celować.
źródło
Gry w Ponga, w które grałem, wydają się zachowywać w następujący sposób: wiosło kontrolowane przez AI wie, gdzie uderzy piłka, ale ma ograniczoną szybkość, z jaką może osiągnąć tę pozycję. Czasami więc tęskni. Myślę, że to najbardziej oczywisty sposób na zrobienie tego.
źródło
Kiedy stworzyłem tak niesamowitego klona prawie Pacmana na moim TI83? kalkulator, największym problemem, na jaki natrafiłem, było to, że „duchy” były zdecydowanie zbyt szybkie. Musiałem je jakoś spowolnić. Więc włożyłem tam duży stary grzech (cos (tan (współrzędna x))). Łatwiejsze poziomy wykonałyby to obliczenie kilka razy, a trudniejsze poziomy wykonałyby tylko jedną z operacji.
Chodzi o CZAS REAKCJI. Zbadaj, jaki jest typowy czas reakcji człowieka, i dodaj do niego 10 ms. Użyj tego jako punktu wyjścia. Gdy poziomy stają się coraz trudniejsze, usuń czas z czasu reakcji ... co może być proste
Thread.sleep(time);
dla AI. Poczekaj tyle czasu, zanim AI zacznie się poruszać.Możesz także kontrolować szybkość poruszania się wiosła lub, jeśli NAPRAWDĘ chcesz się skomplikować, określić, gdzie będzie opierać się kula na podstawie różnych informacji ... powiedz tylko 2 piksele zamiast wektora. Dodaj modyfikatory kąta do ścian, aby dodać stopień losowości, zmuszając AI do ponownego obliczenia.
źródło
sin(cos(tan(x)))
?Jeśli po prostu zwolnisz wiosło, to za każdym razem, gdy uderzysz piłkę pod ostrym kątem (tj. Poruszasz się dużo w górę i w dół zamiast prosto na drugą stronę), komputer prawie zawsze będzie chybił, ponieważ piłka porusza się w górę / w dół szybciej niż wiosło może to zrekompensować.
Zamiast tego chciałbym grać z prędkością wiosła i momentem, w którym AI reaguje. Na przykład:
Kolejną rzeczą do zmiany jest jak AI reaguje. Podkreśliłeś strategię, w której wiosło zawsze przesuwa się do pozycji, w której będzie piłka. Człowiek nie zawsze może to zrobić. Bardziej prawdopodobne jest to, że podążą za piłką w górę iw dół, nie wiedząc, gdzie dokładnie będzie piłka, gdy dotrze do nich z powodu wszystkich odbić.
Zatem bardziej ludzki metodą reakcji jest zawsze poruszanie się w kierunku piłki. Na przykład, jeśli piłka porusza się w górę, wówczas wiosło porusza się w górę. Jeśli wiosło jest wystarczająco szybkie, może reagować na odbicia od góry i od dołu. Jeśli wiosło nie jest wystarczająco szybkie, to nadmiernie zrekompensuje ruch w górę, gdy piłka porusza się w górę, ale wtedy, gdy odbije się, wiosło może nie być w stanie poruszać się wystarczająco szybko w dół.
Na koniec możesz także grać z wiosłem, aby zwiększyć / zmniejszyć trudność.
źródło
Jednym z czynników, który należy wziąć pod uwagę, jest przypadkowość - gracze zawsze mają pewien stopień zróżnicowania w swojej grze, więc jeśli chcesz, aby twoja sztuczna inteligencja wyglądała jak człowiek, będziesz również chciał mieć pewne różnice w swojej grze.
Możesz skonfigurować zakresy dla:
Następnie przy każdym trafieniu przeciwnika AI może wybrać wartość z tych zakresów i na tej podstawie podejmować decyzje (i ruchy). Dla łatwiejszych przeciwników AI możesz sprawić, że wszystkie te zakresy będą raczej słabe, ale będą też miały szeroki zasięg, aby dać AI trochę szczęścia. W przypadku trudniejszych przeciwników możesz zaostrzyć te zakresy i umieścić je w „dobrym” zakresie.
źródło
Mam zamiar zaproponować bardziej ogólne rozwiązanie, które nie jest specyficzne tylko dla gry w ponga. Wierzę, że można to zastosować do każdej gry - nie tylko do gry w ponga. Chcesz ludzkie zachowanie, prawda? Aby człowiek mógł poczuć się, jakby grał w człowieka ... i dlatego, mając nadzieję, wygra. Więc co robisz?
Obserwuj człowieka! Jak gracz może przegrać w pongu? Cóż, jeśli oglądamy dwóch graczy w ponga, jest to dość oczywiste. Zwykle strata wynika z tego, że piłka jest po prostu zbyt szybka, a czas reakcji graczy był opóźniony. To dwa parametry, z których jeden można regulować. Druga to umiejętność gracza, aby wybrać właściwy kierunek. Masz więc częstotliwość błędów i częstotliwość reakcji - obie można dostosować w zależności od trudności.
Łatwa sztuczna inteligencja miałaby większe opóźnienie wejściowe i większą skłonność do popełniania przypadkowych błędów - przy czym jako trudniejsza sztuczna inteligencja byłaby dostosowywana tak, aby parametry te były trudne.
Można to zastosować do prawie każdej gry - nawet takiej jak kółko i krzyżyk lub nawet bardziej złożonych modeli. Podejście to rozkłada się w bardziej skomplikowanych scenariuszach, ale wystarcza, gdy gry, w których liczba parametrów i zakres są wąskie.
źródło
Oto lista kilku opcji, z których niektóre zostały już omówione:
źródło
Zrobiłem też mały klon Ponga (w LUA).
Moja sztuczna inteligencja jest bardzo prosta, ale nie jest taka zła, imho.
Sprawdzam tylko pozycję y piłki i jeśli niżej, przesuwam wiosło w dół, jeśli wyżej, przesuwam wiosło w górę.
Następnie, aby dostosować poziom trudności, zwiększam lub zmniejszam odległość od piłki, z której wiosło komputerowe zaczyna się poruszać.
źródło