Saya menghibur diri belakangan ini dengan memprogram game petualangan berbasis teks yang sederhana, dan saya terjebak pada apa yang tampaknya seperti masalah desain yang sangat sederhana.
Untuk memberikan gambaran singkat: permainan dipecah menjadi Roomobjek. Masing-masing Roommemiliki daftar Entitybenda yang ada di ruangan itu. Masing-masing Entitymemiliki keadaan peristiwa, yang merupakan peta string-> boolean sederhana, dan daftar tindakan, yang merupakan peta fungsi string->.
Input pengguna berupa [action] [entity]. The Roommenggunakan nama entitas untuk mengembalikan sesuai Entityobjek, yang kemudian menggunakan nama tindakan untuk menemukan fungsi yang benar, dan mengeksekusinya.
Untuk menghasilkan deskripsi kamar, setiap Roomobjek menampilkan string deskripsi sendiri, lalu menambahkan string deskripsi masing-masing Entity. The Entitydeskripsi dapat berubah berdasarkan keadaan ( "Pintu terbuka", "Pintu tertutup", "Pintu terkunci", dll).
Inilah masalahnya: menggunakan metode ini, jumlah fungsi deskripsi dan tindakan yang perlu saya implementasikan dengan cepat menjadi tidak terkendali. Ruang awal saya sendiri memiliki sekitar 20 fungsi antara 5 entitas.
Saya bisa menggabungkan semua tindakan menjadi satu fungsi dan jika-ada / beralih melalui mereka, tapi itu masih dua fungsi per entitas. Saya juga dapat membuat Entitysub-kelas spesifik untuk objek umum / umum seperti pintu dan kunci, tetapi itu hanya membuat saya sejauh ini.
EDIT 1: Seperti yang diminta, contoh pseudo-code dari fungsi aksi ini.
string outsideDungeonBushesSearch(currentRoom, thisEntity, player)
if thisEntity["is_searched"] then
return "There was nothing more in the bushes."
else
thisEntity["is_searched"] := true
currentRoom.setEntity("dungeonDoorKey")
return "You found a key in the bushes."
end if
string dungeonDoorKeyUse(currentRoom, thisEntity, player)
if getEntity("outsideDungeonDoor")["is_locked"] then
getEntity("outsideDungeonDoor")["is_locked"] := false
return "You unlocked the door."
else
return "The door is already unlocked."
end if
Fungsi deskripsi bekerja dengan cara yang hampir sama, memeriksa status dan mengembalikan string yang sesuai.
EDIT 2: Merevisi kata-kata saya. Asumsikan bahwa mungkin ada sejumlah besar objek dalam game yang tidak berbagi perilaku umum (respons berbasis negara untuk tindakan tertentu) dengan objek lain. Apakah ada cara saya dapat mendefinisikan perilaku unik ini dengan cara yang lebih bersih dan lebih dapat dipertahankan daripada menulis fungsi khusus untuk setiap tindakan entitas tertentu?