Bantuan dengan AI strategi-permainan

8

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:

  1. Bunuh unit pemain terdekat

  2. Memenuhi arahan utama (membunuh semua unit pemain, membunuh unit target, bertahan selama x putaran)

  3. 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.
f20k
sumber

Jawaban:

8

Ada banyak aplikasi yang bisa Anda gunakan untuk AI semacam ini. Secara pribadi, salah satu teknik paling jelas yang dapat Anda manfaatkan adalah fungsi evaluasi posisi. Killzone memanfaatkan teknik ini dan dijelaskan dalam makalah berikut:

http://www.cgf-ai.com/docs/straatman_remco_killzone_ai.pdf

Sebenarnya, Anda mungkin dapat menggunakan banyak kertas itu karena itu menggambarkan representasi dunia, data garis pandang, tabel pencarian, dll, dan Anda pada dasarnya sudah memiliki grafik dengan kisi hex Anda (Anda hanya perlu menambahkan node tetangga, yang dalam hal ini akan menjadi segi enam tetangga ke satu segi enam tunggal).

Hal lain untuk dilihat (yang cukup mengesankan saat ini, tetapi sedikit lebih maju) adalah perencana. Saya belum banyak membaca di Hierarchical Task Networks, saya akan menyerahkannya kepada Anda. Salah satu perencana yang mungkin membantu adalah GOAP (Perencanaan Tindakan Berorientasi Tujuan)

Tautan ini memiliki banyak informasi mengenai GOAP: http://web.media.mit.edu/~jorkin/goap.html

Sesuatu yang baru saja saya pikirkan sehubungan dengan tujuan "Survive for X number of turns" Anda adalah penggunaan peta pengaruh. Peta pengaruh hanyalah representasi yang sangat sederhana untuk dunia Anda di mana setiap simpul (segi enam) memiliki nilai tunggal yang terkait dengannya (disebut pengaruh).

Pengaruh dapat dihitung dalam beberapa cara, tetapi contoh untuk kasus Anda bisa membuat para pemain menghasilkan pengaruh +10 pada segi enam tempat mereka ditempatkan dan +1 memberi pengaruh pada segi enam yang ditetapkan sebagai rentang maksimum dari pemain.

Jadi misalnya, jika Anda memiliki sekelompok pemain berkerumun bersama, pengaruh di sekitar mereka akan relatif tinggi. Ini bisa ditafsirkan oleh AI sebagai ancaman bagi kehidupannya dan menjauh dari titik-titik pengaruh tertinggi.

Ini hanya beberapa teknik yang bisa Anda gunakan, tetapi ada banyak lainnya. Jika Anda menginginkan sesuatu yang sederhana, gunakan sesuatu seperti FSM hirarkis (cukup banyak FSM dengan setiap negara bagian yang berisi FSM lain dengan tingkat detail yang lebih tinggi). Jika Anda menginginkan sesuatu yang kompleks namun fungsional dan praktis, gunakan GOAP dan pengaruh peta. Tidak terlalu penting untuk jujur ​​karena POIN UTAMA adalah untuk membuat AI menyenangkan, dan untuk melakukan itu Anda perlu menerapkan semacam "kebodohan buatan". Tidak seorang pun akan mau memainkan AI yang jauh lebih pintar daripada mereka, terlepas dari berapa banyak usaha yang Anda lakukan. Saya tidak mengatakan ini terdengar kasar, saya mengatakan ini karena penting bahwa AI membuat kesalahan karena rekan manusia mereka pasti melakukannya!

Semoga berhasil! :)

Ray Dey
sumber
1
Terima kasih atas sumber dayanya. Saya pernah melihat mereka ditautkan di situs sebelumnya. Saya harus membacanya lebih mendalam sekarang untuk melihat bagaimana saya bisa menerapkannya pada permainan saya. Saya ingat pernah membaca ide peta pengaruh di sekitar sini, dan ide dasar itulah yang saya gunakan untuk ide 'saat ini'.
f20k
5

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.

Loren Pechtel
sumber
1
Hmm, jadi apa yang bisa saya mengerti dari paragraf pertama: jika Anda membuat pohon keputusan yang dipikirkan dengan sangat baik, Anda dapat membuat ai yang layak dalam beberapa lapisan dan meningkatkan 'kecerdasan' dengan mengorbankan waktu dengan menurunkan lapisan lain (dari kesulitan). Saya pikir saya akan mencoba ini. Juga, saya suka ide Anda mengeluarkan perintah berdasarkan nilai suatu posisi.
f20k
4

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
1
Untuk poin yang Anda sebutkan - Anda benar tentang menggunakan utas itu. Saya memikirkan utas dukungan untuk perhitungan AI tetapi karena pengguna akan memindahkan unit mereka, itu akan membuang perhitungan. Tapi ya, itu ide yang bagus. Saya pasti akan menambahkan heuristik sehingga AI akan lebih cenderung memilih satu kemampuan daripada yang lain - itu juga memungkinkan untuk 'bertema'-AI yang hanya melakukan kemampuan tertentu.
f20k