Kusursuz pong AI


19

Bu yüzden LWJGL kullanırken Java ve bazı OpenGL öğrenmeye başladım. Kolay başlamak için Atari Pong'un bir klonunu yazıyorum. Oyun ekranını, çarpışma tespitini doğru bir şekilde kurdum ve tüm oyun çoğunlukla çalışıyor, aslında, eğer 2 oyunculu bir oyun olsaydı, şimdi yapardım, ama bunu tek oyunculu bir oyun yapmayı planlıyorum , İkinci oyuncuyu kontrol etmek için basit bir yapay zeka bulmam gerekiyor.

Topun nereye vuracağını bilmek oldukça önemsiz görünüyor ve her zaman topa vuran bir AI oluşturmak kolay bir şey gibi görünüyor, ancak oyunun kazanılmasını istiyorum, bu yüzden IA'nın her zaman top.

İşte sorum, yapay zekaya insan benzeri kusurlar eklemek için bunu nasıl kodlamalıyım? AI'nın belirli bir noktada başarısız olup olmayacağına rastgele karar vermeli miyim? Ya da burada özlediğim daha akıllı (ya da belki de açık) bir şey mi var?

Çok teşekkür ederim.


5
Genellikle AI yarasa sadece belirli bir hızda hareket ettirirsiniz, bu yüzden top oyuncu tarafından iyi yerleştirilirse AI ona ulaşamaz ..

4
AI'nın raketi hareket ettirme hızını sınırlandırarak ve / veya AI bir isabete cevap vermeye başlamadan önce rastgele (kısa) bir gecikme süresi içinde inşa ederek başladım.


4
@ byte56 Bu soruya gerçekte bir dupe demezdim. "Bir kullanıcının sorusunu kopya olarak kapatacaksanız, bunun gerçek bir kopya olması gerekir" altında blog.stackoverflow.com/2011/01/… altında verilen örnek gibi geliyor . Bu soru iyi bir kaynaktır (ve birisi muhtemelen bu soruyu içeriği orada verilen bir cevap türetmek için kullanabilir), ama gerçekten bu sorunun özelliklerini cevaplamıyor, sanmıyorum.
Tetrad

1
@Tetrad Bence cevaplar çok benzer, ama haklısın, sorular farklı. Bence bu soru bağlantılı sorunun daha spesifik bir versiyonudur. OP diğerini önce görmüş olsaydı, bu sorunun sorulup sorulmayacağından emin değilim. Oy verdiğimde kararsız kaldım, bu yüzden hem soruyu hem de cevapları iptal ettim ve kopya olarak oy verdim. Benim için her iki şekilde de gidebilir.
MichaelHouse

Yanıtlar:


20

En sevdiğim kusurlu pong AI'm acımasızca basit, ancak birisinin oldukça güzel bir AI hatası yapmasına izin veriyor.

Görünmez Top AI

AI Kurulumu : Top raketinizden yansıdığında, nerede olduğunu ve ne kadar hızlı gittiğini bilirsiniz. Bu noktada görünmez bir top ortaya çıkar, ancak daha yüksek bir hızda. Görünür topun nereye gittiğini sarar. Her çerçeve, AI'nın görünmez topun konumuna doğru hareket etmesini sağlayın. Görünmez topu AI'nın yanına ulaştığında durdurun, bu yüzden AI küreklerini hareket ettirmelidir.

Sonuçlar : AI topun yolunu tahmin etmeye çalışıyor gibi görünüyor. Oyuncunun topu dik bir açıda yansıttığını ve böylece duvardan sıçrayacağını varsayalım. AI topu biraz yoldan takip edecek ve daha sonra - toptan daha yavaş olmak - yeterince hızlı bir şekilde takip edemeyecektir. Yapay zekayı kandırdın ve insani bakış açısından oldukça mantıklı görünüyor. Bilgisayarın topun nereye gideceğini tahmin etmeye çalıştığını görebilirsiniz ve sonra - oh, kaçırdı, çok yavaştı ve bir puan kazandınız.

Bu, yapay zekayı göreceli olarak akıllı hale getirdiğinden rastgele yerleştirmekten önemli ölçüde daha iyidir. Değerli bir rakip. Ayrıca AI'nın oyuncu ile daha iyi görünen ve işinizi kolaylaştıran insanla aynı kurallarla oynamasına izin verir.

Ayarlar : Görünmez topun hızını da değiştirebilirsiniz, çünkü bu AI'nın ne kadar ileride planlayacağını belirleyecektir. Görünmez top ne kadar hızlı olursa, raketin bloke etmek için o kadar fazla zamana ihtiyacı olacaktır ve oyuncu daha iyi nişan almak zorunda kalacaktır.


Verilen tüm cevaplar gerçekten iyi bilgi verdi, ancak doğru cevap olarak birini işaretlemem gerektiğinden, bunu sizin yaklaşımınızı gerçekten sevdiğim için seçtim. Bu, diğer cevaplarda (reaksiyon süresi ile oynamak gibi) söylenen diğer bazı şeylerle birlikte gerçekten insan benzeri bir yapay zeka ve kolay ayarlanabilir bir zorluk
yaşayabilir

Bu, kurulumum için mükemmel çalıştı, çünkü belirli özel hareketlere dayanan değişken açılara, hıza ve ivmeye sahibim, böylece top potansiyel olarak her yerde olabilir. AI sahipleniyordu, ama şimdi çok daha iyi. Bu yöntemin neden kilitli hız ve 45 derece açılar için en iyi olmadığını anlayabiliyorum, ama bu benim oyunum değil.
jackrugile

1
Bu yaklaşımı beğenmeme rağmen uygulamamla ilgili sorunlar yaşadım. Sorun şu ki, izleyici top temsil ettiği topdan daha hızlı hareket ettiğinden, temsil ettiği topun başına gelebilecek bazı çarpışmaları kaçırabilir. Elbette, izleme topunun çerçeveler arasında daha büyük bir mesafe hareket etmesi gerekir.
Wolfgang Schreurs

Daha fazla sadakat istiyorsanız, izleme topu konumunu çerçeve başına iki kez yeniden hesaplayabilir ve her hesaplama için hızı yarıya indirebilirsiniz.
DDR

22

Oynadığım Pong oyunları şu şekilde davranıyor gibi görünüyor: AI kontrollü kürek topun nereye vuracağını biliyor, ancak bu konuma ne kadar hızlı ulaşabileceğiyle sınırlı. Yani bazen özlüyor. Bunu yapmanın en bariz yolu olduğunu düşünüyorum.


Bu. Yapay zekanın topun sadece kare başına 3 piksel hareket edebileceği ve yukarıdan aşağıya doğru hareket etmesi gerektiğinde topun nereye vuracağını bilmesine yardımcı olmaz.
KeithS

14

TI83'ümde oh-so-awesome neredeyse pacman klonu oluşturduğumda? hesap makinesi, ben karşılaştım en büyük sorun "hayaletler" çok hızlı oldu. Onları bir şekilde yavaşlatmak zorunda kaldım. Bu yüzden buraya büyük bir eski günah (cos (tan (x-coordinate))) koydum. Daha kolay seviyeler bu hesaplamayı birkaç kez yapar ve daha zor seviyeler işlemlerden sadece birini yapar.

Mesele, REAKSİYON ZAMANI. Tipik bir insan reaksiyon süresinin ne olduğunu araştırın ve üzerine 10 ms ekleyin. Bunu başlangıç ​​noktası olarak kullanın. Seviyeler zorlaştıkça, reaksiyon süresinden zaman çıkarın ... Thread.sleep(time);AI için basit olabilir . Yapay zeka hareket etmeye başlamadan önce bu kadar bekleyin.

Ayrıca, raketin ne kadar hızlı hareket ettiğini kontrol edebilir veya GERÇEKTEN karmaşık hale gelmek isterseniz, topun değişen derecelerde bilgiye dayanacağını belirleyebilirsiniz ... bir vektör yerine sadece 2 piksel deyin. AI'yı yeniden hesaplamaya zorlayarak, bir dereceye kadar rastgelelik eklemek için duvarlara açı değiştiricileri ekleyin.


2
Neden tam olarak kullandığını açıklayabilir misin sin(cos(tan(x)))?
nullpotent

5
çünkü ben genç, aptaldım ve bir TI83'te günah (cos (tan (x))) AI'da iyi bir gecikme birimi yarattı. Ayrıca, bildiğim kadarıyla, hesap makinesinin milisaniye kullanabilen bir bekleme komutu yoktu. Belki biraz açıklık: Meclis ya da mikro senaryo ya da bu şeyleri çalıştırmak için derleyebileceğiniz herhangi bir dili kullanmadım. Ürün yazılımı programlama kodunu (prgm düğmesi) kullandım. Herhangi bir anda ekranda MAKSİMUM 8 satır kod vardı. Gecikme için daha karmaşık bir şey hatırlayamadım.
Russell Uhl

2
TI83'ün yerleşik yazılım kodunda programlamayı öğrendim. Sonra C ++ yapılandırılmış programlamayı yeniden öğrenmek zorunda kaldı. TI83'ün bana spagetti string kodunun ne olduğunu ve neden kötü olduğunu öğrettiğini söyleyebilirim. O zamandan beri bir goto ifadesi kullanmadım. İyi günler olsa.
ContextSwitch

2
aman tanrım, gotos. Ben her zaman kodu tekrar ziyaret .... ve hızla pes. Matematik derslerim sırasında bir hafta boyunca bu şeyi nasıl programlamayı başardığımı bilmiyorum.
Russell Uhl

1
Tetikleme gecikmeniz konusunda savunmaya gerek yok. Bir döngüdeki kayan nokta matematiği, birkaç on yıl önce yazılmış programlarda duraklama yapmanın yaygın bir yoluydu ve hesap makinelerinizin performansı / yetenekleri 80'lerin başlarındaki bir bilgisayarla uyumludur.
Dan Neely

6

Eğer raketi yavaşlatırsanız, topa keskin bir açıyla vurduğunuzda (yani diğer tarafa doğru çok yukarı ve aşağı hareket ederken), bilgisayar neredeyse her zaman özleyecektir çünkü top yukarı / aşağı hareket ediyor raket telafi edebileceğinden daha hızlı.

Bunun yerine, yaptığım şey kürek hızı ve AI'nin tepki verdiği nokta ile oynamak. Örneğin:

  • kullanıcı topa vurduğunda
    • AI hemen tepki verebilir ve topun bulunduğu yere gidebilir. Yeterince hızlı olursa, oraya zamanında ulaşır
  • top alanın ortasından geçtiğinde
    • AI tepki vermeden önce alanın ortasından geçene kadar beklemelidir.

Değiştirilecek başka bir şey de AI'nın nasıl tepki verdiği. Raketin her zaman topun bulunduğu konuma hareket ettiği bir strateji vurguladınız. Bir kişi her zaman bunu yapamaz. Topun yukarı ve aşağı takip etme olasılığı daha yüksektir, tüm sıçramalar nedeniyle topun tam olarak nerede olacağını bilmeden.

Bu nedenle, reaksiyon için daha insani bir yöntem daima topa doğru hareket etmektir. Örneğin, top yukarı hareket ediyorsa, raket yukarı hareket eder. Raket yeterince hızlıysa, üst ve alttan seken tepkilere tepki verebilir. Eğer raket yeterince hızlı değilse, top yukarı hareket ettiğinde yukarı doğru hareket ederek aşırı telafi edecektir, ancak daha sonra sıçradığında, raket yeterince hızlı hareket edemeyebilir.

Son olarak, zorluğu artırmak / azaltmak için raket boyutuyla da oynayabilirsiniz.


2

Dikkate alınması gereken bir faktör rasgeledir - insan oyuncuların oyunlarında her zaman bir dereceye kadar varyasyon vardır, bu nedenle AI'nızın insan gibi görünmesini istiyorsanız, oyunda da bazı varyasyonlara sahip olmak istersiniz.

Şunlar için aralıklar ayarlayabilirsiniz:

  • Reaksiyon süresi (AI'nin hareket etmeye ne kadar hızlı başladığı)
  • Hız (AI, raketi ne kadar hızlı hareket ettirir)
  • Doğruluk (AI, küreklerini hareket ettirmek istediği yere ne kadar yaklaşacak ve nerede olmak istediklerini aşmak veya aşmak için bir şans verir)

Daha sonra rakibin her vuruşunda, AI bu aralıklar içinde bir değer seçebilir ve buna dayanarak kararlarını (ve hareketlerini) verebilir. Daha kolay AI rakipleri için, bu aralıkları oldukça zayıf hale getirebilirsiniz, ancak AI'ya "şanslı atışlar" vermek için geniş aralıklara sahip olabilirsiniz. Daha zor rakipler için, bu aralıkları sıkıp hepsini "iyi" menzile koyabilirsiniz.


2

Sadece pong'a özgü olmayan daha genel bir çözüm önereceğim. Bunun sadece pong'a değil, herhangi bir oyuna da uygulanabileceğine inanıyorum. İnsan gibi davranışlar istiyorsun değil mi? Böylece bir insan, bir insan oynuyormuş gibi hissedebilir ... ve bu nedenle de kazanma umuduyla. Ee ne yapıyorsun?

Bir insanı gözlemleyin! Bir oyuncu pong'da nasıl kaybedebilir? İki pong oyuncusu izlersek oldukça açıktır. Genellikle kayıp, topun çok hızlı olması ve oyuncuların reaksiyon süresinin ertelenmesidir. Bu iki parametre, biri ayarlanabilir. Diğeri oyuncuların doğru yöne basabilmesidir. Yani bir hata frekansınız ve bir reaksiyon frekansınız var - her ikisi de zorluğa bağlı olarak ayarlanabilir.

Kolay bir yapay zeka daha yüksek girdi gecikmesine ve rastgele hatalar yapma eğilimine sahip olacaktır - daha zor bir yapay zeka olarak bu parametrelerin zor olması için ayarlanmış olacaktır.

Bu, tic tac toe veya hatta daha karmaşık modeller gibi neredeyse tüm oyunlara uygulanabilir. Bu yaklaşım daha karmaşık senaryolarda bozulur, ancak parametrelerin ve kapsamın sayısının dar olduğu oyunların yeterli olduğu yeterlidir.


1

Bazıları zaten ele alınan birkaç seçeneğin listesi:

  • Daha akıllı bilgisayar oyuncularının topu hedeflemesini sağlayın, böylece oyuncunun çok sayıda zıplama ile ulaşması zorlaşır ve kolay rakipler için tersini yapar.
  • Top rakibe giderken akıllı oyuncu raketlerini ortaya doğru hareket ettirir ve nereye geri döneceğini bilmez.
  • Son sıçramadan önce bir insanın topun nerede biteceğini tahmin etmesi daha zordur. AI'nın benzer bir yanlışlığa sahip olmasını sağlayın.
  • Raketin hızını topdan daha yavaş olacak şekilde sınırlayın. Mükemmel oyunla kaçırmak için dikey hızın yarısından daha az olması gerekir.
  • Zorluk, maç süresi vb.'ye göre topun hızını artırın.
  • İnsanlar anında tepki vermiyor. AI oyuncuları da olmamalıdır.
  • AI'ya rastgele bir hata yapma ve topu özleme şansı verin.

0

Ben de küçük bir Pong klonu yaptım (LUA'da).

Yapay zekam çok basit ama o kadar da kötü değil, imho.

Sadece topun y konumunu kontrol ediyorum ve eğer daha alçaksa, raketi aşağı hareket ettiriyorum, daha yüksekse raketi yukarı hareket ettiriyorum.

Sonra, zorluğu ince ayarlamak için, bilgisayar raketinin hareket etmeye başladığı toptan mesafeyi arttırır veya azaltırım.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.