Hepimizin bildiği çok basit bir shoot-em-up düşünün:
Sen oyuncusun (yeşil). Hareketiniz X
eksenle sınırlıdır . Düşmanımız (ya da düşmanlarımız) ekranın üstündedir, hareketi de X
eksenle 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ı:
İ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..1
o 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.2
hareket 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:
- 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.