बचत roguelike खेल राज्य?


11

मैं HTML5 और jQuery का उपयोग करके एक बुनियादी रूग्यूलाइक पर काम कर रहा हूं, और मैं एक समस्या में आया हूं।

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

मैंने ब्राउज़र विंडो पर गेम स्टेट को सहेजने के तरीकों पर शोध किया है, लेकिन मैं उनसे खुश नहीं हूं। मेरा सवाल यह है: "गेम स्टेट को सेव करना" मानने का मतलब है कि एक भारी भारी अजाक्स / पोस्ट अनुरोध, मैं इस धोखा व्यवहार को कैसे विफल करूं? पूरे मानचित्र की स्थिति को बचाने के विपरीत 2d मानचित्र में वृद्धिशील / प्रक्रियात्मक परिवर्तनों को निर्धारित करने के लिए एक ज्ञात पद्धति है? कृपया ध्यान दें, मैं "सबसे कुशल तरीका" नहीं पूछ रहा हूं - मैं अपनी अनुभवहीनता को सुधारने के लिए मौजूदा तरीकों की तलाश कर रहा हूं।


बहुत सामान्य और सामान्य जावास्क्रिप्ट प्रोग्रामिंग सवाल। मैंने मतदान किया, लेकिन तब से मैंने फिर से संघर्ष किया क्योंकि यह दिलचस्प है कि यदि आप विचार करें कि यदि आप ऑन-अनलोड घटना को ट्रिगर नहीं कर सकते तो आप इसे कैसे करेंगे।
टिम होल्ट

हो सकता है कि मैं इसे सीधे उस समस्या को हल करने के लिए इसे फिर से
लिख दूं

@TimHolt - आपके सुझाव के अनुसार संपादित
कोडमोज़

जवाबों:


8

स्पष्ट समाधान यह है कि हर खिलाड़ी को सर्वर पर भेजा जाए क्योंकि यह बना है और सर्वर ने उन्हें लॉग इन किया है; इस तरह, यदि किसी कारण से खेल निरस्त हो जाता है, तो लॉग कमांड को गेम को उस बिंदु पर पुनर्स्थापित करने के लिए फिर से शुरू किया जा सकता है जहां इसे छोड़ा गया था।

बेशक, जब एक उचित बचत की जाती है, तो पुराने कमांड लॉग को फेंक दिया जा सकता है (हालांकि आप इसे पुराने गेम के रिप्ले की अनुमति देने के लिए भी सहेज सकते हैं; यदि आप ऐसा करते हैं, तो आप रियल टाइम रीप्ले के लिए लॉग में टाइमस्टैम्प को शामिल करना चाह सकते हैं। )। आप स्वचालित रूप से बचाने के बाद एक पूर्ण बनाने के लिए चाहते हो सकता है n आदेशों पिछले बचाने के बाद से किया गया है (जहां, कहते हैं, एन = 1000) जरूरत से ज्यादा लंबे समय से रिप्ले से बचने के लिए अगर एक ही स्तर पर खिलाड़ी रहता है बहुत लंबा बंद करने या खेल दुर्घटनाग्रस्त होने से पहले ।

यदि आपके गेम में रैंडम नंबर शामिल हैं (और, एक रॉगुलाइक होने के नाते, यह संभवतः करता है), तो आपको यह भी सुनिश्चित करने की आवश्यकता होगी कि उन्हें रिप्ले के दौरान सही तरीके से फिर से बनाया जा सके। एक समाधान रिप्ले लॉग में हर यादृच्छिक संख्या को शामिल करना है; दूसरा एक नियतात्मक छद्म आयामी संख्या जनरेटर का उपयोग करना है और खेल को सहेजने पर बीज को बचाना है।

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


1
AFAIK सभी RGN के छद्म आयामी हैं .. आपको सही मायने में (अचयनित) यादृच्छिक मूल्यों को प्राप्त करने के लिए विशेष हार्डवेयर की आवश्यकता है ।
बॉबोबोबो

1
@bobobobo ने pseudorandom (वरीयता प्राप्त) है और वहाँ .Net प्लेटफॉर्म में क्रिप्टोग्राफिक रूप से सुरक्षित यादृच्छिक संख्या (अनदेखी) है। यह हार्डवेयर रैंडम हो सकता है / नहीं हो सकता है, लेकिन यह इतना करीब है कि सिर्फ एक बीज को स्टोर करने में असमर्थ है।
रंगोरिक

2

एक ही प्रश्न के अधिक सामान्य प्रश्न के लिए /programming/3888902/javascript-detect-browser-close-tab-close-browser देखें ।

फर्श पर होने वाले परिवर्तनों और प्रत्येक कदम पर वृद्धिशील डेल्टा को बचाने पर भी विचार करें। तब आप अंतिम चाल के बिंदु तक खेल को फिर से खेल सकते हैं।

मान लें कि यादृच्छिक संख्या जनरेटर का कुछ उपयोग है, तो आप प्रत्येक नई मंजिल की शुरुआत में यादृच्छिक संख्या जनरेटर को उत्पन्न और पुन: बीज कर सकते हैं, और फिर इसे फर्श के साथ बचा सकते हैं। फिर आप लोड पर फिर से शुरू कर सकते हैं, और पिछले किए गए एक ही क्रम के साथ चाल को फिर से खेलना करने में सक्षम होना चाहिए।


धन्यवाद टिम - एक बार जब मैं गेम देव मानसिकता में मिलता हूं, तो किसी भी चीज को बाल्टी करना बहुत आसान है जो इसे गेम देव में छूता है। वैसे भी जवाब देने के लिए सहारा।
कोडमोज़

कोई चिंता नहीं - प्रश्न पर मेरी संशोधित टिप्पणी भी देखें :)
टिम होल

मैंने कहा कि प्रत्येक कदम पर वृद्धिशील देरी भी होगी।
बोब्बोबो

2

वृद्धिशील बचत करने के लिए दृष्टिकोण, लेकिन एक पूर्ण बचाने के लिए समय ढूँढना:

  • onunload, जैसा कि पहले उल्लिखित है। मैंने इसे विश्वसनीय पाया है (लेकिन उपयोग करना localStorage, नेटवर्क नहीं, जो चीजों को बदल सकता है)।
  • जब आपकी विंडो फ़ोकस खोती है तो सहेजें।
  • समय-समय पर बचत करें: जब अंतिम बचत n मिनट में नहीं हुई हो और उपयोगकर्ता ने m सेकंड में कोई इनपुट नहीं किया हो।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.