2009-03-04 20 views
10

में इंटरनेट उच्च स्कोर को कैसे कार्यान्वित करें मैं अपने गेम के लिए इंटरनेट उच्च स्कोर लागू करना चाहता हूं। और उन खिलाड़ियों को फीडबैक दें जो उनके पास हैं (न केवल शीर्ष 100 या ऐसा कुछ)। स्कोर कहां अंक> सेGoogle App Engine

COUNT का चयन करें (*): सामान्य एसक्यूएल में यह है कि कैसा दिखेगा newUsersPoints

और GQL समान

db.GqlQuery कुछ है ("स्कोर से चुनें * कहां अंक >: 1 ", newUsersPoints) .count()

लेकिन चूंकि गिनती() केवल 1000 तक ही सीमित है, यह मेरे मामले में बहुत उपयोगी नहीं होगी। क्या आपके पास इसे कार्यान्वित करने के बारे में कोई विचार है?

मैं दो

सबसे पहले है:

  1. उपयोग sharding काउंटर विचार (http://code.google.com/intl/pl/appengine/articles/sharding_counters.html) नया "तालिका" कि संग्रहीत करता है कि कितने स्कोर कुछ श्रेणी में हैं (from_points, to_points) बनाएं

  2. उपरोक्त तालिका से सभी काउंटरों को सारांशित करें जहां range.to_points < newUsersPoints

  3. पता लगाएं कि स्कोर में स्कोर के मुकाबले कितने स्कोर हैं, जहां नया स्कोर db.GqlQuery ("चयन करें * स्कोर से अंक>> 1 और अंक> = 2 और अंक <: 3", newUsersPoints, range.from_points , range.to_points) .count() + sumfrom2

  4. ढूँढें रेंज है, जिसमें नई स्कोर में और उसके काउंटर बढ़ाने के है

  5. स्प्लिट पर्वतमाला जो काउंटर 1000 (या 999) इतना है कि तुलना में बड़ा है 3. wouldn सीमा तक पहुंच नहीं है

  6. स्कोर तालिका में नया स्कोर जोड़ें

जो काफी जटिल और त्रुटि प्रवण है। स्कोर जोड़ने से पहले हम कुछ रेंज और टाइमआउट बढ़ा सकते हैं। (नहीं व्यवहार)

दूसरा विचार:

समय-तरह सभी बिंदुओं से और उन्हें नए पदों देना स्कोर समय (? एक बार हर दिन) से (स्क्रिप्ट तो समय बाह्य हो सकते हम मात्रा में यह करने के लिए है)

पता लगाने के लिए, जिस पर जगह नई स्कोर हम सिर्फ

db.GqlQuery करना है ("स्कोर से चुनें * कहां अंक>: 1 सीमा 1", newUsersPoints)। .Get() precalculated_position + 1

कोई अन्य विचार?

उत्तर

4

यह thread on the google-appengine group शायद ब्याज का होगा। ऐसा लगता है कि एक लाइब्रेरी है, ranklist, विशेष रूप से इसके लिए।

असल में, ऐसा लगता है जैसे उन्होंने sharded काउंटर के समान कुछ किया था।

5

मैंने कई GAE ऐप्स में रैंकर लागू किया है। वे फेसबुक एप्लीकेशन हैं जिनमें हजारों लोग हजारों लोग खेल रहे हैं। यह अच्छी तरह से काम करता है, लेकिन मेरे प्रयोजनों के लिए एक बड़ा दोष यह है: आप पहले से घोषित करने के लिए अंतिम सीमा जिस पर प्रतिभागी का स्कोर में गिर जाएगी की जरूरत है तो यह दो कारणों के लिए बुरा है:।

  1. अगर आपके पास बिना किसी अंत में एक प्रतियोगिता, जहां लोगों के स्कोर ऊपरी सीमा के बिना चढ़ना जारी रख सकते हैं, आप उलझ गए हैं।

  2. एक प्रतियोगिता की शुरुआत में, जब सभी को शून्य के साथ एक साथ जोड़ा जाता है, तो रैंकर.py द्वारा उपयोग की जाने वाली पेड़ संरचना कुशल नहीं होती है। पेड़ बहुत गहरा हो जाता है और इसकी किसी भी चौड़ाई का उपयोग करता है।

दूसरे शब्दों में, ranker.py मामले के लिए उत्कृष्ट जहां प्रतियोगियों जिसका स्कोर बेतरतीब ढंग से एक और भी जिस तरह से ऊपर एक मूल्यों के नाम से जाना जाता रेंज में वितरित कर रहे हैं। अन्य उपयोगों के लिए यह इष्टतम से कम है।

मैं जल्द ही एक अधिक आम तौर पर उपयोगी रैंकिंग इंजन विकसित करने की उम्मीद कर रहा हूं। जब ऐसा होता है तो निश्चित रूप से इस धागे को अपडेट कर देगा!