Saya seorang programmer yang tidak berpengalaman membuat game "seperti roguelike" di nada FTL , menggunakan Python (tidak ada PyGame sampai sekarang karena saya masih hanya peduli dengan teks).
Gim saya akan berisi sejumlah besar senjata (sekitar 50 sebagai permulaan) yang menghasilkan kemampuan unik. Saya berjuang untuk memahami bagaimana menyusun kode objek dengan cara yang sangat kuat (dalam hal memungkinkan senjata untuk memiliki efek yang sangat berbeda) dan dapat dikembangkan (sehingga saya dapat dengan mudah menambahkan lebih banyak senjata nanti dengan mis. Menjatuhkan mereka ke dalam folder ).
Naluri pertamaku adalah memiliki kelas BasicWeapon, dan memiliki berbagai senjata yang diturunkan dari kelas itu. Namun, ini tampaknya bermasalah bagi saya: apakah saya harus membuat kelas BasicWeapon begitu barebones sehingga pada dasarnya tidak berguna (satu-satunya fitur yang dimiliki semua senjata adalah nama dan tipe (pistol, kapak, dll)), atau saya harus memprediksi setiap efek unik yang pernah saya buat dan kode itu ke BasicWeapon.
Yang terakhir jelas tidak mungkin, tetapi yang pertama masih bisa dikerjakan. Namun, itu membuat saya pertanyaan: di mana saya meletakkan kode untuk senjata individu?
Apakah saya membuat plasmarifle.py, rocketlauncher.py, swarmofbees.py, dll dll, dan meletakkan semuanya ke dalam folder dari mana game dapat mengimpornya?
Atau apakah ada cara untuk memiliki file gaya database (mungkin sesuatu yang sederhana seperti spreadsheet Excel) yang entah bagaimana berisi kode unik untuk setiap senjata - tanpa perlu menggunakan eval / exec?
Dalam hal solusi terakhir (database), saya pikir masalah mendasar yang saya perjuangkan adalah bahwa sementara saya mengerti bahwa diinginkan untuk menjaga pemisahan antara kode dan data, saya merasa seperti senjata mengaburkan garis antara "kode" dan "data" sedikit; mereka mewakili berbagai macam hal serupa yang dapat ditemukan dalam permainan, dalam arti mereka seperti data, tetapi kebanyakan dari mereka akan memerlukan setidaknya beberapa kode unik yang tidak dibagi dengan item lain, di mana dalam arti mereka, secara alami, kode.
Solusi parsial yang saya temukan di tempat lain di situs ini menyarankan untuk memberikan kelas BasicWeapon banyak metode kosong - on_round_start (), on_attack (), on_move () dll - dan kemudian mengganti metode tersebut untuk setiap senjata. Pada fase yang relevan dari siklus pertempuran, gim akan memanggil metode yang tepat untuk senjata setiap karakter, dan hanya yang memiliki metode yang ditentukan yang benar-benar akan melakukan sesuatu. Ini membantu, tetapi masih tidak memberi tahu saya di mana saya harus meletakkan kode dan / atau data untuk setiap senjata.
Apakah ada bahasa atau alat yang berbeda di luar sana yang dapat saya gunakan sebagai semacam setengah-data, setengah kode chimera? Apakah saya benar-benar membantai praktik pemrograman yang baik?
Pemahaman saya tentang OOP kurang lengkap, jadi saya akan menghargai tanggapan yang tidak terlalu ilmu komputer-y.
EDIT: Vaughan Hilts telah menjelaskan di posnya di bawah ini bahwa apa yang saya bicarakan pada dasarnya adalah pemrograman berbasis data. Inti dari pertanyaan saya adalah ini: bagaimana saya bisa menerapkan desain berbasis data sedemikian rupa sehingga data dapat berisi skrip, memungkinkan senjata baru untuk melakukan hal-hal baru tanpa mengubah kode program utama?
sumber
Jawaban:
Anda ingin pendekatan berbasis data hampir pasti kecuali permainan Anda benar-benar tidak diharapkan dan / atau prosedural dihasilkan ke inti.
Pada dasarnya, ini melibatkan penyimpanan informasi tentang senjata Anda dalam bahasa markup atau format file pilihan Anda. XML dan JSON keduanya adalah pilihan yang baik dan mudah dibaca yang dapat digunakan untuk membuat pengeditan cukup sederhana tanpa perlu editor yang rumit jika Anda hanya mencoba untuk memulai dengan cepat. ( Dan Python dapat mem-parsing XML dengan sangat mudah juga! ) Anda akan menetapkan atribut seperti 'power', 'defense', 'cost', dan 'stats' yang semuanya relevan. Cara Anda menyusun data akan terserah Anda.
Jika senjata perlu menambahkan efek status, berikan simpul efek Status, dan kemudian tentukan efek efek status melalui objek lain yang digerakkan oleh data. Ini akan membuat kode Anda kurang bergantung pada game tertentu dan membuat pengeditan dan pengujian sepele game Anda. Tidak harus mengkompilasi ulang setiap saat adalah bonus juga.
Bacaan tambahan tersedia di bawah ini:
sumber
(Saya minta maaf untuk mengirimkan jawaban alih-alih komentar, tetapi saya belum memiliki perwakilan.)
Jawaban Vaughan sangat bagus, tetapi saya ingin menambahkan dua sen saya.
Salah satu alasan utama Anda ingin menggunakan XML atau JSON dan menguraikannya dalam runtime adalah untuk mengubah dan bereksperimen dengan nilai-nilai baru tanpa harus mengkompilasi ulang kode. Karena Python ditafsirkan dan, menurut pendapat saya, cukup mudah dibaca, Anda dapat memiliki data mentah dalam file dengan kamus dan semua yang diatur:
Dengan cara ini Anda hanya mengimpor file / modul dan menggunakannya sebagai kamus normal.
Jika Anda ingin menambahkan skrip, Anda dapat memanfaatkan sifat dinamis fungsi Python dan kelas 1. Anda dapat melakukan sesuatu seperti ini:
Meskipun saya percaya itu akan bertentangan dengan desain data-driven. Untuk menjadi 100% DDD Anda akan memiliki informasi (data) yang menentukan fungsi dan kode apa yang akan digunakan senjata tertentu. Dengan cara ini Anda tidak merusak DDD, karena Anda tidak mencampur data dengan fungsionalitas.
sumber
Desain Berbasis Data
Saya mengirimkan sesuatu seperti pertanyaan ini ke tinjauan kode baru-baru ini.
Setelah beberapa saran dan peningkatan, hasilnya adalah kode sederhana yang memungkinkan fleksibilitas relatif pada pembuatan senjata berdasarkan kamus (atau JSON). Data ditafsirkan pada saat runtime dan verifikasi sederhana dilakukan oleh
Weapon
kelas itu sendiri, tanpa perlu bergantung pada seluruh juru bahasa skrip.Desain Berbasis Data, meskipun Python menjadi bahasa yang ditafsirkan (baik sumber dan file data dapat diedit tanpa perlu mengkompilasi ulang), terdengar seperti hal yang benar untuk dilakukan dalam kasus-kasus seperti yang Anda sajikan. Pertanyaan ini menjelaskan lebih lanjut tentang konsep, pro dan kontra. Juga ada presentasi yang bagus tentang Universitas Cornell tentang hal itu.
Dibandingkan dengan bahasa lain, seperti C ++, yang mungkin akan menggunakan bahasa scripting (seperti LUA) untuk menangani data x interaksi mesin dan skrip pada umumnya, dan format data tertentu (seperti XML) untuk menyimpan data, Python sebenarnya bisa melakukan itu semua dengan sendirinya (mengingat standar
dict
tetapi jugaweakref
, yang terakhir khusus untuk pemuatan sumber daya dan caching).Namun, pengembang independen mungkin tidak menggunakan pendekatan berbasis data secara ekstrim seperti yang disarankan pada artikel ini :
Mungkin, dengan Python, orang dapat mengambil manfaat dari pendekatan berorientasi objek dan data-driven, yang bertujuan untuk produktivitas dan ekstensibilitas.
Pemrosesan sampel sederhana
Dalam kasus khusus yang dibahas pada tinjauan kode, kamus akan menyimpan "atribut statis" dan logika yang akan ditafsirkan - jika senjata memiliki perilaku kondisional.
Pada contoh di bawah pedang harus memiliki beberapa kemampuan dan statistik di tangan karakter kelas 'antipaladin', dan tidak ada efek, dengan statistik lebih rendah ketika digunakan oleh karakter lain):
Untuk tujuan pengujian, saya membuat kelas
Player
dan sederhanaWeapon
: yang pertama memegang / melengkapi senjata (dengan demikian memanggil pengaturan on_equip kondisional) dan yang terakhir sebagai kelas tunggal yang akan mengambil data dari kamus, berdasarkan pada nama item yang dilewatkan sebagai argumen selamaWeapon
inisialisasi. Mereka tidak mencerminkan desain kelas game yang tepat, tetapi masih bisa berguna untuk menguji data:Dengan beberapa perbaikan di masa depan saya berharap bahwa ini bahkan akan memungkinkan saya untuk memiliki sistem kerajinan dinamis suatu hari nanti, memproses komponen senjata daripada seluruh senjata ...
Uji
Seperti ini:
Itu harus mencetak:
Untuk seorang bard
Untuk antipaladin
sumber