Saya sedang mengembangkan AI permainan strategi (pikirkan: Final Fantasy Tactics), dan saya mengalami kesulitan untuk mendesain AI. Masalah utama saya adalah menentukan mana yang optimal untuk dilakukan.
Pertama, izinkan saya menggambarkan prioritas tindakan apa yang saya ingin AI lakukan:
Bunuh unit pemain terdekat
Memenuhi arahan utama (membunuh semua unit pemain, membunuh unit target, bertahan selama x putaran)
- Sembuhkan unit pendukung / tuang buffer
Sekarang AI dapat melakukan hal berikut pada gilirannya:
Pindahkan -> {Serangan / Kemampuan / Item} (baik serangan atau kemampuan atau item)
{Attack / Ability / Item} -> Pindahkan
Bergerak lebih dekat (jika target tidak dalam jangkauan)
- {Attack / Ability / Item} (jika bergerak tidak tersedia)
Catatan
Kemampuan memiliki berbagai rentang / efek / biaya / efek. Setiap unit ai mungkin memiliki 5-10 kemampuan untuk dipilih. AI akan memprioritaskan pembunuhan daripada keselamatan kecuali arahannya adalah untuk bertahan hidup selama x turn. Itu juga tidak peduli biaya kemampuan banyak. Sementara seorang pemain mungkin ingin menyimpan mantra besar untuk nanti, AI kemungkinan besar akan menggunakannya sesegera mungkin.
Gerakan berada pada kisi (hex)
jumlah unit pemain: 3-6
jumlah unit ai: 3-7 atau lebih. Mungkin maks 10.
AI dan pemain bergiliran mengendalikan SATU unit, alih-alih semuanya secara bersamaan.
Platform adalah Android (jika program tidak merespons setelah beberapa waktu, akan ada popup yang mengatakan kepada Force Quit atau Wait - yang terlihat sangat buruk!).
Sekarang muncul pertanyaan:
Kemampuan terbaik untuk menggunakan jelas akan menjadi salah satu yang mencapai target paling banyak untuk kerusakan paling. Tetapi karena masing-masing kemampuan memiliki rentang yang berbeda, saya tidak akan tahu apakah mereka berada dalam jangkauan tanpa menjelajahi setiap tempat yang memungkinkan saya dapat pindah ke.
Salah satu solusinya adalah melalui setiap tempat yang memungkinkan untuk bergerak, menentukan serangan optimal di lokasi itu - yang memberi saya daftar langkah optimal untuk setiap lokasi. Kemudian pilih yang optimal dari daftar dan jalankan. Tetapi ini akan memakan banyak waktu CPU. Apakah ada solusi yang lebih baik?
Ide saya saat ini adalah bergerak sedekat mungkin ke arah kelompok orang terdekat, terbesar, dan menentukan serangan / kemampuan optimal dari sana. Saya pikir ini akan menjadi jauh lebih sedikit bekerja untuk CPU dan masih memungkinkan untuk serangan jarak jauh. Sub-optimal tetapi AI masih akan tampak 'pintar'.
Catatan / pertanyaan lain:
- Apakah saya terlalu berpikir / terlalu rumit? Solusi yang lebih baik? Saya terbuka untuk segala macam saran
- Saya telah melihat pertanyaan casting-mantra , tetapi tidak memperhitungkan pergerakan - jadi mungkin gunakan algo itu untuk setiap lokasi pemindahan yang mungkin? Jawaban teratas menyebutkan itu tidak bagus untuk area-of-effect dan pertarungan kelompok - jadi mungkin perlu lebih banyak tweaker?
- Silakan , jika Anda menyebutkan grafik / pohon, biarkan aku tahu pada dasarnya bagaimana menggunakannya. Misalnya Node berarti kemampuan, level berhubungan dengan kerusakan, kemudian mencari node terdalam.
Selama bertahun-tahun saya telah menulis 3 AI game, yang semuanya memainkan game yang terhormat.
Dua kasing memiliki opsi per giliran yang terbatas dan karenanya saya mengeksplorasi semua kemungkinan dan mengevaluasi posisi yang dihasilkan - Saya mengubah kedalaman yang saya cari berdasarkan kesulitan dan tidak perlu banyak lapisan untuk membuat lawan yang cukup terhormat. Saya bisa mendapatkan beberapa lapisan ke bawah dan masih memiliki respons dalam satu atau dua detik dan itu pada beberapa prosesor yang cukup kuno. (Semua ini sebelum Windows ada di tempat kejadian.) Kualitas analisis posisi SANGAT penting ketika menggunakan pendekatan ini.
Kasus ketiga tidak mengizinkan analisis seperti itu karena jumlah gerakan yang mungkin per putaran dapat dengan mudah melebihi partikel di alam semesta. Itu adalah semacam situasi seperti Risiko - wilayah dengan sejumlah pasukan di atasnya tetapi Anda bisa melakukan sejumlah gerakan per giliran, faktor kunci yang bergerak butuh waktu. Provinsi sebelah biasanya mengambil 1 belokan, satu di sisi lain dari peta dapat mengambil 9.
Saya menggunakan pendekatan yang sangat berbeda di sini. Saya memutuskan persen dari pasukan yang akan dialokasikan untuk pertahanan dan mengalokasikan yang didasarkan pada nilai wilayah dan perkiraan ancaman musuh (Sementara Anda bisa melihat pasukan apa yang bergerak lawan Anda tidak bisa melihat ke mana mereka pergi - itu mengasumsikan manusia akan memusatkan kekuatannya di suatu tempat dan menganggapnya lebih mungkin berada di tempat mereka semua bisa tiba sekaligus daripada sedikit demi sedikit.) Apa pun yang tidak diperlukan untuk pertahanan menjadi tersedia untuk pelanggaran. Saya melihat setiap tujuan yang mungkin dan menghitung apa yang diperlukan untuk memiliki kesempatan yang baik untuk mengambilnya dengan cepat (pertempuran yang berlarut-larut akan menghancurkan pada dasarnya semua produksi itu) dan menghasilkan satu set perintah serangan untuk itu. Nilai pesanan adalah nilai provinsi, biaya adalah jumlah tentara / belokan yang berkomitmen untuk serangan itu. Pilih nilai tertinggi dan jalankan perintah, ulangi sampai kekuatan yang tersedia tidak bisa mengambil apa pun. Waktu eksekusi sepele.
Saya harap saya memberi Anda beberapa ide di sini.
sumber
Catatan Anda tentang berhenti / menunggu menunjukkan kepada saya bahwa Anda melakukan semua pekerjaan pemrosesan pada utas utama aplikasi. Anda bisa, dengan asumsi ada dukungan thread yang cukup di SDK Android (yang saya asumsikan pasti ada), melepaskan bagian "berpikir" dari AI Anda ke thread pekerja sementara utas utama muncul dalam game "AI sedang mempertimbangkan. .. "UI tetapi sebaliknya merender secara normal.
Tentu saja ada alasan bagus untuk tidak ingin melakukan itu, seperti tidak ingin AI terlalu lama karena pemain akan bosan.
Adapun pertanyaan Anda yang sebenarnya, sementara "ide Anda saat ini" bisa diterapkan, itu sangat sederhana. Ini adalah titik awal yang baik. Ini adalah sistem di mana AI adalah murni hasil-fokus - mencoba maksimal satu nilai (kerusakan). Pilihan lain termasuk pendekatan yang berfokus pada target, di mana Anda memilih target dari tim lawan (secara acak, satu dengan HP terbanyak, beberapa kombinasi darinya, dan lain-lain), dan pindah ke target itu, mencoba merusaknya.
Satu hal yang mungkin ingin Anda pertimbangkan adalah memberi setiap kemampuan status 'kekuatan' atau 'efektivitas' yang disembunyikan dari pemain dan hanya digunakan secara internal oleh AI Anda. Anda menentukan sendiri nilai stat ini, berdasarkan pengetahuan Anda sendiri tentang kemampuan sebagai programmer game.
AI Anda kemudian akan memilih kemampuan dengan nilai tertinggi dan mencoba menggunakannya, jika mereka tidak dapat karena alasan apa pun, pilih yang berikutnya, dan sebagainya. Jika dibangun dengan cukup umum, Anda dapat mulai mengikat kedua sistem ini bersama-sama, sehingga setelah Anda menetapkan target, Anda memiliki heuristik untuk jenis serangan terbaik pada target tersebut (misalnya, bobot serangan yang menghasilkan kerusakan MP lebih efektif jika target memiliki MP tinggi).
sumber