Son zamanlarda basit bir metin tabanlı macera oyunu programlayarak eğlendim ve çok basit bir tasarım sorunu gibi görünen şeylere takılı kaldım.
Kısa bir bakış vermek için: oyun Room
nesnelere ayrılmıştır . Her Room
birinin Entity
o odada bulunan nesnelerin bir listesi vardır. Her Entity
birinin basit bir string-> boolean haritası olan bir olay durumu ve string-> fonksiyon haritası olan bir eylem listesi vardır.
Kullanıcı girişi formu alır [action] [entity]
. Room
Uygun dönmek için işletme adını kullanır Entity
sonra doğru işlevi bulmak işlemi adı kullanan nesneyi, ve çalıştırır.
Oda tanımını oluşturmak için her Room
nesne kendi açıklama dizesini görüntüler, ardından her birinin açıklama dizelerini ekler Entity
. Entity
Açıklaması kendi durumuna bağlı olarak değişebilir ( "kapı açık", vs, "Kapı kilitli" "Kapı kapalı olduğu").
Sorun şu: bu yöntemi kullanarak, hızlı bir şekilde uygulamak için gereken açıklama ve eylem işlevlerinin sayısı elden çıkıyor. Başlangıç odamın tek başına 5 varlık arasında yaklaşık 20 işlevi var.
Tüm eylemleri tek bir işlevde birleştirebilir ve if-else / bunlar arasında geçiş yapabilirim, ancak bu hala varlık başına iki işlevdir. Ayrıca Entity
, kapılar ve anahtarlar gibi ortak / genel nesneler için belirli alt sınıflar oluşturabilirim , ancak bu sadece beni şimdiye kadar alıyor.
DÜZENLEME 1: İstendiği gibi, bu eylem işlevlerinin sözde kod örnekleri.
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
Açıklama işlevleri, durumu kontrol ederek ve uygun dizeyi döndürerek hemen hemen aynı şekilde çalışır.
EDIT 2: Soru ifadelerimi revize etti. Diğer davranışlarla ortak davranışı paylaşmayan (belirli eylemlere devlet tabanlı yanıtlar) önemli sayıda oyun içi nesne olabileceğini varsayın. Bu benzersiz davranışları, her bir varlığa özgü eylem için özel bir işlev yazmaktan daha temiz ve daha sürdürülebilir bir şekilde tanımlamanın bir yolu var mı?