निष्क्रिय खेल इतनी बड़ी संख्या को कैसे संभालते हैं?


31

बस यह सोचकर कि टैप टाइटन्स और कुकी क्लिकर जैसे गेम इतनी बड़ी संख्या को कैसे संभालते हैं।

मैं एक निष्क्रिय खेल को लागू करने की कोशिश कर रहा हूं, हालांकि C # द्वारा समर्थित सबसे बड़ी संख्या प्रारूप दशमलव है।

मैं 10 ^ 500 तक का समर्थन देख रहा हूं; यह फ्लोटिंग पॉइंट होना चाहिए

मैं इसे कैसे संभाल सकता हूं?

पुनश्च यह पार मंच यानी पीसी, मैक, ios, Android और एकता के साथ संगत होना चाहिए


2
अगर मैं सही ढंग से याद है, तुम, कुकी Clicker का कोड की पहुंच है तो आप सिर्फ इतना है कि जांच कर सकता है ...
Vaillancourt

नहीं, मैंने अपने दिमाग से कुकी क्लिकर को पहले ही ब्लॉक कर दिया था!
आर्टुरो टॉरेस सैंचेज़

2
मैं TimeClickers , एक एकता खेल के लिए विघटित स्रोत को देखा है । वे सिर्फ उपयोग करते हैं double। यदि यह मेरे पास होता, तो मैं BigInteger का उपयोग करता , हालांकि।
ब्लूराजा - डैनी पफ्लुगुएफ्ट

1
@VioletGiraffe: मैं एक तरह से सहमत हूं, और मैं अपने (हमारे?) संदेह को ठोस बनाना चाहूंगा (संभवतः ओपी को प्रश्न को स्पष्ट करने में मदद कर सकता हूं): प्रश्न के संबंध में "निष्क्रिय खेल" क्या है (जो इस तरह का बनाता है) बड़ी संख्या के लिए खेल का एक विशेष मामला)? " इतनी बड़ी संख्या" (अपने आप से हाइलाइट) की संख्या किस प्रकार की है? आप कितने बड़े नंबर चाहते हैं?
या मैपर

आप हमेशा एक स्ट्रिंग में इतनी बड़ी संख्या को स्टोर कर सकते हैं और आसानी से स्ट्रिंग पर योग करने के लिए एक फ़ंक्शन को लागू कर सकते हैं।
देव-माशिह

जवाबों:


40

यदि आप केवल पूर्ण सटीकता के बिना भारी संख्या में स्टोर करना चाहते हैं, उदाहरण के लिए यदि आप 12,567,000,000,000 को 12.567T (ट्रिलियन) के रूप में दिखाने जा रहे हैं, तो आप बस मानक फ्लोट / दशमलव मान का उपयोग कर सकते हैं और उपयुक्त एक्सिक्स के साथ पहला एक्स महत्वपूर्ण आंकड़े दिखा सकते हैं। इस तरह। जब आप ऑक्टिलियन में होते हैं, तो क्या आपको वास्तव में प्रत्येक व्यक्तिगत पूर्णांक वेतन वृद्धि के बारे में ध्यान रखने की आवश्यकता होती है?


4
यह शायद वास्तव में सबसे समझदार उत्तर है, और मुझे पूरा यकीन है कि कुकी क्लिकर केवल जावास्क्रिप्ट में एक मानक फ्लोट का उपयोग करता है - मामले में जब मैंने इसे "हैक" किया (पढ़ा: कंसोल के साथ गड़बड़) और जब संख्या 1e308 तक पहुंच गई तो मैं भी कूद गया "इन्फिनिटी" और मैं कुछ भी खरीदने के लिए आगे बढ़ सकता था
जिसे

1
महान! तथ्य यह है कि पाठ "इन्फिनिटी" के लिए कूदता है ऐसा लगता है कि डेवलपर रक्षात्मक रूप से इस घटना के आसपास भी कोडिंग कर रहा था। इसके अलावा, सादगी राजा है।
रॉस टेलर-टर्नर

19
@RossTurner - पाठ को "इन्फिनिटी" दिखाने में संभवतः कोई कोडिंग शामिल नहीं थी - अनंत का बस एक मूल्य है जो एक फ्लोट हो सकता है, और जावास्क्रिप्ट जानता है कि इसे कैसे प्रदर्शित करना है, जैसे कई अन्य भाषाएं करती हैं।
जिब स्मार्ट

मानक फ्लोट्स (डबल परिशुद्धता, 8 बाइट्स) 10 ^ 500 तक संख्याओं का प्रतिनिधित्व करने की अनुमति नहीं देगा क्योंकि मूल प्रश्न की आवश्यकता होती है, यह ~ 10 ^ 300 तक जाएगा। यदि यह पर्याप्त नहीं है, तो व्यक्ति को क्वाड प्रिसिजन फ़्लोट्स का उपयोग करना चाहिए जो कि भाषा के आधार पर nontrivial हो सकता है।
पीटरिस

1
फ्लोटिंग पॉइंट नंबरों के बारे में प्रत्येक प्रोग्रामर को क्या पता होना चाहिए: फ़्लोटिंग-
स्टीव

20

आप बिगइन्टेगर जैसी किसी चीज का उपयोग कर सकते हैं , जो कि केवल .net 4.0 में उपलब्ध है अगर मैं गलत नहीं हूं (सभी एकता बिल्ड प्लेटफॉर्म द्वारा समर्थित नहीं है)।

हालाँकि, इस कार्यक्षमता को लाने के लिए कुछ लाइब्रेरियों की आवश्यकता होती है, लेकिन .net4.0 की आवश्यकता के बिना। उदाहरण के लिए यहाँ

वैकल्पिक रूप से, आप गुणक का ट्रैक रखकर किसी बड़े का प्रतिनिधित्व करने के लिए छोटी संख्या का उपयोग कर सकते हैं। उदाहरण के लिए:

double value = 9;
enum Multiplier {
   Hundred,
   Thousand,
   Million,
   Billion,
   Trillion
}

अब, भले ही आपके पास 9 का मूल्य है, अगर आप इसे अपने गुणक के साथ जोड़ते हैं, तो आप प्रभावी रूप से उस 9 को 9 ट्रिलियन के रूप में दर्शा सकते हैं (या तो "ट्रिलियन" में डालकर या कुछ ऐसा लिख ​​सकते हैं जो आपके मूल्य के अंत में शून्य को जोड़ देगा। )।


यह ध्यान देने योग्य है कि संख्याएँ जैसे BigIntegerस्ट्रिंग या बाइट का उपयोग करती हैं [] संख्या का प्रतिनिधित्व - इसलिए वास्तव में कोई भी अपनी खुद की कक्षा बना सकता है, जो दो "संख्याओं को स्ट्रिंग्स या बाइट्स" के रूप में जोड़ता और घटाता है - ( आमतौर पर इस प्रकार का खेल) इसकी आवश्यकता नहीं है लेकिन आप गुणा या भाग या अन्य उन्नत कार्यों का भी समर्थन कर सकते हैं ) - लेकिन उन्हें यह ध्यान रखना होगा कि हमेशा एक भौतिक सीमा होती है जहाँ वे स्मृति से बाहर भाग सकते हैं।
डबलडबल

1
प्रत्येक बाइट आपकी संख्या के आकार को 256 से गुणा करती है। यदि आप किसी संख्या का प्रतिनिधित्व करने की कोशिश कर रहे मेमोरी से बाहर निकलते हैं, तो आपके नंबर का वैसे भी कोई वास्तविक मूल्य नहीं है। 256 ^ (2 बिलियन) = 2 ^ 8 ^ (2 बिलियन) = 2 ^ (16 बिलियन) ~ = 10 ^ (5 बिलियन) (वोल्फ्रमाल्पा ने उस अंतिम रूपांतरण को बनाने की कोशिश की)। आप १५० अंकों (<५०० बिट्स) का उपयोग करके अवलोकन योग्य ब्रह्मांड में व्यक्तिगत प्लैंक संस्करणों को निर्दिष्ट कर सकते हैं।
माइकल

11

आपको संभवतः एकता में उपयोग के लिए अपनी खुद की कक्षा लिखने की आवश्यकता होगी, लेकिन यह विशेष रूप से कठिन नहीं होगा।

आंतरिक रूप से, यह List<int>9 अंकों के समूह के अनुरूप सूची में प्रत्येक तत्व के साथ पूर्णांक (जैसे ) की सूची हो सकती है । प्रत्येक पूर्णांक में 0 से 999 999 999 की सीमा होगी। एक पूर्णांक 2 बिलियन से अधिक का समर्थन कर सकता है, और यह कि यदि यह अहस्ताक्षरित है, तो दोगुना हो सकता है, लेकिन आप प्रत्येक "अंक" अतिप्रवाह 1 000 000 000चाहते हैं, क्योंकि आप भी चाहते हैं आसानी से प्रदर्शन के लिए अपने बिग-नंबर को एक स्ट्रिंग में बदलने में सक्षम होने के लिए। यह समझना आसान है कि पहले से ही दशमलव अंक क्या हैं ( return group[i].ToString() + group[i-1].ToString() and so on) यह पता लगाने की तुलना में कि किसी नियमित डेटा प्रकार की सीमा के बाहर समूहों का योग कैसे प्रदर्शित किया जाए।

तो, आपकी सूची में पहला इंट 1s का प्रतिनिधित्व करेगा। अगले में अरबों की संख्या होगी। अगला, चतुष्कोण की संख्या, और इसी तरह।

जोड़ और घटाव पेन-एंड-पेपर जोड़ और घटाव की तरह ही काम करेगा, जहां आपको ओवरफ्लो देखना है और इसे अगले "अंक" तक ले जाना है, लेकिन 0-9 की सीमा वाले अंकों के बजाय, आपके अंक से लेकर 0 से 999 999 पर।


10

बड़ी संख्या से निपटने के लिए, मुझे लगता है कि मुझे लगता है कि टॉवर ऑफ़ हीरो की तरह एक अच्छा उदाहरण है । ऊपरी बायां कोना:

1

2
(स्रोत: mzstatic.com )

गेमप्ले में शामिल होने के बिना, जिस तरह से यह संख्याओं को संभालता है वह अपेक्षाकृत सरल है: आप दो बाल्टी संख्या देखते हैं। जब आप टॉवर में ऊंचे हो जाते हैं, और अधिक "सोना" बनाते हैं, तो दो बाल्टी बस बड़ी संख्या का प्रतिनिधित्व करती हैं।

120 
120M320K - 120 Million
120B631M - 120 Billion
120T134B - 120 Trillion

एक बार जब खेल T पास हो जाता है, तो वह एक, b, c ... z, aa, ab, ... में चला जाता है

56aa608z

इसे इस तरह से करते हुए, यह अभी भी आपको यह बताता है कि आपने कितने सोने की "कमाई" की है ... जबकि गेम को विवरण में नीचे नहीं किया गया है।

क्या आप वास्तव में लाखों लोगों के बारे में परवाह करते हैं जब आपकी संख्या ट्रिलियन पिछले है?

क्या यह Int, Big Int, Float, Double, Decimal, ... में नंबर रखता है? कस्टम ऐरे? जब आप इस तरह से "फजी" तरीके से नंबर संभाल रहे हैं, मुझे नहीं लगता कि यह मायने रखता है ...

उन सभी मामलों की संभावना है कि सबसे महत्वपूर्ण भाग हैं - इस मामले में, पहले 6 ... उसके बाद, अगले 3 या 6 को MAYBE करें - चूँकि कुछ सौ K कमाने से लाखों में मिल सकते हैं - लेकिन वहाँ एक बिंदु मिलता है जहाँ कमाई होती है जब आप T को मारते हैं तो कुछ सौ K आपको प्रभावित नहीं करने वाले हैं ... बहुत कम आ और उससे परे।

आपका माइलेज अलग-अलग होगा (जो आप चाहते हैं / आवश्यकता के आधार पर) ... बस मैंने सोचा कि मैं अपना 2c लगा दूंगा जो मुझे लगता है कि एक अच्छा या सरल उदाहरण है।

संपादित करें:

मैं आगे के नंबर सिस्टम को कैसे लागू करूंगा, इस बारे में विचार: मेरे पास 3 महत्वपूर्ण भागों के साथ एक नंबर होगा: XXXX.YYY (...) xZZZ।

X is the most significant digits, 
Y trailing 
Z the multiplier (multiple of 3).

तो 120.365x1 120k365 होगा ... 120.365x2 120M365K होगा ... आदि 4 प्रमुख (1200.365x2) को हिट करें, फिर बस संख्याओं को घुमाएं 1.200365 (...) x3। बैम। आपके पास 1B200M है।

XY दशमलव या फ़्लोट में आसानी से फिट हो जाएगा ... Z के साथ एक int / अहस्ताक्षरित int के रूप में आगे बैठा है।

एक फ्लोट के साथ, आप डॉट के बाद एक बड़ी - लेकिन बढ़ती महत्वहीन - अंकों की संख्या रखने में सक्षम होंगे।

Z आसानी से संख्याओं के आसानी से समझने योग्य ब्लॉक का प्रतिनिधित्व करेगा:

K = 1
M = 2
B = 3
T = 4
a = 5 
...
z = 31 (I may be off on this)
aa = 32
...
az = 58
ba = 59
...
...

1

और बड़ी संख्या को संभालने का आसान तरीका बस एक से अधिक INTEGER मान होना चाहिए फिर कोई भी अतिप्रवाह करना। यदि आपके पास 16-बिट INT मान (0 से 65535) है और आप उससे अधिक चाहते हैं, तो एक पंक्ति में दो 16-बिट INT मानों का उपयोग करें। इसे एक BYTE मान (0 से 255) मानने की तरह सोचें, लेकिन केवल 99 अंकों के मूल्य का उपयोग करके। एक बार जब यह 100 हिट करता है, तो इसे अगले उच्च BYTE मूल्य पर रोल करें जितने उपयोगी होते हैं उतने अंकों के लिए। आज के GHZ कंप्यूटर के साथ, यहां तक ​​कि मैला कोडिंग भी ठीक है।

बेशक, एक विकल्प है जो थोड़ा तेज है।
यदि आप एक संख्या में बार-बार 18 जोड़ रहे हैं, तो यह केवल 2 को घटाना और 20 जोड़ना है। 18, 36, 54, 72, 90, 108, ... 18 = 20 + (- 2)।
यह बाइनरी में भी काम करता है। (बाइनरी में समान दशमलव मान) 10010, 100100, 110110, 1001000
DEC (18) = BIN (10010)
आसान बाइनरी पार्सिंग को छोड़कर, आपको 18 = 16 + 2
DEC (16 + 2) = BIN (10000 +) के बारे में सोचना होगा 00010)। यदि मान 15 था, तो इसे बाइनरी में 16 जोड़ने और 1 (10000-00001) घटाकर के रूप में सोचें।

इस तरह, आप संख्या मूल्य को प्रति माननीय सीमा तक रख सकते हैं।
यदि आप एक बुनियादी 16-बिट INT मान (0 से 65535) को 4-अंकों की दशमलव सीमा (0 से 9999) तक सीमित करने के लिए मैला कोडिंग विधि का उपयोग कर रहे हैं, तो आपको यह सब करना होगा जब मूल्य 9999 सीमा से अधिक हो, इसमें से 9999 को घटाएं और इसे अगले वैल्यू चंक पर ले जाएं (क्योंकि आप मूल रूप से एक असली बाइनरी कम्प्यूटेशन के साथ संख्याओं के साथ "जोड़ और घटाते हैं")।

आदर्श रूप से, आप केवल स्कूल स्कूल में सीखे गए SYMBOLIC MATH का उपयोग करेंगे। यह कैसे काम करता है। यदि आपके पास 1 का दशमलव प्रतीक है और आप इसे 1 में जोड़ते हैं, तो आपको 2 का दशमलव प्रतीक मिलता है। इसका कारण यह है कि मैं इस प्रतीक को कहता हूं कि आप किसी भी प्रतीक श्रृंखला का उपयोग "IF symbol X (1) के लुकअप टेबल के साथ कर सकते हैं। को X (4) के आउटपुट चिह्न X (5) में जोड़ा गया है। प्रतीक X (1) एक बिल्ली की तस्वीर हो सकती है और प्रतीक X (4) PERCENT संकेत हो सकता है, लेकिन इससे कोई फर्क नहीं पड़ता। आपके पास अपने प्रतीक हैं, जो कुछ भी होता है उसकी एक बुनियादी नियम पुस्तिका संयुक्त होती है (जैसे कि एक बच्चे के रूप में आपके द्वारा कंठस्थ किए गए गुणन सारणी की तरह) और क्या प्रतीक को उस ऑपरेशन के एक भाग के रूप में परिणाम करना चाहिए। प्रतीकात्मक गणित का उपयोग करके आप अनंत अंकों को जोड़ सकते हैं, जबकि वास्तव में आपके प्रोसेसर की संख्यात्मक सीमा को कभी नहीं बुलाते हैं।

आसान कोडिंग में ऐसा करने का एक तरीका यह है कि आप प्रत्येक प्रतिनिधित्व वाले अंक को एक बड़े आयाम वाले सरणी में एकल इकाई के रूप में काम करना चाहते हैं। यदि आप 4096 दशमलव अंकों (प्रति यूनिट बॉक्स में 2 अंकों से अधिक नहीं) का प्रतिनिधित्व करना चाहते हैं, तो आप 4096 BYTE सरणी स्थानों के 2 सेट आवंटित करते हैं। 1098874 के मान को संग्रहीत करने से (1) (0) (9) (8) (8) (7) (4) के रूप में सरणी का उपयोग होगा। यदि आपने इसमें 7756 का मान जोड़ा है, तो आप इसे (7) (7) (5) (6) में बदल देंगे और फिर जोड़ देंगे। इसका परिणाम (1) (0) (9) (15) (15) (12) (10) होगा, जिसे तब आप दाएं-से-बाएं घटाना शिफ्ट करेंगे जब तक कि सभी अंकों के बक्से का मान सामान्य नहीं हो जाता (0) 9)। सबसे दाएं (10) मान में 10 घटाया जाएगा और परिणामी मूल्य शून्य (0) होगा और यह (1) मान (12) के अगले-बाएँ बॉक्स (13) को ले जाने के लिए होगा (13) जो तब 10 होगा इसे (3) बनाने के लिए घटाया गया।



5
अरे @Gridlock, मैंने अभी देखा कि आप एक पूरी तरह से नए उपयोगकर्ता हैं - आपका स्वागत है। मुझे स्पष्ट करना चाहिए कि मेरा पतन स्थायी नहीं है; यह रचनात्मक आलोचना के रूप में अभिप्रेत है। आपके द्वारा प्रदत्त उत्तर का मूल्य है, और आपके द्वारा अनुरोधित सुधार करने के बाद मुझे इसे अपवोट में बदलने से अधिक खुशी होगी। इसके अलावा, ध्यान रखें कि एसई एक मंच नहीं है; एक अच्छा जवाब पढ़ा नहीं जाता है और फिर भूल जाता है, बल्कि समय के साथ लाभांश का भुगतान करता है। यहाँ और अपने उत्तरों को संशोधित करने से समुदाय और आपके प्रतिनिधि को मदद मिलती है। मुझे आशा है कि मैंने आपको नहीं डराया; फिर से, आपका स्वागत है और मुझे आशा है कि आप मेरी सलाह का उपयोग करेंगे।
स्लिप डी। थॉम्पसन

1
एक अन्य सुझाव जो मैं पेश करूँगा, वह ऑल-कैप्स के बजाय कुछ बेसिक मार्कडाउन फॉर्मेटिंग का उपयोग कर रहा है। बैकटिक्स में टेक्स्ट रैपिंग ( `text`text) इसे मोनो-स्पेस, कोड के फंक्शन, फंक्शन नेम, डेटा आदि के लिए उपयुक्त बना देगा। अंडरस्कोर या एस्टेरिस्क में टेक्स्ट रैप करना इसे इटैलिक ( _text_या *text*टेक्स्ट ) और डबल-अंडरस्कोर या डबल- डबल कर देगा। तारांकन इसे बोल्ड ( __text__या **text**टेक्स्ट ) बना देगा।
स्लिप डी। थॉम्पसन

0

आपके द्वारा किए गए कई चर संयुक्त होते हैं, और फिर आप स्वयं के बीच जोड़ और अतिप्रवाह को नियंत्रित करते हैं। आपके पास किसी भी तरह के अंक हो सकते हैं। 10,000 32-बिट पूर्णांकों को मिलाएं, और आपके पास 32,000 बिट्स के साथ एक संख्या है, यदि ऐसा है तो आपको आवश्यकता है। किसी भी प्रोग्रामिंग भाषा में कोई सीमा नहीं है। एकमात्र सीमा वह है जो आप समझ सकते हैं।


उन लोगों के लिए जिन्होंने नीचे दिया, क्या आप बता सकते हैं कि क्यों? भले ही यह एक लोकप्रिय समाधान नहीं है, या एक जिसे शून्य प्रयास की आवश्यकता है, यह अभी भी एक समाधान है, और एक जो आपको भाषाओं / प्लेटफार्मों पर भी ऐसा करने की अनुमति दे सकता है जो समर्थन नहीं करते हैं doubleया BigInteger
टॉमटैग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.