Apa cara yang paling elegan untuk menerapkan sistem pemesanan perintah untuk AI? misalnya di benteng katai ketika Anda menandai area hutan untuk memotong kayu, maka katai akan melakukan urutan berikut:
- Pergi ke pohon
- Potong pohonnya
- Kirimkan kayu ke stockpile
- Pergi ke pohon lain
- dan seterusnya..
Saya sudah memiliki perintah stack no. 1 yang beralih dari status siaga ke mencapai ubin tujuan pohon.
Yang saya takutkan adalah bagaimana ini akan berantakan ketika saya membuat lebih banyak pesanan seperti ini:
Membangun sebuah rumah
- Pergi ke stockpile
- bawa kayu ke area konstruksi
- kembali ke persediaan
- Bawa batu ke area konstruksi
- menghidupkan sprite bangunan
Penanaman
- Pergi ke stockpile
- bawa benih ke lahan pertanian
Pembuatan bir
- Pergi ke stockpile
- Bawa tanaman diam
- menghidupkan sprite pembuatan bir
Jadi pertanyaan saya adalah, bagaimana cara menerapkan sistem pemesanan perintah seperti benteng kerdil dan menghindari kode spageti pada saat yang sama? apakah ada struktur data yang perlu saya pelajari? Apakah saya perlu meletakkan urutan perintah pada file xml yang terpisah?
Jawaban:
Pada awalnya Anda melihat bahwa perintah Anda dalam bentuk daftar , jadi insting pertama Anda mungkin untuk membuat ulang struktur itu, dan setiap kurcaci akan menjalankan daftar itu secara berurutan. Yang saya sarankan adalah memecah daftar menjadi beberapa langkah , dengan setiap langkah memiliki prasyarat , dan kemudian Anda menjalankan seluruh perintah secara terbalik . Izinkan saya menunjukkan dengan sebuah contoh:
Memotong kayu
Kelebihan dari ini adalah:
Kekurangan:
Secara logis, Anda dapat mewakili perintah ini sebagai diagram alur, yang dijalankan dari atas setiap kali, dan apa yang Anda lakukan tergantung pada apakah Anda menjawab ya / tidak pada setiap langkah. Apakah Anda menerapkan ini dalam kode atau dalam file eksternal seperti XML, itu terserah Anda.
sumber
fun
itu? ;)Jika Anda dapat membuat urutan yang cukup umum, tidak ada banyak kode spageti.
Dalam hal pengiriman misalnya: WorkTask beroperasi dengan WorkPlan. Workplan mengatakan unit sumber daya apa yang harus dipilih, dari rumah seperti apa, menggunakan animasi jalan mana, menggunakan animasi kerja mana, waktu bekerja dan semua detail lainnya. Jadi pada akhirnya WorkTask mungkin terlihat seperti:
Kami berhasil menggunakan pendekatan yang dijelaskan. Kami memiliki ~ 15 tugas dalam game kami. Beberapa hal penting:
sumber
Jadi ini pada dasarnya adalah masalah penyortiran topografi.
Anda memiliki grafik, setiap node adalah tugas yang perlu dilakukan, dan beberapa node tergantung pada beberapa node lain (ini diwakili oleh tepi dalam grafik dari tergantung node ke node itu tergantung pada). Anda ingin melakukan semua tugas, jadi Anda perlu menghasilkan BEBERAPA pemesanan node yang topografis OK, (node tergantung adalah setelah node mereka bergantung pada).
Sekarang, ada banyak urutan seperti itu biasanya (karena beberapa node tidak memiliki ketergantungan dan dapat diletakkan di mana saja, dan beberapa node memiliki ketergantungan yang sama dan tidak tergantung satu sama lain sehingga mereka dapat berada dalam urutan antara mereka sendiri, dan setiap node dapat diletakkan di sembarang tempat setelah dependensi selesai, dan sebelum node bergantung padanya selesai).
Mungkin juga tidak ada cara untuk menyortir grafik secara topografi - ini terjadi ketika ada siklus dalam grafik (Anda tidak punya kayu, untuk mendapatkan kayu Anda perlu memotong pohon, memotong pohon Anda perlu kapak, untuk membuat kapak Anda butuh kayu). Dalam kasus seperti itu, algoritma mungkin harus menunjukkan kepada pemain bahwa tugas-tugas ini tidak dapat dilakukan.
Anda juga dapat menambahkan prioritas ke node, dan tugasnya mungkin untuk menemukan pemesanan tersebut, di antara semua pemesanan yang memenuhi dependensi, yang memiliki prioritas lebih besar node dilakukan terlebih dahulu.
Anda juga dapat menambahkan tugas recuring - cara termudah mungkin adalah dengan menambahkan tugas dengan timeout lagi ke grafik setiap kali selesai.
Sekarang bagaimana mengatasinya - http://en.wikipedia.org/wiki/Topological_sorting
sumber