Bayangkan tembak-menembak yang sangat sederhana, sesuatu yang kita semua tahu:
Anda adalah pemain (hijau). Gerakan Anda terbatas pada X
sumbu. Musuh kita (atau musuh) ada di bagian atas layar, gerakannya juga terbatas pada X
porosnya. 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:
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.2
biaya 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:
- 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.
sumber
Jawaban:
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:
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
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.
sumber
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 = 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.
sumber