एक कार्यात्मक प्रोग्रामिंग भाषा में राज्य (सामान्य रूप से) को संभालने के लिए एक सामान्य तकनीक है? वैश्विक स्थिति को संभालने के लिए हर (कार्यात्मक) प्रोग्रामिंग भाषा में समाधान हैं, लेकिन मैं जहां तक संभव हो, इससे बचना चाहता हूं।
एक शुद्ध कार्यात्मक तरीके से सभी राज्य फ़ंक्शन पैरामीटर हैं। इसलिए मुझे पूरे खेल राज्य (दुनिया, खिलाड़ियों, पदों, स्कोर, संपत्ति, दुश्मन, ...) के साथ एक विशाल हैशमप को सभी कार्यों के लिए एक पैरामीटर के रूप में रखना चाहिए जो किसी दिए गए इनपुट या ट्रिगर पर दुनिया को हेरफेर करना चाहता है। । फ़ंक्शन स्वयं गेमस्टैट ब्लॉब से प्रासंगिक जानकारी चुनता है, इसके साथ कुछ करें, गेमस्टेट में हेरफेर करें और गेमेट को वापस लौटाएं। लेकिन यह समस्या के लिए एक गरीब आदमी समाधान की तरह दिखता है। यदि मैं पूरे गेमस्टैट को सभी कार्यों में लगाता हूं, तो वैश्विक चर या अनिवार्य दृष्टिकोण के विपरीत मेरे लिए कोई लाभ नहीं है।
मैं केवल संबंधित जानकारी को कार्यों में डाल सकता हूं और उन कार्यों को वापस कर सकता हूं जो दिए गए इनपुट के लिए लिए जाएंगे। और एक एकल फ़ंक्शन गेमस्टेट के सभी कार्यों को लागू करता है। लेकिन अधिकांश कार्यों के लिए "प्रासंगिक" जानकारी की बहुत आवश्यकता होती है। move()
ऑब्जेक्ट पोज़िशन, वेलोसिटी, टक्कर के लिए मैप, सभी एनीमीज़ की पोज़िशन, करेंट हेल्थ ... की ज़रूरत है, इसलिए यह तरीका काम भी नहीं करता।
तो मेरा सवाल यह है कि मैं एक कार्यात्मक प्रोग्रामिंग भाषा में राज्य की भारी मात्रा को कैसे संभालूं - विशेष रूप से खेल के विकास के लिए?
EDIT: क्लोजर में गेम बनाने के लिए कुछ गेम फ्रेमवर्क हैं। इस समस्या को हल करने के लिए दृष्टिकोण आंशिक रूप से खेल में सभी वस्तुओं को "संस्थाओं" के रूप में पिरो कर एक विशाल बैग में रखना है। एक विशाल मुख्य कार्य स्क्रीन रखा है और संस्थाओं और संभाल घटनाओं ( :on-key-down
, :on-init
, ...) इस संस्थाओं के लिए और मुख्य प्रदर्शन पाश चलाते हैं। लेकिन यह वह स्वच्छ समाधान नहीं है जिसे मैं खोज रहा हूं।
move()
, आपको संभवतः 'करंट' ऑब्जेक्ट (या इसके लिए एक पहचानकर्ता) में पास होना चाहिए, साथ ही वह दुनिया जिसके माध्यम से आगे बढ़ रहा है, और बस वर्तमान स्थिति और वेग प्राप्त करें ... आउटपुट तब संपूर्ण भौतिकी दुनिया है, या कम से कम बदली हुई वस्तुओं की सूची।