मैं एक सरल पाठ-आधारित साहसिक खेल की प्रोग्रामिंग करके हाल ही में अपने आप को मनोरंजन कर रहा हूं, और मैं एक बहुत ही सरल डिजाइन मुद्दे की तरह लगता है।
एक संक्षिप्त अवलोकन देने के लिए: खेल Roomवस्तुओं में टूट गया है। प्रत्येक में Roomउन Entityवस्तुओं की एक सूची है जो उस कमरे में हैं। प्रत्येक Entityमें एक घटना अवस्था होती है, जो एक साधारण स्ट्रिंग-> बूलियन मैप और एक एक्शन लिस्ट होती है, जो एक स्ट्रिंग-> फ़ंक्शन मैप होती है।
उपयोगकर्ता इनपुट का रूप लेता है [action] [entity]। Roomउपयुक्त Entityवस्तु को वापस करने के लिए इकाई नाम का उपयोग करता है , जो तब सही फ़ंक्शन को खोजने के लिए क्रिया नाम का उपयोग करता है, और इसे निष्पादित करता है।
कमरे के विवरण को उत्पन्न करने के लिए, प्रत्येक Roomऑब्जेक्ट अपना विवरण स्ट्रिंग प्रदर्शित करता है, फिर हर के विवरण तार को जोड़ता है Entity। Entityवर्णन अपने राज्य के आधार पर बदल सकता है ( "दरवाजा खुला है", "दरवाज़ा बंद है", आदि "दरवाजा बंद कर दिया है")।
यहां समस्या है: इस पद्धति का उपयोग करते हुए, मुझे जितनी जल्दी लागू करने की आवश्यकता है विवरण और कार्रवाई कार्यों की संख्या हाथ से निकल जाती है। अकेले मेरे शुरुआती कमरे में 5 संस्थाओं के बीच लगभग 20 कार्य हैं।
मैं सभी क्रियाओं को एक ही फ़ंक्शन में जोड़ सकता हूं और अगर-और / उनके माध्यम से स्विच कर सकता हूं, लेकिन अभी भी प्रति इकाई दो कार्य हैं। मैं Entityदरवाजे और चाबियों जैसी सामान्य / सामान्य वस्तुओं के लिए विशिष्ट उप-कक्षाएं भी बना सकता हूं , लेकिन यह केवल मुझे अभी तक मिलती है।
संपादित 1: जैसा कि अनुरोध किया गया है, इन कार्रवाई कार्यों के छद्म कोड उदाहरण हैं।
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
विवरण फ़ंक्शन बहुत हद तक उसी तरह से कार्य करते हैं, राज्य की जाँच करते हैं और उपयुक्त स्ट्रिंग लौटाते हैं।
EDIT 2: मेरे प्रश्न को संशोधित किया। मान लें कि इन-गेम ऑब्जेक्ट्स की एक महत्वपूर्ण संख्या हो सकती है जो अन्य व्यवहारों के साथ सामान्य व्यवहार (विशिष्ट कार्यों के लिए राज्य-आधारित प्रतिक्रिया) को साझा नहीं करते हैं। क्या कोई तरीका है जो मैं इन अद्वितीय व्यवहारों को एक क्लीनर में परिभाषित कर सकता हूं, प्रत्येक इकाई-विशिष्ट कार्रवाई के लिए कस्टम फ़ंक्शन लिखने की तुलना में अधिक बनाए रखने योग्य तरीका है?