2012-04-17 14 views
5

में गेम-प्रगति को कैसे सहेजना है मैं एक ऐसी वेबसाइट विकसित कर रहा हूं जो एक तरह का गेम है। उपयोगकर्ताओं की प्रगति को MySQL-डेटाबेस में सहेजा जाता है।एक MySQL डेटाबेस

मैं इस बारे में एक कॉलम सेव (आईडी) और कॉलम प्रगति के साथ सहेजकर इस बारे में जाना चाहता हूं, जहां प्रगति डेटाटाइप टेक्स्ट की है। जब उपयोगकर्ता शुरू होता है, प्रगति (उदा।) '0' पर सेट होती है। यदि वह स्तर 1 तक पहुंच जाता है, तो प्रगति को '0 # 1' पर सेट किया जाता है, स्तर दो इसे '0 # 1 # 2' बनाता है। स्तर का क्रम मुक्त है और मैं इसे सहेजना चाहता हूं। तो प्रगति '0 # 4 # 2 # 15' और इसी तरह हो सकती है।

क्या यह करने का यह एक अच्छा तरीका है? मुझे एसक्यूएल के साथ कोई अनुभव नहीं है और मैं कुछ अविश्वसनीय बेवकूफ नहीं करना चाहता। मैंने टेबल, विदेशी कुंजी और व्हाट्नॉट के बारे में बहुत भ्रमित जानकारी पढ़ी है ...

मैं इसे पढ़ने के लिए आपको धन्यवाद देना चाहता हूं और मैं जवाब देने की उम्मीद कर रहा हूं।

रयान

+0

कृपया इसे कई प्रश्नों में विभाजित करें। –

+0

क्या आपको शायद 'बफर' के बजाय 'कैश' का मतलब है? – Widor

+0

@ जेन आप सही हैं। – Ryan

उत्तर

2

अपने प्रश्न 1

का जवाब मैं आपकी समस्या को इस तरह के दृष्टिकोण नहीं होता। मैं 3 टेबल बनाउंगा: Levels तालिका ('लेवलकी' की प्राथमिक कुंजी), Users तालिका ('उपयोगकर्ताकी' की प्राथमिक कुंजी) और 'लेवलकी' और 'उपयोगकर्ताकी' की समग्र कुंजी के साथ User_Levels तालिका। जब कोई उपयोगकर्ता एक स्तर पूरा करता है, तो बस User_Levels तालिका में डालें। फिर एक उपयोगकर्ता एक स्तर पूरा कर लिया है, तो देखने के लिए है एक साधारण का चयन करें:

SELECT 'a' FROM User_Levels WHERE userKey = ? AND levelKey = ? 

पंक्तियों की संख्या> 0 है, तो उपयोगकर्ता स्तर

+0

यह मेरी राय में एक बहुत ही दृष्टिकोण है। यदि आपको उस आदेश को रखने की आवश्यकता है जिसमें एक स्तर पूरा हो गया है, तो आपके पास User_Levels में तीसरा कॉलम हो सकता है जिसमें क्रमिक मान हो। उदाहरण के लिए यदि उपयोगकर्ता 2 उस क्रम में स्तर 1, 4, और 2 को पूरा करता है, तो तालिका '(userKey, levelKey, ordinalValue)' प्रविष्टियों '(1,1,1), (1,4,2) के लिए होगी, (1,2,3) '। – mdoyle

+0

सच है, मैंने केवल उस उत्तर में कॉलम सूचीबद्ध किए हैं जो आवश्यक है (चाबियाँ)। आप स्तर, उपयोगकर्ता, या दोनों (User_Levels) के बीच संबंधों का वर्णन करने वाली किसी भी जानकारी पर कार्रवाई कर सकते हैं। –

+0

"यह एक बहुत दृष्टिकोण है" = "वॉचर एक बेहतर तरीका है"। शीश। – mdoyle

1

अपने पहले प्रश्न के बारे में पूरा कर लिया है, अगर खेल/स्तर व्यक्तिगत रूप से गैर-रैखिक होते हैं, मैं एक अलग दृष्टिकोण लेता हूं; मैं बस एक सारणी जोड़ूंगा जिसमें उपयोगकर्ता आईडी के लिए एक कॉलम और स्तर के लिए एक स्तंभ शामिल होगा। तो उपयोगकर्ता 1 स्तरों 0, 4 और 7 पूर्ण कर लिया है, मेरी मेज 3 पंक्तियों में दिखाई देंगे:

UID levels_completed 
1 0 
1 4 
1 7 

अपने अन्य प्रश्न के बारे में, आप पृष्ठ के समापन पता लगाने के लिए जावास्क्रिप्ट घटनाओं और ajax का उपयोग कर सकते, लेकिन मैं नहीं होगा उस पर भरोसा करते हैं; जब भी आवश्यक हो मैं केवल प्रश्नों को चलाऊंगा। और यदि आपका सत्र नष्ट हो गया है, तो आप पहले से ही बहुत देर हो चुकी हैं ...

+0

ठीक है, स्तर "खंड" की तरह अधिक हैं और उनमें से एक समूह होगा। आदेश महत्वपूर्ण है क्योंकि खिलाड़ी आगे और आगे जा सकता है। जब खिलाड़ी खेल को फिर से शुरू करता है तो मैं एक सरणी में प्रगति पढ़ रहा हूं। बड़ी संख्या में उपयोगकर्ताओं और प्रति उपयोगकर्ता बड़ी संख्या में अनुभागों के साथ, क्या यह अभी भी एक अच्छा दृष्टिकोण है? – Ryan

+0

@Ryan यह सिर्फ एक बुनियादी उदाहरण है, लेकिन यदि आप अधिक जानकारी जोड़ना चाहते हैं, तो आप अतिरिक्त जानकारी वाले कॉलम जोड़ सकते हैं। किसी भी तालिका में संपीड़ित बहुत सारी जानकारी वाले टेबल पर इस तरह की तालिका पर किसी भी तरह से ऑपरेशन आसान हो जाएगा। – jeroen

2

प्रश्न 2 के लिए, मैं कहूंगा कि प्रश्नों की मात्रा समस्या नहीं है। आखिरकार, आप डेटाबेस पर डेटा लिख ​​रहे हैं, इसे एक्सेस नहीं कर रहे हैं। निजी तौर पर, जब भी कोई उपयोगकर्ता वास्तव में एक स्तर पूरा करता है, तो मैं डेटाबेस में "सेव" भेजूंगा।

वॉचर ने स्तरों और उपयोगकर्ताओं को अलग-अलग तालिकाओं में विभाजित करने के लिए एक अच्छा दृष्टिकोण पोस्ट किया है। प्रगति का क्रम उपयोगकर्ता_लेवल में प्रगति के क्रम से देखा जा सकता है, इसलिए किसी को स्टोर करने की आवश्यकता नहीं है जैसे 1 # 3 # 4 # 9

आप शायद पृष्ठभूमि में एजेक्स के साथ सहेजना चाहते हैं, इसलिए आप गेम खेलने में बाधा नहीं डालते हैं। उदाहरण के लिए jQuery's $.post method देखें। या यदि आपका गेम फ़्लैश में है, तो आप URLRequest का उपयोग कर सकते हैं।

संबंधित मुद्दे