Vuruşta akıllı bir düşman nasıl uygulanır?


13

Hepimizin bildiği çok basit bir shoot-em-up düşünün:

shoot-em-up 1

Sen oyuncusun (yeşil). Hareketiniz Xeksenle sınırlıdır . Düşmanımız (ya da düşmanlarımız) ekranın üstündedir, hareketi de Xeksenle sınırlıdır . Oyuncu düşmana mermi (sarı) fırlatır.

Düşman için oyuncuların kurşunlarından kaçınmasında gerçekten iyi olması gereken bir yapay zeka uygulamak istiyorum. İlk fikrim, ekranı ayrı bölümlere ayırmak ve bunlara ağırlık atamaktı:

ağırlıklı shoot-em-up

İki ağırlık vardır: "Mermi ağırlığı" (gri), merminin neden olduğu tehlikedir. Mermi düşmana ne kadar yakınsa, "mermi ağırlığı" 0..1o kadar yüksek olur ( 1'in en büyük tehlike olduğu yer). Kurşunsuz şeritlerin ağırlığı 0'dır. İkinci ağırlık "mesafe-ağırlıktır" (kireç yeşili). Her bir şerit için 0.2hareket maliyeti ekliyorum (bu değer şimdi keyfi ve ince ayar yapılabilir).

Sonra sadece ağırlıkları (beyaz) eklerim ve en düşük ağırlığa (kırmızı) sahip şeride giderim. Ancak bu yaklaşımın belirgin bir kusuru var, çünkü gitmek için en uygun yer iki gelen mermi arasında (beyaz okla belirtildiği gibi) olacağı için yerel minima'yı kolayca özleyebiliyor .

İşte aradığım şey:

shoot-em-up toplam imha

  • Mermi tehdidi empoze etmeyen bir yer olmasa bile, mermi fırtınası boyunca bir yol bulmalı.
  • Düşman, optimum (veya neredeyse optimal) bir çözüm seçerek mermileri güvenilir bir şekilde atlatabilir.
  • Algoritma, mermi hareket hızını hesaba katabilmelidir (farklı hızlarda hareket edebildikleri için).
  • Algoritmayı değiştirmenin yolları, böylece farklı zorluk seviyeleri uygulanabilir (aptaldan süper zeki düşmanlara).
  • Algoritma farklı hedeflere izin vermelidir, çünkü düşman sadece kurşunlardan kaçmak istemiyor, aynı zamanda oyuncuyu da vurabilmelidir. Bu, mermilerden kaçarken düşmanın oyuncuya ateş edebileceği pozisyonların tercih edilmesi gerektiği anlamına gelir.

Peki bununla nasıl başa çıkardın? Bu türün diğer oyunlarının aksine, aptal düşman kitleleri yerine sadece birkaç ama çok "yetenekli" düşmanlara sahip olmak istiyorum.


2
Direksiyon davranışları gibi bir şey kullanmayı düşündünüz mü? Özellikle engellerden kaçınmak için bir tane var: red3d.com/cwr/steer/Obstacle.html
Tetrad

@Tetrad Direksiyon davranışları hakkında düşündüm .. Ayrıca, "oyuncu vurmaya çalışın" ve tehlike önde olduğunda "kaçmak" geçmek gibi güzel değiştirilebilir çünkü. Bir 1D'nin (temelde uğraştığım şey) bir versiyonunun iyi kararlar almak için çok aptal olacağından korkuyorum. Yine de yanılmış olabilirim.
bummzack

Yanıtlar:


8

Bence temel fikriniz sağlam, ama analog değil. Ekran boyunca çalışan bir analog değer alanına ihtiyacınız var. Böylece, o çizginin tam bir noktasında anında bir değer türetebileceğiniz 1D difüzyon gradyanı. Difüzyon gradyanları ucuzdur ve çevreyi tanımladıkları için birden fazla düşman tarafından aynı anda kullanılabilirler ve işletmenin bakış açısını değil (biraz ışık saçma aydınlatması gibi) - muhtemelen neden sorunuzdaki yaklaşımı seçtiniz? . Düşmandan organik hareket uyandırmak ve oyun tablonuzun yaptığı gibi açıkça güncellenmesi için bu degrade nispeten pürüzsüz olmalıdır. Belki hareketli ortalama ?

Degrade şunları birleştirmelidir:

  • yakınlık
  • hız
  • Merminin genişliği
  • (isteğe bağlı) Hedeflerin konumu (oyuncular)

Kaçmak için, bir çözüm olduğunda doğru bir çözüm bulabilmeliyiz . Bu, düşmanın kaçabileceği kadar küçük bir boşluk olduğunda böyledir. Yani, sadece yapabileceğinizi yapabilirsiniz, bu yüzden degrade yaklaşımı bu anlamda diğer herhangi bir yaklaşımdan daha kötü çalışmayacaktır.

Difüzyon gradyanı, düşmanı hareket etmek için daha az zorunlulukla yerel optima'ya (grafikteki zirveler olarak) itmelidir, yerel minimum seviyeye ne kadar yakın olursak, kaçmak için azalan bir geri dönüş etkisi vardır. Bu, düşmanın ne zaman iyi bir ateş açmaya sahip olduğu konusunda daha akıllı bir karar almanın kapısını açar.

Ateş etme ihtiyacı, hareket etme ihtiyacından daha fazlaysa, bunu yapın; kodunuz bunu ne kadar farklı olduklarına göre de belirleyebilir . Bunu temel grafiğin bir parçası olarak uygulayabilirsiniz, bu durumda oyuncu konumu, grafikteki çevre değerlerini azaltır (düşmanların en düşük noktaya çekildiği varsayılarak), bu da tüm karar verme süreçlerini tek bir grafikte birleştirir veya " ateş etme arzusu grafiği size daha doğrudan kontrol sunacak olan ana "kaçma arzusu" grafiğinden ayrıdır.

IRL, en yüksek kaçma hızımda kaçınmanın zorlaşmaya başladığını bildiğim bir mesafe içinde olana kadar bir mermiden kaçmak zahmetine girmezdim. Delikanlı olarak taş atmaktan ilk elden deneyim. X hızında y mesafesindeki bir mermi, 2y mesafesindeki 2x mesafedeki mermiyle aynı tehlike derecesine sahiptir. Bu nedenle, bunun doğru bir şekilde hesaba katılması gerekir.

Düşman zorluğu için algoritmayı değiştirmenin yolları şunlardır:

  • grafik güncellemelerinde gecikme (Born Too Slow)
  • grafiğe rastgele, lokalize masumiyetlerin dahil edilmesi
  • basit AI tembelliği nedeniyle bir dizi güncelleme (örneğin 1 ila 10 kare) üzerinden düşmanın grafiğin onlara söylediklerine uymaması.

Yine, tüm faktörleri bir grafiğe (daha az kontrol ve birden fazla düşman için daha az yararlı) veya sonuçları elde etmek için birlikte baktığınız birkaç grafiğe uygulayabilirsiniz (daha modüler, muhtemelen birden fazla düşman için daha iyi çalışır). Daha spesifik olmak zordur, çünkü bu yaklaşımı uygulayabileceğiniz birçok yön vardır.


1
Sevgili Nick. Bir flash böyle bir davranış küçük bir test-versiyonunu hayata ve ben çok memnun değilim öne geçti sonucu (mermi rastgele kökenli). Şu anda 3 degradeler kullanıyorum, biri tehdit, hareket maliyeti ve statik bir kenar (ekran kenarları daha az arzu edilir) için. Flash uygulamasında görselleştirilirler. Bazı ince ayarlarla çok iyi sonuçlar elde edebileceğimi ve çekim pozisyonları gibi diğer ağırlıklarda da etkili olabileceğimi hissediyorum. Çok teşekkürler dostum.
bummzack

1
Hey @bummzack, bu bir zevk arkadaşı, harika bir demo! Soruna ilişkin görüşün benim için yeni ve ilginç görünüyordu - işe yaradığını görmekten memnunum! Bu konuda yardımcı oldum ve paylaştığın için teşekkürler.
Mühendis

7

Bu bir yol sorunu olarak görülebilir. Baddy'nin mermileri nasıl önlediğini düşünmek yerine, mermilerin durağan olduğunu ve baddy'nin ekranın alt kısmına geçmesi gerekir.

    E    
B  B**B
  B***B  B
 B***B   B
B**B** B 
 B**B**BB
B*****B B
      P

E = düşman
B = kurşun
P = oyuncu
* = ekranın alt kısmına giden yol seçenekleri

Baddy başarılı bir yol çizdiğinde, her seferinde bir sonraki adımı atması gerekir. Muhtemelen böyle bir yol bulmak için bazı iyi algoritmalar var. Baddy madde işaretleri ile aynı hızda hareket ederse, bir örnek algoritma olabilir;

Baddy'den başlayın ve boş alanlarda güvenli konumları sol altta, sağ altta ve sağda işaretleyin. Ardından, az önce oluşturduğunuz ve tekrarladığınız güvenli alanları göz önünde bulundurun. Herhangi bir zamanda aşağıda güvenli alan bulunmazsa, alanı güvenli değil ve geri takip olarak işaretleyin.


1
İlginç bir yaklaşım. Ortamın bu kadar hızlı değiştiği ve bunun farklı "haritalar" ile en iyi şekilde çalıştığı için ortak yol bulma algoritmalarını kullanmak zor olsa da bunun pahalı olduğunu düşünüyorum.
bummzack

Çok pahalı olmamalı, her turda sadece alt satırı hesaplamanız gerektiğini unutmayın, her şeyi yeniden hesaplamanıza gerek yok.
Qwerky

@bummzack Ortam en azından bilgisayar açısından "hızlı" değildir. Oyun geliştirici için, hemen hemen her oyunun adım tabanlı olduğunu, sadece bu adımın boyutuyla ilgili olduğunu anlamalısınız. Ancak, her adımda hesaplamalar yapılabilir, bu nedenle Qwerky çözümlemesi ihtiyacınız olan şeydir.
Deele

Aslında, @bummzack ile hemfikirim. Bu yaklaşım mantıksal olarak sağlam olmakla birlikte, soruda önerilen 1D yaklaşımından daha pahalı olacaktır. Erken optimizasyon olabilir, ancak bu yaklaşımın çok daha zarif olduğunu düşünüyorum. Bununla ilgili bir ayrıntı için cevabımı görün.
Mühendis

2
Bu muhtemelen doğru cevap, ama tam olarak gerçekçi bir cevap değil . Düşmanın bir yol üzerinde çalışması gerektiğinde, alan yolu tamamen geçersiz kılan başka bir mermi setine sahip olabilir, yani yolu yeniden hesaplamak bir zorunluluktur. Ve yeniden hesaplama bir orospu . Ayrıca, güvenli olduğu bir noktaya geri çoğaltma fikriniz onu daha da pahalı hale getirir! @Nick Wiggill Kendinizi kasıkta tekmelemediğinizden emin olmak için erken optimizasyon, sadece iyi öngörü olduğunu düşünmüyorum.
Ray Dey
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.