सी ++ में परिमित राज्य मशीन


16

इसलिए, मैंने गेम स्टेट मैनेजमेंट करने के लिए एफएसएम का उपयोग करने के बारे में बहुत कुछ पढ़ा है, एक एफएसएम क्या है जैसी चीजें, और एक के निर्माण के लिए राज्यों के ढेर या सेट का उपयोग करना। मैं वह सब कर चुका हूँ। लेकिन मैं उस उद्देश्य के लिए एक FSM के वास्तविक, अच्छी तरह से डिज़ाइन किए गए कार्यान्वयन को लिखने में फंस गया हूं । विशेष रूप से, कोई व्यक्ति राज्यों के बीच संक्रमण की समस्या को कैसे स्पष्ट रूप से हल करता है, (कैसे) एक राज्य को अन्य राज्यों से डेटा का उपयोग करने में सक्षम होना चाहिए, और इसी तरह। क्या किसी को C ++ में कार्यान्वयन को डिजाइन करने और लिखने, या बेहतर अभी तक, कोड उदाहरणों पर कोई सुझाव है?


मेटा में इस चर्चा पर आधारित संपादित टैग: meta.gamedev.stackexchange.com/questions/103/…
lathomas64

जवाबों:


12

मैंने थोर अलेक्जेंडर द्वारा संपादित "व्यापक रूप से मल्टीप्लेयर गेम डेवलपमेंट" में एक अध्याय के आधार पर एफएसएम लिखा। अंदर एक अध्याय है "लेबल-पैरेलल-स्टेट मशीन फॉर बिलीवोर कैरेक्टर"। यह अजगर में लिखा है, लेकिन अवधारणाओं को आसानी से C ++ में अनुवाद किया जा सकता है। मैं इसे अत्यधिक जाँचने की सलाह देता हूं, भले ही यह चरित्र राज्यों के बारे में हो, गेम स्टेट्स के बारे में नहीं।

मैंने यहां जो बनाया है: https://github.com/swganh/mmoserver/tree/master/src/ZoneServer/GameSystemManagers/State%20Manager कार्यान्वयन विवरण के लिए StateManager के तहत देखते हैं, लेकिन मूल रूप से आपके पास अलग-अलग 'आधार स्टेट्स' हैं जिन्हें आप कर सकते हैं उपयोग। फिर वहां से आपके पास विशिष्ट राज्य हैं जिन्हें आप एक चरित्र के रूप में परिवर्तित करते हैं, इसलिए प्रत्येक राज्य एक वर्ग है। आप तब जांचते हैं कि क्या आप एक राज्य से दूसरे राज्य में संक्रमण कर सकते हैं और फिर 'एंटर' करने के बाद आप अपना स्विच बनाते हैं, तो आप किसी राज्य में जाने के बाद आसानी से काम कर सकते हैं। मैंने पाया कि यह अब तक के खेल के लिए बहुत अच्छा काम कर रहा है।

मैंने जो लागू किया है वह यह है कि पुस्तक एक समानांतर राज्य मशीन को कॉल करती है, जो आवश्यक रूप से कई fsm की एक साथ काम कर रही है, इस मामले में आप एक राज्य में संक्रमण कर सकते हैं, जो अन्य सभी राज्यों को ब्लॉक करता है (यानी: CreatureState_Dead)। मैं बहुत अधिक विस्तार में नहीं जा रहा हूं क्योंकि मुझे नहीं लगता कि यह वास्तव में आपकी मदद करेगा, लेकिन अगर आप चाहें तो मैं विस्तृत कर सकता हूं।


1
ऐसा लगता है कि कोड स्थानांतरित हो गया है: github.com/swganh/mmoserver/tree/master/src/ZoneServer/…
DK_

निश्चित URL: StateManager.cpp StateManager.h
Higor E.

8

प्रोग्रामिंग गेम AI बाय उदाहरण (http://www.ai-junkie.com/books/toc_pgaibe.html) में एक उदाहरण कार्यान्वयन है जो बहुत सीधा है और बस मूल बातें संभालता है। संक्रमण एकल विधि कॉल (पहले दर्ज करें), तब निष्पादित करें (तब हर अपडेट, बाहर निकलें () संक्रमण करते समय)> मैं नहीं जानता कि आपको इसके अलावा क्या चाहिए। मैं अपने स्वयं के राज्यों के रूप में और अधिक जटिल बदलावों को लागू करूंगा जो केवल एक बार निष्पादित करने और अगले राज्य में अनुक्रम में स्थानांतरित करने के लिए डिज़ाइन किए गए हैं।

मैं एक छुरा ले जाऊंगा और मान लूंगा कि आप एआई के लिए एफएसएम देख रहे हैं, अगर ऐसा है तो मैं आपको व्यवहार के पेड़ पर एक नज़र डालने की सलाह देता हूं। इस पर AIGameDev के कुछ बेहतरीन लेख हैं।


1
यह उदाहरण उनकी साइट पर भी उपलब्ध है: ai-junkie.com/altecture/state_driven/tut_state1.html
Zolomon

5

यदि C ++ टेम्प्लेट जादू और संभावित लंबे संकलन समय आपके लिए कोई समस्या नहीं है और आपके पास काम करने के लिए पहले से ही Boost इंस्टॉल है :

बूस्ट में अब एक कुशल ( गति और आकार में ) मेटा-स्टेट-मशीन लाइब्रेरी है जो आपको राज्यों की संरचनाओं से अलग से संक्रमण तालिका सेट करने का लाभ देती है : आपके पास एक मेज है जो वर्णन करती है कि विच राज्य से दूसरे राज्य को डायन करने के लिए कब जाना है । आपको बस यह समझने के लिए पढ़ना होगा कि राज्य मशीन में क्या चल रहा है।

अन्य लाभ यह है कि उच्च-प्रदर्शन सॉफ्टवेयर वाले एम्बेडेड सॉफ्टवेयर्स में भी कई उद्यमों द्वारा इसका परीक्षण किया गया है (विवरणों के लिए मेलिंग सूची को देखें)। जैसा कि कार्यान्वयन पहले से ही है, यह एक अच्छा विकल्प हो सकता है यदि आपको जेनेरिक स्टेट मशीन के कार्यान्वयन की आवश्यकता है जो जस्ट वर्क्स (टीएम) है।

यह ऑर्थोगोनल राज्यों (समानांतर राज्यों) और अन्य उपयोगी यूएमएल-आधारित सुविधाओं का भी समर्थन करता है।

यह ट्रांज़िशन टेबल को व्यक्त करने के कई तरीके भी प्रदान करता है, एक प्रयोगात्मक है लेकिन अभिव्यक्तता पक्ष पर दिलचस्प है (हालांकि वर्तमान संकलक द्वारा सीमित है - बहुत बुरा!)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.