Pola desain apa yang dapat digunakan untuk membuat sistem aturan / validasi untuk permainan seperti catur (ini hanyalah contoh sederhana, permainan yang sebenarnya membutuhkan perangkat aturan yang lebih sulit)
Saya telah membaca beberapa pertanyaan di situs ini dan belum menemukan jawaban konklusif atau jawaban yang menunjukkan saya ke arah yang benar.
Sistem ini akan membutuhkan yang berikut:
- Setiap objek yang memiliki aturan yang diterapkan padanya harus mengimplementasikan antarmuka spesifik dengan metode yang merupakan titik awal untuk validasi
- Aturan harus diterapkan dalam 2 langkah: pertama, perlu divalidasi (dapat menggadaikan A pindah ke kuadrat D4), jika benar maka jalankan metode A jika salah maka jalankan metode B
- Setiap objek dapat memiliki beberapa aturan yang perlu diterapkan dalam urutan tertentu. Ketika aturan 1 selesai, aturan 2 kemudian harus mulai memvalidasi dll
- Setiap aturan yang terpisah (misalnya: hanya bisa bergerak 1 persegi, hanya bisa bergerak secara diagonal dll) harus di kelasnya sendiri dan harus dapat digunakan kembali dan diterapkan pada objek yang membutuhkan aturan.
- Perhatikan ini akan digunakan dalam game multipemain di backend
- Perhatikan bahwa setiap aturan memerlukan beberapa objek untuk menguji validitasnya, misalnya, biasanya pion dapat bergerak 1 persegi, sekarang sqaure berikutnya pada gameboard diisi oleh pion lawan Anda. Hasil: pion Anda tidak bisa bergerak. Pion harus menyertakan posisi pion lain, atau gameboard dalam validasinya.
Kata lain untuk aturan ini adalah batasan perilaku.
game-design
design-patterns
Thomas
sumber
sumber
Jawaban:
Pikirkan permainan sebagai urutan negara , dipisahkan oleh gerakan . Setiap kali pemain bergerak, status baru dihasilkan.
(Ini seperti komik XKCD ini !)
Bagaimana
Buat kelas
Move
, yang mewakili satu gerakan yang dilakukan oleh satu pemain . (Dalam Reversi, deskripsi yang cukup adalah satu set koordinat papan tempat sepotong harus ditempatkan. Dalam Catur, koordinat asal dan tujuan sudah cukup.)Buat kelas
GameState
, yang mewakili kondisi permainan pada satu waktu . (Dalam Reversi, deskripsi yang cukup adalah isi papan dan giliran pemain mana. Di Catur, Anda juga perlu menyimpan apakah masih memungkinkan bagi setiap pemain untuk bermain kingside atau queenside.)Sekarang, Anda mungkin dapat membayangkan
GameState
memiliki suatuisMoveLegal(Move)
metode. Bagaimanapun, ini berisi semua informasi yang diperlukan untuk membuat keputusan itu.Mengapa
Desain ini dengan bersih mengisolasi logika aturan, mengurangi ketergantungan antar-komponen.
Itu juga membuat AI mudah! Anda dapat dengan mudah menghasilkan semua gerakan yang mungkin dari
GameState
, memeriksa apakah itu legal, menghasilkan lebih banyakGameState
dari itu dan pada dasarnya membangun pohon yang dapat Anda gunakan untuk minimax , mungkin dengan pemangkasan alpha-beta .sumber