Niedoskonały pong AI

19

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.

Setzer22
źródło
5
Ogólnie rzecz biorąc, sprawiasz, że nietoperz AI porusza się tylko z określoną prędkością, więc jeśli piłka jest dobrze ustawiona przez gracza, AI nie może jej osiągnąć.
4
Zacznę od ograniczenia prędkości, z jaką AI może poruszać wiosłem i / lub budowania w losowym (krótkim) czasie opóźnienia, zanim AI zacznie reagować na trafienie.
4
@ byte56 Nie nazwałbym tego duplikatem tego pytania. Wygląda na to, że przykład podany tutaj blog.stackoverflow.com/2011/01/... w „Jeśli chcesz zamknąć pytanie użytkownika jako duplikat, musi to być prawdziwy duplikat”. To pytanie jest dobrym zasobem (i prawdopodobnie ktoś mógłby użyć tego pytania, aby uzyskać odpowiedź na podstawie zawartej tam treści), ale tak naprawdę nie odpowiada ono na specyfikę tego pytania, nie sądzę.
Tetrad
1
@Tetrad Myślę, że odpowiedzi są bardzo podobne, ale masz rację, pytania są różne. Myślę, że to pytanie jest bardziej szczegółową wersją powiązanego pytania. Gdyby PO zobaczył ten drugi jako pierwszy, nie jestem pewien, czy to pytanie byłoby zadane. Kiedy głosowałem, byłem niezdecydowany, więc zarówno głosowałem za pytaniem i odpowiedziami, jak i głosowałem jako duplikat. To może pójść dla mnie w obie strony.
MichaelHouse

Odpowiedzi:

20

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ć.

NRD
źródło
Wszystkie udzielone odpowiedzi dostarczyły naprawdę dobrych informacji, ale ponieważ musiałem zaznaczyć jedną, aby była właściwą odpowiedzią, wybrałem tę, ponieważ bardzo podoba mi się twoje podejście. To, w połączeniu z innymi rzeczami powiedzianymi w innych odpowiedziach (np. Granie z czasem reakcji), może uzyskać sztuczną inteligencję podobną do ludzkiej i z łatwą regulacją trudności
Setzer22
Działa to idealnie dla mojego ustawienia, ponieważ mam zmienne kąty, prędkość i przyspieszenie w oparciu o niektóre specjalne ruchy, więc piłka może potencjalnie być wszędzie. AI była w posiadaniu, ale teraz jest znacznie lepiej. Rozumiem, dlaczego ta metoda nie jest najlepsza dla zablokowanej prędkości i kątów 45 stopni, ale to wcale nie moja gra.
jackrugile
1
Chociaż podoba mi się to podejście, miałem problemy z wdrażaniem. Problem polega na tym, że ponieważ piłka śledząca porusza się szybciej niż piłka, którą reprezentuje, może przeoczyć pewne kolizje, które zdarzą się z piłką, którą reprezentuje. Powodem jest oczywiście to, że znacznik przesunie się na większą odległość między ramkami.
Wolfgang Schreurs,
Jeśli chcesz uzyskać większą wierność, możesz ponownie obliczyć pozycję kulki znacznika dwa razy na klatkę i zmniejszyć prędkość o połowę dla każdego obliczenia.
DDR,
22

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
To. Nie pomaga sztucznej inteligencji wiedzieć, gdzie uderzy piłka, jeśli może się ona poruszać, powiedzmy, 3 piksele na klatkę i musi przesuwać się z góry na dół.
KeithS
14

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.

Russell Uhl
źródło
2
Czy możesz wyjaśnić, dlaczego dokładnie użyłeś sin(cos(tan(x)))?
nullpotent
5
ponieważ byłem młody, głupi i na TI83, sin (cos (tan (x))) stworzył dobrą jednostkę opóźnienia w AI. Także dlatego, że o ile mi wiadomo, kalkulator nie miał polecenia oczekiwania, które mogłoby używać milisekund. Być może pewna jasność: nie korzystałem z asemblera, mikrotryptu ani żadnego innego języka, który można skompilować, aby uruchomić na tych rzeczach. Użyłem kodu programowania wbudowanego (przycisk prgm). W dowolnym momencie miałem na ekranie MAKSYMALNIE 8 linii kodu. Nie mogłem sobie przypomnieć nic bardziej skomplikowanego dla opóźnienia.
Russell Uhl,
2
Nauczyłem się programować na kodzie wbudowanym w oprogramowanie TI83. Potem musiałem ponownie nauczyć się programowania strukturalnego w C ++. Powiedziałbym, że TI83 nauczył mnie, czym jest kod ciągu spaghetti i dlaczego jest zły. Od tamtej pory nie używam instrukcji goto. Ale dobre czasy.
ContextSwitch,
2
o dobry Boże, gotos. Od czasu do czasu odwiedzam kod ... i szybko się poddaję. Nie mam pojęcia, jak udało mi się zaprogramować tę rzecz przez kilka tygodni podczas moich lekcji matematyki.
Russell Uhl
1
Nie musisz się bronić w kwestii opóźnienia wyzwalania. Matematyka zmiennoprzecinkowa w pętli była powszechnym sposobem na przerwę w programach napisanych kilkadziesiąt lat temu, a wydajność / możliwości kalkulatorów są zgodne z komputerem z wczesnych lat 80.
Dan Neely
6

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:

  • kiedy użytkownik uderza piłkę
    • AI może natychmiast zareagować i przejść do miejsca, w którym będzie piłka. Jeśli będzie wystarczająco szybki, dotrze na czas
  • gdy piłka przecina środek boiska
    • AI musi poczekać, aż przejdzie przez środek pola, zanim zareaguje

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ść.

Trenin
źródło
2

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:

  • Czas reakcji (jak szybko AI zaczyna się poruszać)
  • Prędkość (jak szybko AI porusza wiosłem)
  • Dokładność (jak blisko AI zbliży się do miejsca, w którym faktycznie chce przesunąć wiosło, dając szansę na przekroczenie lub przekroczenie tam, gdzie chcą być)

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.

Blobinator
źródło
2

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.

Vaughan Hilts
źródło
1

Oto lista kilku opcji, z których niektóre zostały już omówione:

  • Spraw, aby mądrzejsi gracze komputerowi celowali piłką, tak aby graczowi trudniej było dotrzeć z dużą ilością odbić, a przeciwnie - dla łatwych przeciwników.
  • Sprytny gracz przesunie wiosło w kierunku środka, gdy piłka jest w drodze do przeciwnika i nie wie, dokąd wróci.
  • Przed ostatnim odbiciem trudniej jest przewidzieć, gdzie skończy się piłka. Spraw, aby sztuczna inteligencja miała podobną niedokładność.
  • Ogranicz prędkość wiosła, aby był wolniejszy niż piłka. Aby gra była idealna, musi być mniejsza niż połowa prędkości pionowej.
  • Zwiększ prędkość piłki na podstawie trudności, czasu trwania meczu itp.
  • Ludzie nie reagują natychmiast. Gracze AI również nie powinni.
  • Daj AI losową szansę na pomyłkę i brak piłki.
Adam
źródło
0

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ć.

Pitto
źródło