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 Roomnesnelere ayrılmıştır . Her Roombirinin Entityo odada bulunan nesnelerin bir listesi vardır. Her Entitybirinin 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]. RoomUygun dönmek için işletme adını kullanır Entitysonra doğru işlevi bulmak işlemi adı kullanan nesneyi, ve çalıştırır.
Oda tanımını oluşturmak için her Roomnesne kendi açıklama dizesini görüntüler, ardından her birinin açıklama dizelerini ekler Entity. EntityAçı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ı?