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 Room
objek. Masing-masing Room
memiliki daftar Entity
benda yang ada di ruangan itu. Masing-masing Entity
memiliki keadaan peristiwa, yang merupakan peta string-> boolean sederhana, dan daftar tindakan, yang merupakan peta fungsi string->.
Input pengguna berupa [action] [entity]
. The Room
menggunakan nama entitas untuk mengembalikan sesuai Entity
objek, yang kemudian menggunakan nama tindakan untuk menemukan fungsi yang benar, dan mengeksekusinya.
Untuk menghasilkan deskripsi kamar, setiap Room
objek menampilkan string deskripsi sendiri, lalu menambahkan string deskripsi masing-masing Entity
. The Entity
deskripsi 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 Entity
sub-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?