Bagaimana cara menerapkan musuh yang cerdas dalam tembak-menembak?

13

Bayangkan tembak-menembak yang sangat sederhana, sesuatu yang kita semua tahu:

tembak-em-up 1

Anda adalah pemain (hijau). Gerakan Anda terbatas pada Xsumbu. Musuh kita (atau musuh) ada di bagian atas layar, gerakannya juga terbatas pada Xporosnya. Pemain menembakkan peluru (kuning) ke arah musuh.

Saya ingin menerapkan AI untuk musuh yang harusnya benar-benar pandai menghindari peluru pemain. Ide pertama saya adalah membagi layar menjadi beberapa bagian terpisah dan memberikan bobot kepada mereka:

tembak-em-up tertimbang

Ada dua bobot: "bobot peluru" (abu-abu) adalah bahaya yang ditimbulkan oleh peluru. Semakin dekat peluru ke musuh, semakin tinggi "peluru" ( 0..1, di mana 1 adalah bahaya tertinggi). Jalur tanpa peluru memiliki bobot 0. Berat kedua adalah "distance-weight" (hijau limau). Untuk setiap jalur saya menambahkan 0.2biaya perpindahan (nilai ini agak berubah-ubah sekarang dan dapat diubah).

Kemudian saya cukup menambahkan bobot (putih) dan pergi ke jalur dengan bobot terendah (merah). Tetapi pendekatan ini memiliki cacat yang jelas, karena dapat dengan mudah kehilangan minimum lokal sebagai tempat yang optimal untuk pergi hanya antara dua peluru yang masuk (seperti dilambangkan dengan panah putih).

Jadi inilah yang saya cari:

tembak total em-up

  • Harus menemukan jalan melalui badai-peluru, bahkan ketika tidak ada tempat yang tidak memaksakan ancaman peluru.
  • Musuh dapat secara andal menghindari peluru dengan memilih solusi yang optimal (atau hampir optimal).
  • Algoritma harus dapat memperhitungkan kecepatan pergerakan peluru (karena mereka mungkin bergerak dengan kecepatan yang berbeda).
  • Cara untuk mengubah algoritma sehingga berbagai tingkat kesulitan dapat diterapkan (bodoh terhadap musuh yang sangat cerdas).
  • Algoritma harus memungkinkan gol yang berbeda, karena musuh tidak hanya ingin menghindari peluru, ia juga harus dapat menembak pemain. Itu berarti bahwa posisi di mana musuh dapat menembak pemain harus lebih disukai ketika menghindari peluru.

Jadi bagaimana Anda menangani ini? Berlawanan dengan gim-gim lain dari genre ini, saya hanya ingin memiliki beberapa musuh yang sangat "terampil" daripada massa musuh yang bodoh.

bummzack
sumber
2
Sudahkah Anda mempertimbangkan untuk menggunakan sesuatu seperti perilaku menyetir? Ada satu untuk penghindaran rintangan secara khusus: red3d.com/cwr/steer/Obstacle.html
Tetrad
@Tetrad Saya telah memikirkan tentang perilaku kemudi .. juga karena mereka dapat dengan baik dialihkan, seperti "coba tembak pemain" dan ketika bahaya ada di depan, beralihlah ke "menghindari". Saya takut bahwa versi 1D (itulah yang pada dasarnya saya hadapi) menghindari akan terlalu bodoh untuk membuat keputusan yang baik. Tapi saya mungkin salah.
bummzack

Jawaban:

8

Saya pikir ide dasar Anda adalah suara, tetapi itu bukan analog. Anda membutuhkan bidang nilai analog yang berjalan melintasi layar. Jadi, gradien difusi 1D, dari mana Anda dapat memperoleh nilai pada titik yang tepat pada baris itu, dengan cepat. Gradien difusi murah dan dapat digunakan oleh banyak musuh sekaligus, karena menggambarkan lingkungan, dan bukan pandangan entitas tentang hal itu (sedikit seperti pencahayaan radiositas) - mungkin mengapa Anda memilih pendekatan yang Anda miliki dalam pertanyaan Anda . Gradien ini seharusnya relatif halus, sehingga dapat membangkitkan gerakan organik dari musuh, dan tentu saja diperbarui seperti halnya gamestate Anda. Mungkin rata-rata bergerak ?

Gradien harus menggabungkan:

  • Kedekatan
  • Kecepatan
  • Luasnya peluru
  • (opsional) Posisi target (pemain)

Untuk menghindari, kita harus dapat menemukan solusi secara akurat setiap kali ada solusi . Seperti itulah setiap kali ada celah yang cukup kecil untuk dilewati musuh. Artinya, Anda hanya dapat melakukan apa yang dapat Anda lakukan, sehingga pendekatan gradien akan bekerja tidak lebih buruk daripada pendekatan lain dalam hal ini, saya katakan.

Gradien difusi harus mendorong musuh ke arah optima lokal (menjadi puncak dalam grafik) dengan kurang keharusan untuk bergerak, semakin dekat kita ke minimum lokal, maka efek pengembalian berkurang pada menghindari. Ini membuka pintu bagi pengambilan keputusan yang lebih cerdas tentang kapan musuh memiliki celah yang bagus untuk menembak.

Jika kebutuhan untuk menembak lebih besar daripada kebutuhan untuk bergerak, maka lakukanlah; kode Anda juga dapat menentukan berapa banyak perbedaannya. Anda dapat menerapkan ini sebagai bagian dari grafik dasar, dalam hal ini posisi pemain mengurangi nilai-nilai sekitarnya dalam grafik (dengan asumsi musuh condong ke titik terendah), yang menggabungkan semua pengambilan keputusan menjadi satu grafik, atau Anda dapat menyimpan " keinginan untuk memecat "grafik terpisah dari grafik" keinginan untuk menghindar "utama, yang akan memberi Anda kontrol lebih langsung.

IRL, saya tidak akan repot-repot menghindari proyektil sampai dalam jarak yang saya tahu, dengan kecepatan menghindari terbaik saya, mulai menjadi sulit untuk dihindari. Pengalaman tangan pertama dari melempar batu sebagai anak muda. Peluru pada jarak x yang bepergian pada kecepatan y memiliki peringkat bahaya yang sama dengan peluru pada jarak 2x yang bepergian pada 2y. Jadi ini perlu diperhitungkan dengan benar.

Cara untuk mengubah algoritma untuk kesulitan musuh termasuk

  • memperkenalkan latensi tentang pembaruan pada grafik (Born Too Slow)
  • memperkenalkan ketidakakuratan acak yang dilokalkan ke dalam grafik
  • tidak memiliki musuh yang menuruti apa yang ditunjukkan grafik, melalui urutan pembaruan (katakan 1 hingga 10 frame) karena kemalasan AI semata.

Sekali lagi, Anda dapat mengimplementasikan semua faktor ke dalam satu grafik (kurang kontrol, dan kurang bermanfaat untuk banyak musuh), atau ke beberapa grafik yang Anda lihat bersama untuk mendapatkan hasilnya (lebih modular, mungkin bekerja lebih baik untuk banyak musuh). Sulit untuk lebih spesifik, karena ada banyak arah yang dapat Anda ambil dengan pendekatan ini.

Insinyur
sumber
1
Nick sayang. Saya meneruskan versi uji kecil dari perilaku itu dalam sekejap dan saya sangat senang dengan hasilnya (peluru dihasilkan secara acak). Saat ini saya menggunakan 3 gradien, satu untuk ancaman, biaya gerakan dan satu statis untuk tepi (sehingga tepi layar kurang diinginkan). Mereka divisualisasikan dalam aplikasi flash. Saya merasa bahwa dengan beberapa penyesuaian saya dapat mencapai hasil yang sangat baik dan juga faktor dalam bobot lain seperti posisi pemotretan. Terima kasih banyak, teman.
bummzack
1
Hei @bummzack, ini teman yang menyenangkan, itu demo kecil yang keren! Pandangan Anda tentang masalah itu baru bagi saya dan terlihat menarik - Saya senang melihatnya berhasil! Senang membantu dengan itu, dan terima kasih telah berbagi.
Insinyur
7

Ini bisa dilihat sebagai masalah pathing. Alih-alih memikirkan bagaimana baddy menghindari peluru, pencitraan bullet itu statis dan baddy harus melewatinya ke bagian bawah layar.

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

E = musuh
B = peluru
P = pemain
* = opsi jalur ke bagian bawah layar

Setelah baddy telah merencanakan jalan yang sukses itu hanya perlu mengambil langkah berikutnya setiap kali. Mungkin sudah ada beberapa algoritma yang bagus untuk mencari jalur seperti ini. Jika baddy bergerak dengan kecepatan yang sama dengan peluru, salah satu contoh algoritma mungkin;

Mulai dari baddy dan tandai posisi aman di ruang kosong di sebelah kiri bawah, langsung di bawah dan di bawah kanan. Kemudian pertimbangkan setiap ruang aman yang baru saja Anda buat dan ulangi. Jika sewaktu-waktu Anda menemukan tidak ada ruang aman di bawah ini maka tandai ruang tersebut sebagai tidak aman dan mundur.

Qwerky
sumber
1
Pendekatan yang menarik. Saya takut bahwa ini agak mahal karena lingkungan berubah begitu cepat dan sulit untuk menggunakan algoritma pencarian jalur umum karena mereka bekerja paling baik dengan "peta" diskrit.
bummzack
Seharusnya tidak terlalu mahal, jangan lupa bahwa Anda hanya perlu menghitung baris bawah setiap belokan, Anda tidak perlu menghitung ulang semuanya.
Qwerky
@bummzack Environment tidak "cepat", setidaknya, dalam hal komputer. Untuk pengembang game, Anda harus mengerti, bahwa hampir setiap game berbasis langkah, hanya tentang ukuran langkah itu. Tetapi, pada setiap langkah, perhitungan dapat dilakukan, jadi solusi Qwerky adalah hal yang Anda butuhkan.
Deele
Sebenarnya, saya setuju dengan @bummzack. Meskipun pendekatan ini solid secara logis, pendekatan ini akan lebih mahal daripada pendekatan 1D yang diajukan dalam pertanyaan. Mungkin optimasi prematur, tetapi saya menemukan pendekatan itu jauh lebih elegan. Lihat jawaban saya untuk uraian tentang itu.
Insinyur
2
Ini mungkin jawaban yang tepat , tetapi tidak realistis . Dalam waktu yang dibutuhkan musuh untuk membuat jalan, lapangan dapat memiliki satu set peluru yang membatalkan jalan sepenuhnya, yang berarti bahwa menghitung ulang jalan akan menjadi suatu keharusan. Dan perhitungan ulang itu menyebalkan . Lebih jauh lagi, ide Anda untuk melakukan backpropagating ke titik yang aman membuatnya semakin mahal! @Nick Wiggill Saya tidak berpikir itu optimasi prematur, hanya pandangan ke depan yang bagus untuk memastikan Anda tidak menendang selangkangan.
Ray Dey