Bagaimana cara saya memodelkan game berbasis ekonomi dalam kode?

10

Saya ingin membuat permainan ekonomi berdasarkan peradaban kuno. Saya tidak yakin bagaimana mendesainnya. Jika saya mengerjakan game yang lebih kecil, seperti salinan "Space Invaders," saya tidak akan kesulitan menyusunnya seperti ini:

  • Kelas Kontrol Utama
  • Kelas Grafik
  • Kelas Pemain
  • Kelas musuh

Saya tidak mengerti bagaimana saya melakukan ini untuk proyek yang lebih besar seperti permainan ekonomi saya. Apakah saya membuat kelas negara yang berisi banyak kota? Apakah kota-kota berisi banyak kelas bangunan, sebagian besar berisi kelas orang? Apakah saya membuat jalur menemukan kelas yang dapat diakses pemain untuk berkeliling?

Matius G.
sumber
3
Anda mungkin ingin menggunakan beberapa bentuk Entitas-Komponen-Sistem (inilah referensi kanonik ) - tidak membuat entitas menggambar sendiri sama sekali (terutama jika Anda memiliki banyak dari mereka).
ThorinII
9
Anda akan sangat terkejut melihat betapa mengerikan, tidak teratur, dan diretas-bersama sebagian besar game "besar". Mereka dibangun di sekitar tenggat waktu dan tonggak. Hanya menulis game dan struktur apa pun yang jatuh dari apa yang Anda butuhkan untuk menulis akan menjadi sama baiknya jika tidak lebih baik daripada sebagian besar game AAA di luar sana.
Sean Middleditch
Bahkan jika Anda tidak menjalankan ECS dengan penuh semangat, masih bagus untuk tidak menduplikasi kode, biarkan pengontrol mengulangi entitas dan memanggil renderer, atau bahkan membiarkan renderer memindai. Membuat pembaruan kode kecil di 100 tempat adalah hal yang menyebalkan.
MickLH
1
Melompat dari Space Invaders ke gim yang rumit seperti yang Anda gambarkan agak drastis, menurut saya. Ada lebih banyak langkah pembelajaran antara kedua game ini, sebelum Anda masuk ke proyek game besar. Pertimbangkan untuk membangun platform sidescroller 2D dan tingkatkan kompleksitas game Anda secara bertahap. Perpindahan dari gigi pertama ke gigi kelima dapat membawa Anda hingga 120 km / jam, tetapi tidak dengan efisiensi yang sama (waktu / upaya) jika Anda bergerak dari level ke level.
Emir Lima
2
Anda tampaknya memiliki dua pertanyaan di sini, dan saya tidak bisa mengatakan mana yang lebih penting bagi Anda. Yang pertama adalah tentang bagaimana menghindari banyak referensi ke objek, dan yang kedua adalah tentang bagaimana Anda harus mendekati pemetaan entitas logis dalam game Anda ke dalam kelas-kelas dalam kode. Pertanyaan-pertanyaan itu memiliki jawaban yang berbeda, dan saya pikir Anda harus mengirim pertanyaan yang berbeda untuk mereka. Saya akan mengedit bagian "menghindari referensi yang lewat". Jangan ragu untuk memposting ulang (dan pertimbangkan mencari di situs ini untuk topik tentang "menghindari lajang dan global," karena jawabannya sangat mirip).

Jawaban:

5

Apakah saya membuat kelas negara yang berisi banyak kota?

Tentu.

Apakah kota-kota berisi banyak kelas bangunan, sebagian besar berisi kelas orang?

Tentu.

Apakah saya membuat jalur menemukan kelas yang dapat diakses pemain untuk berkeliling?

Tentu.

Segala sesuatu yang Anda sarankan di atas tampaknya masuk akal. Ini mungkin bukan cara terbaik bagi Anda dalam jangka panjang, tapi itu tidak masalah. Ini jelas masuk akal bagi Anda karena model organisasi yang pertama kali datang kepada Anda. Sangat penting bagi Anda untuk mengambilnya dan memulai implementasi darinya. Ini akan membantu Anda memulai, membantu Anda mengatasi "kelumpuhan desain" awal ini yang sering menjangkiti pengembang di awal tugas, dan (jika terbukti cacat dalam beberapa cara) mengajari Anda satu atau dua hal tentang pro dan kontra dari pendekatan khusus untuk desain.

Anda secara alami telah mengambil konsep di kepala Anda dan mengelompokkannya ke dalam kode sesuai dengan beberapa aturan sederhana:

  • Apakah konsep ini berbeda secara signifikan dalam perilaku atau dalam data dari objek lain yang sudah saya miliki? (Negara dan orang-orang berbagi sangat sedikit, jika ada, data atau perilaku yang berarti, sehingga mereka harus diwakili oleh tipe-tipe berbeda dalam game).
  • Akankah saya perlu memanipulasi konsep ini dalam kode dengan cara yang signifikan (jika game Anda berurusan dengan orang secara individu, Anda mungkin memerlukan Personkelas itu, tetapi jika game hanya peduli tentang mereka secara agregat, seperti dalam versi SimCity sebelumnya, Anda mungkin tidak memerlukan tipe atau instance dari tipe itu untuk membuat pemetaan 1: 1 populasi kota ( int populationCountmungkin cukup).
  • Apakah konsep ini membutuhkan keadaan ? Jika demikian itu harus diringkas entah bagaimana yang memungkinkan saya untuk menyimpan keadaan ini (kelas) daripada banyak fungsi gratis. (Implementasi pathfinding tidak memiliki objek dunia nyata yang analog, tetapi membutuhkan pelacakan data seperti node mana dalam peta yang telah dipertimbangkan, dan yang lebih baik dilakukan melalui kelas daripada dengan menyimpannya dalam banyak) global tersembunyi dan membuat fungsi berdiri bebas).

Meskipun sederhana, menjawab pertanyaan-pertanyaan itu dapat memberi Anda banyak manfaat ketika mencoba memutuskan apakah dan bagaimana mengubah konsep mental menjadi kode sumber. Anda mungkin juga ingin membaca prinsip SOLID dari desain berorientasi objek .

Perhatikan bahwa saran dari sistem entitas / komponen yang dibuat dalam komentar juga merupakan pendekatan yang valid, meskipun saya akan menghindarinya di sini kecuali jika Anda melakukan re-lingkup proyek Anda menjadi lebih kecil (hanya karena mengambil dua tantangan besar baru dalam satu proyek dapat terlalu menakutkan dan dapat mencairkan manfaat pendidikan yang seharusnya Anda terima dari hanya berfokus pada satu). Dalam model berorientasi komponen, "tipe" dalam pertanyaan di atas menjadi lebih implisit: bukan tipe konkret dalam kode, tetapi tipe implisit yang didefinisikan oleh kumpulan komponen yang membentuk suatu entitas. Prinsip panduan yang sama dapat diterapkan.


sumber
1

Apa yang telah Anda gambarkan (kelas untuk setiap jenis utama objek game logis) sangat masuk akal sebagai game sederhana. Jika ini adalah pertama kalinya Anda menulis game jenis ini, saya sarankan melakukannya dengan cara ini.

Hanya beberapa tips:

  • Apakah Pemain benar-benar berbeda dari Musuh ? Banyak fungsi yang cenderung sama, jadi ini biasanya harus kelas yang sama atau diperluas dari kelas dasar yang sama. Pertimbangkan kelas dasar AbstractPlayer dengan dua subkelas HumanPlayer dan AIPlayer - semua fungsi umum dapat digunakan di AbstractPlayer .
  • Lebih suka mengkonfigurasi objek dengan komposisi daripada warisan. Jangan buat hierarki warisan Anda terlalu dalam. Jika Anda mulai memanggil kelas ForgeWithSteelAnvil maka Anda harus khawatir: Sebuah Forge mungkin subkelas Bangunan , tetapi jenis landasan yang digunakan harus objek yang terdapat di dalam gedung.
  • Demikian juga lebih suka properti yang memungkinkan Anda untuk mengkonfigurasi objek daripada menambahkan ratusan kelas objek yang sedikit berbeda.

Dalam permainan yang lebih kompleks, ada teknik yang lebih maju yang dapat Anda gunakan, tetapi saya sarankan tidak menggunakan ini sampai Anda sangat nyaman dengan pendekatan OOP dasar (yaitu berhasil membuat beberapa permainan selesai). Pendekatan yang lebih maju mungkin termasuk:

  • Model objek berbasis prototipe - gunakan kelas tunggal untuk semua objek game, dan model semua objek Anda melalui properti / atribut dan komposisi. Jauh lebih fleksibel / dinamis daripada OOP standar, tetapi lebih sulit untuk dikelola (khususnya, kompiler tidak akan banyak membantu Anda jika Anda melakukan sesuatu yang bodoh). Saya menggunakan ini untuk efek yang baik dalam permainan Roguelike kecil saya Tyrant ( https://github.com/mikera/tyrant )
  • Sistem komponen entitas - bagus jika Anda memiliki banyak perilaku kompleks yang ingin Anda padukan dan cocokkan di berbagai jenis objek game. Sangat kuat, tetapi sulit untuk diperbaiki.
mikera
sumber
0

Ada beberapa metode yang dapat Anda gunakan untuk mendekati mengatur entitas dan set data Anda. Saya lebih suka menulis dokumen spreadsheet dan menguji data bolak-balik untuk memastikan saya efisien. Jika Anda membuat game sendiri ingat bahwa itu perlu masuk akal bagi Anda. Terkadang rute yang paling efisien adalah menjadi sedikit kurang efisien dalam kode untuk membuat proyek lebih sederhana.

Jika Anda ingin mendapat lebih banyak bantuan dalam menyusun konten Anda, cari kode sumber game lama yang menggunakan struktur atau gaya yang sama dan temukan solusinya. Kemudian perbaiki dan perbaiki sesuai keinginan Anda.

Beelzebub
sumber
-1, karena ini sepertinya tidak membahas pengorganisasian kode dan untuk saran untuk menyalin secara membabi buta apa yang dilakukan permainan lain tanpa mendiskusikan cara untuk memahami pengorbanan dari keputusan desain apa pun yang dibuat oleh game.