Saya mencoba untuk menulis "permainan" singkat di mana seorang pemain berkeliling dan bertarung dengan monster, tetapi saya tidak tahu bagaimana menangani pertempuran.
Sebagai contoh, katakan saya memiliki "Prajurit" dan "Troll". Bagaimana keduanya saling bertarung? Saya tahu saya bisa melakukan sesuatu seperti
Conan = Warrior.new();
CaveTroll = Troll.new();
Conan.attack(CaveTroll);
CaveTroll.attack(Conan);
Tapi bagian mana dari permainan yang mengendalikan monster? Apakah saya hanya menempel urutan di atas dalam satu lingkaran sampai salah satu dari mereka mati? Atau apakah "mesin" game perlu memiliki bagian yang berhubungan dengan pertempuran? Atau apakah ini merupakan aspek kecerdasan buatan Troll yang perlu dijaga tindakannya?
Juga, siapa / apa yang menentukan tindakan yang dilakukan monster itu? Mungkin Troll bisa memukul, menendang, menggigit, merapal mantra, minum ramuan, menggunakan benda ajaib. Apakah mesin permainan menentukan tindakan apa yang diambil Troll atau apakah itu sesuatu yang dikelola kelas Troll?
Maaf saya tidak bisa lebih spesifik tapi saya butuh panduan tentang ke mana harus pergi dengan ini.
Jawaban:
Saya membayangkan urutan pertempuran sebagai minigame dalam gim Anda. Kutu pembaruan (atau tik tik) diarahkan ke komponen yang menangani peristiwa ini. Pendekatan ini merangkum logika urutan pertempuran di kelas yang terpisah, membuat loop game utama Anda bebas untuk transisi di antara status game.
Kelas urutan pertempuran akan terlihat seperti ini:
Troll dan Warrior Anda sama-sama mewarisi dari superclass umum yang disebut Entity. Di dalam HandleTurn, entitas yang menyerang diizinkan untuk bergerak. Ini setara dengan rutinitas berpikir AI.
Metode pertarungan memutuskan apa yang akan dilakukan entitas. Perhatikan bahwa ini tidak perlu melibatkan entitas lawan, seperti minum ramuan atau melarikan diri.
Pembaruan: Untuk mendukung banyak monster dan pesta pemain, Anda memperkenalkan kelas Grup:
Kelas Grup akan menggantikan semua kejadian Entitas di kelas BattleSequence. Memilih dan menyerang akan ditangani oleh kelas Entity itu sendiri, sehingga AI dapat mempertimbangkan seluruh kelompok saat memilih tindakan terbaik.
sumber
Saya akan memiliki objek Combat khusus yang mengelola pertempuran. Itu merangkum keadaan pertempuran penuh termasuk hal-hal seperti daftar karakter pemain, daftar musuh, giliran saat ini, medan pertempuran, dan sebagainya. Combat kemudian dapat memiliki metode pembaruan yang mengelola logika pertempuran. Itu bukan ide yang baik untuk hanya meletakkan kode pertempuran dalam satu loop sederhana, karena itu akan berakhir sangat cepat. Biasanya Anda akan memiliki waktu dan tahapan pertempuran yang berbeda.
Untuk tindakan yang dilakukan, Anda tentu saja dapat membuatnya secara acak, tetapi tidak masuk akal jika monster dengan HP penuh menggunakan mantra penyembuhan. Membayar untuk memiliki beberapa logika dasar untuk menentukan tindakan yang harus diambil. Misalnya, beberapa tindakan dapat memiliki prioritas lebih dari yang lain (misalnya troll menendang 30% dari waktu), serta kondisi lain untuk membuat pertempuran lebih menarik (misalnya ketika troll HP kurang dari 10% dari HP penuh, ada 20% kesempatan casting mantra penyembuhan, jika tidak kesempatan 1%). Ini bisa serumit yang Anda suka.
Saya pikir kelas monster harus menangani memilih tindakan apa yang akan dibuat, objek pertempuran meminta monster untuk tindakan dan monster membuat pilihan dan kemudian mulai menerapkannya. Satu ide adalah memiliki objek strategi yang Anda tancapkan ke monster dan yang memilih dari daftar kemungkinan tindakan monster berdasarkan prioritas, kategori, dan kondisi yang ditetapkan untuk setiap aksi pertempuran. Maka Anda dapat memiliki kelas OffensiveStrategy misalnya yang memprioritaskan serangan terhadap keterampilan defensif, dan CautiousStrategy lain yang lebih mungkin untuk sembuh. Seorang bos mungkin dapat secara dinamis mengubah strategi berdasarkan kondisi saat ini.
Satu hal terakhir. Anda mungkin ingin memiliki karakter pemain dan monster yang diwarisi dari kelas yang sama, menjadi instance dari kelas yang sama (misalnya aktor atau petarung), atau berbagi objek umum yang merangkum fungsi umum. Ini mengurangi duplikasi kode dan itu juga memungkinkan Anda untuk memiliki NPC yang dikendalikan AI di sisi Anda yang dapat menerapkan strategi yang sama dengan yang sudah Anda kodekan untuk monster.
sumber
Ya, Anda perlu memiliki bagian khusus di mesin Anda yang menangani pertempuran.
Saya tidak tahu bagaimana tepatnya Anda melakukan pertempuran Anda, tetapi saya akan menganggap para pemain berkeliaran di dunia permainan, bertemu dengan monster dan pertempuran berlangsung secara real time. Jika demikian maka, troll perlu mengetahui sekitarnya dalam area tertentu, mungkin menentukan seberapa jauh troll dapat melihat sesuatu di depannya (troll menangani ini).
Tentang AI, saya pikir mesin perlu menanganinya sendiri, jadi katakanlah Anda memiliki lebih dari satu jenis musuh yang dapat melakukan hal yang sama (gigitan), Anda bisa menugaskan AI ke monster lain dan begitulah!
sumber
Pemain Anda dan troll Anda hanyalah kumpulan data, yang kami sebut Model data yang menggambarkan dunia Anda. Kehidupan, inventaris, kemampuan serangan, bahkan pengetahuan mereka tentang dunia - semua terdiri dari model data.
Simpan satu objek Model utama yang menyimpan semua data yang menggambarkan dunia Anda. Ini akan menyimpan informasi dunia umum seperti kesulitan, parameter fisika dll. Ia juga akan menyimpan daftar / array data entitas tertentu seperti yang telah saya jelaskan di atas. Model utama ini dapat terdiri dari banyak sub-objek untuk menggambarkan dunia Anda. Tidak ada dalam model Anda jika Anda memiliki fungsi yang mengontrol logika game atau logika tampilan; getter adalah satu-satunya pengecualian, dan akan digunakan hanya untuk memungkinkan Anda mendapatkan data dari model lebih mudah (jika anggota publik belum melakukan triknya).
Selanjutnya, buat fungsi di satu atau lebih kelas "controller"; Anda dapat menulis semuanya sebagai fungsi pembantu di kelas utama Anda, meskipun ini mungkin menjadi agak besar setelah beberapa saat. Ini akan disebut setiap pembaruan untuk bertindak berdasarkan data entitas untuk tujuan yang berbeda (pergerakan, serangan, dll.). Menjaga fungsi-fungsi ini di luar kelas entitas lebih efisien sumber daya, dan begitu Anda tahu apa yang mendeskripsikan entitas Anda, Anda akan secara otomatis tahu fungsi apa yang perlu ditindaklanjuti.
Catatan terakhir adalah bahwa berguna juga untuk menjaga logika tampilan Anda terpisah dari logika game Anda. Logika tampilan adalah, "Di mana saya menggambar ini di layar dan dalam warna apa?" vs logika permainan menjadi apa yang telah saya uraikan dalam pseudcode di atas.
(Catatan Dev: Saat menggunakan kelas, ini secara longgar mengikuti pendekatan pemrograman fungsional yang menganggap semua metode sebagai stateless stateless, memungkinkan untuk model data bersih dan pendekatan pemrosesan yang meminimalkan bug yang disebabkan oleh keadaan yang dipertahankan. FP adalah MVC utama, karena mencapai MVC's Tujuan dari pemisahan masalah secara eksplisit. Lihat pertanyaan ini .)
sumber