Saya akan memulai RPG teks peramban sederhana, dengan karakter yang dapat (secara pasif) melawan orang lain. Ini melibatkan daftar sekitar 10 keterampilan seperti kekuatan, ketangkasan dan sebagainya, dengan keahlian tambahan untuk senjata yang berbeda.
Apakah ada cara yang lebih baik untuk merancang kelas karakter ini daripada hanya memiliki keterampilan itu sebagai atribut kelas? Tampaknya mudah, tapi saya enggan karena kecanggungan.
class Char(self):
int strength
int dexterity
int agility
...
int weaponless
int dagger
...
architecture
oop
Sven
sumber
sumber
Charactor
kelas?Jawaban:
Selama Anda menjaga sistem Anda relatif sederhana, ini akan berhasil. Tetapi ketika Anda menambahkan hal-hal seperti pengubah keterampilan sementara, Anda akan segera melihat banyak kode duplikat. Anda juga akan mengalami masalah dengan senjata yang berbeda menggunakan keahlian yang berbeda. Karena setiap keterampilan adalah variabel yang berbeda, Anda harus menulis kode yang berbeda untuk setiap jenis keterampilan yang pada dasarnya melakukan hal yang sama (atau menggunakan beberapa retasan jelek - dengan syarat bahasa pemrograman Anda mendukungnya).
Untuk alasan itu saya akan merekomendasikan Anda untuk menyimpan keterampilan dan keahlian dalam struktur data asosiatif yang memetakan konstanta keterampilan ke nilai. Cara melakukannya berbeda dari bahasa pemrograman ke bahasa pemrograman. Ketika bahasa Anda mendukungnya, konstanta harus dalam
enum
.Untuk memberi Anda contoh bagaimana ini akan bekerja dalam prakteknya, kode Anda untuk menghitung kerusakan serangan akan terlihat seperti ini:
sumber
getSkill()
bertentangan dengan prinsip dasar pemrograman berorientasi objek .Mengapa tidak menggunakan array terkait ?, ini memberi manfaat menjadi mudah diperluas (menggunakan PHP misalnya)
untuk hal-hal seperti senjata, Anda mungkin ingin membuat beberapa kelas dasar
Senjata -> MeleeWeapon, RangedWeapon
dan kemudian buat senjata Anda dari sana.
Hasil akhir yang ingin saya tuju adalah kelas yang terlihat seperti ini
Anda bisa menyimpan semuanya dalam sebuah array jika Anda benar-benar menginginkannya.
sumber
Saya akan mencoba menjawab pertanyaan ini dengan cara yang paling OOP (atau setidaknya apa yang saya pikirkan). Ini mungkin sepenuhnya berlebihan, tergantung pada evolusi yang Anda lihat tentang statistik.
Anda bisa membayangkan kelas SkillSet (atau Stats ) (saya menggunakan sintaks mirip C untuk jawaban ini):
Kemudian pahlawan akan memiliki bidang intrinsikStats dari jenis SkillSet. Senjata bisa memiliki skill pengubah. Atur juga.
Ini tentu saja contoh untuk memberi Anda ide. Anda juga dapat mempertimbangkan menggunakan pola desain Penghias, sehingga pengubah pada statistik berfungsi sebagai "filter" yang diterapkan satu demi satu ...
sumber
Cara paling OOP dalam melakukan sesuatu mungkin akan melakukan sesuatu dengan warisan. Kelas dasar Anda (atau kelas super tergantung pada bahasa) adalah orang, maka mungkin penjahat dan pahlawan mewarisi dari kelas dasar. Maka pahlawan berbasis kekuatan Anda dan pahlawan berbasis penerbangan akan bercabang karena moda transportasi mereka berbeda, misalnya. Ini memiliki bonus tambahan bahwa pemain komputer Anda dapat memiliki kelas dasar yang sama dengan pemain manusia dan diharapkan akan menyederhanakan hidup Anda.
Hal lain mengenai atribut, dan ini kurang spesifik OOP adalah untuk mewakili atribut karakter Anda sebagai daftar sehingga Anda tidak harus memiliki semuanya didefinisikan secara eksplisit dalam kode Anda. Jadi mungkin Anda akan memiliki daftar senjata dan daftar atribut fisik. Buat semacam kelas dasar untuk atribut ini sehingga mereka dapat berinteraksi, sehingga masing-masing didefinisikan dalam hal kerusakan, biaya energi, dll. Jadi ketika dua individu berkumpul bersama, itu relatif jelas bagaimana interaksi akan terjadi. Anda akan mengulangi daftar atribut setiap karakter dan menghitung kerusakan yang satu lakukan terhadap yang lain dengan tingkat probabilitas dalam setiap interaksi.
Menggunakan daftar akan membantu Anda menghindari penulisan ulang banyak kode karena untuk menambahkan karakter dengan atribut yang belum Anda pikirkan, Anda hanya perlu memastikannya memiliki interaksi yang bekerja dengan sistem Anda yang ada.
sumber
Saya akan merekomendasikan manajer tipe stat, diisi dari datafile (misalnya saya menggunakan XML) dan objek Stat, dengan tipe dan nilai yang disimpan dalam karakter insatnce sebagai hashtable, dengan tipe unik ID ID sebagai kuncinya.
Edit: Kode psudo
sumber
StatType
kelas dalam yang tidak perlu, hanya menggunakanname
satuStatType
sebagai kunci. Seperti yang dilakukan #Grimston. Sama denganStats
.Ι akan mencoba memberi Anda contoh tentang bagaimana Anda dapat merancang gudang senjata dan gudang senjata Anda.
Tujuan kami adalah untuk memisahkan entitas, oleh karena itu senjata harus menjadi antarmuka.
Menganggap bahwa setiap pemain hanya dapat memiliki satu senjata, kita dapat menggunakan
Strategy pattern
untuk mengubah senjata dengan mudah.Pola lain yang bermanfaat adalah Pola Objek Null jika pemain tidak bersenjata.
Sedangkan untuk gudang senjata, kita bisa memakai beberapa peralatan pertahanan.
Untuk decoupling, saya membuat antarmuka untuk bek.
Dan
Player
kelasnya.Mari kita tambahkan beberapa gameplay.
Voila!
sumber