State Machines: State Object versus check berurutan: apa pro / kontra?

8

Saya tidak tahu banyak tentang mesin negara hingga dalam AI atau perilaku permainan lainnya dalam game, kecuali tutorial singkat ini dengan Miner: http://www.ai-junkie.com/architecture/state_driven/tut_state1.html yang berorientasi objek.

Saya tidak benar-benar tahu apakah tutorial ini menggambarkan pola Negara atau tidak, bagaimana menurut Anda?

Saya tidak berbicara tentang hal-hal lain yang lebih berorientasi aritmatika seperti kemudi atau fisika atau pencarian jalur atau tabrakan, melainkan tentang logika game, AI yang dikendalikan oleh negara, dan hal-hal yang melibatkan banyak keadaan simultan dan ifs dan / atau switches

Apa pro / kontra dari menggunakan Pola Negara atau pemeriksaan berurutan dari struktur keadaan biasa seperti ini:

struct States
{
bool is_walking, is_running, holds_a_weapon, is_crouch;
int weapon_id, int id_team;
};

void HandleStates (States state)
{
//etc
}
jokoon
sumber
2
Saya pikir Anda mungkin perlu membentuk pertanyaan Anda sedikit lebih baik, tetapi jawaban cepat di atas sehingga Anda dapat melakukannya secara umum negara menghapus cek Jika. beralih (status) {case blah} untuk membuat tabel lompatan, atau cara favorit pribadi saya dalam melakukan sesuatu, fungsi pointer atau delegasi pada tumpukan atau antrian jika AI harus kembali ke apa yang mereka lakukan sebelumnya atau pindah ke hal berikutnya. ..
James

Jawaban:

10

Saya akan mencoba menjawab ini sebaik mungkin, tetapi ada beberapa "praktik terbaik" yang saya tidak yakin, tetapi saya akan mencoba menjabarkannya sebersih mungkin.

FSM

Pertama, tutorial Miner adalah dari Programming Game AI dengan Contoh oleh Mat Buckland (yang saya sarankan Anda dapatkan sebagai pengantar AI). Dia menggunakan enum untuk setiap negara, BUKAN struct. Dengan struct dalam contoh Anda, Anda memiliki boolean sebagai negara bagian, sehingga Anda dapat memiliki sejumlah ini pada saat yang sama. Ini mungkin mengarah pada perilaku yang Anda inginkan, tetapi lebih sering daripada tidak dengan FSM (Mesin Negara Hingga) itu mengarah pada perilaku yang tidak diinginkan.

Sebagai contoh:

enum
{
WANDER_AROUND,
ATTACK,
RUN_AWAY,
};

Kedua, itu bukan satu-satunya cara dia menggambarkan keadaan. Cara saya pribadi lebih suka (tergantung pada situasinya) adalah dengan membuat kelas abstrak yang disebut State yang memiliki fungsi Enter (), Exit () dan Update (). Kemudian buat status saya sebagai subclass dari kelas State.

Seperti gambar ini (sebenarnya ada pada halaman 2 tautan itu): teks alternatif

Pola Negara

Menurut pendapat pribadi saya, pola keadaan hanyalah bagian dari desain perangkat lunak di mana perangkat lunak memiliki sejumlah negara. The implementasi adalah ke pengembang. Saya tidak merasa ada perbedaan yang tepat antara menggunakan pernyataan saklar besar atau membuat mesin status lengkap untuk menjalankan semua status Anda seperti yang saya uraikan di atas. Mereka pada dasarnya melakukan hal yang sama. Jadi dalam hal itu, jawaban untuk salah satu pertanyaan Anda adalah ya, saya yakin halaman itu menggambarkan pola keadaan.

Pro kontra

Ada pro dan kontra untuk setiap metode yang Anda gunakan untuk menerapkan desain yang digerakkan oleh negara.

Menggunakan Pernyataan If / Else atau Switch

Pro:

  • Sangat mudah untuk menambah dan memeriksa kondisi negara
  • Dapat dibuat prototipe dengan sangat cepat

Cons:

  • Ketika Anda punya banyak status, itu bisa berubah sangat jelek, sangat cepat.
  • Melacak transisi, efek ketika negara dimasukkan / keluar atau sesuatu yang khusus untuk negara sulit

Menggunakan mesin keadaan berorientasi objek

Pro:

  • Sangat extensible - satu-satunya hal yang perlu Anda lakukan adalah membuat negara baru yang mewarisi kelas Negara abstrak
  • Mudah dirawat - Anda tidak perlu khawatir tentang kode yang tampak seperti spaghetti karena setiap negara bagian berada di kelasnya masing-masing. Anda dapat dengan mudah melihat kondisi yang terkait dengan keadaan itu tanpa mengkhawatirkan status lainnya.
  • Intuitif - Jika Anda mengerjakan proyek tim dengan mesin status semacam ini, akan jauh lebih mudah bagi orang yang membaca kode Anda. Mereka tidak perlu membaca baris demi baris kode hanya untuk sampai ke keadaan tertentu ("Selalu memprogram seolah-olah programmer mempertahankan kode Anda adalah psikopat yang tahu di mana Anda tinggal!" :))

Cons:

  • Slight learning curve - Desain ini mungkin membutuhkan waktu cukup lama untuk membuat kepala Anda benar-benar bulat ketika mengimplementasikannya
  • Jujur saya tidak bisa memikirkan lagi, karena saya lebih suka cara ini, tetapi jika ada yang ingin menambahkannya, cukup komentar dan saya akan menambahkannya.

Saya harap itu menjawab semua pertanyaan Anda. Bahkan, saya baru saja membuka salinan AI Pemrograman Game saya dengan Contoh dan Mat tidak menyebutkan bahwa mesin negara dikenal sebagai "pola desain keadaan". Secara pribadi, saya tidak setuju, tetapi masing-masing miliknya sendiri.

Semoga bermanfaat :)

Ray Dey
sumber
1
+1 ini pada dasarnya menjelaskan bagaimana saya membuat Mesin Negara saya. Ini bekerja dengan baik.
Kyle C
Bisakah Anda berpendapat bahwa ada dampak kinerja dengan pola "state-oriented state machine" - betapapun kecilnya itu?
Noob Saibot
@NoobSaibot Ya, tapi Anda bisa berdebat tentang apa saja. Jika-lain bisa menderita dari prediksi cabang yang buruk, pola negara seperti yang dijelaskan di atas mungkin menderita dari overhead lookup vtable. Keduanya tidak mungkin kecuali Anda memiliki banyak negara. Jadi jawaban sebenarnya untuk pertanyaan Anda adalah "itu tergantung".
Ray Dey