2025, Nov 01 21:01

टेबलटॉप d12 रोल में Hope और Fear को 6 पर सीमित करने के Python तरीके

दो d12 रोल पर Hope/Fear काउंटर को 6 पर सीमित करें: Python में guarded increment और min से क्लैम्पिंग, randint का सही उपयोग, खर्च में शून्य से नीचे न जाए सुरक्षा.

जब आप एक टेबलटॉप मेकॅनिक के लिए पासों के रोल को ऑटोमेट करते हैं, जो दो संसाधनों पर नज़र रखता है, तो अक्सर लगता है कि किसी वैरिएबल को अधिकतम मान पर “लॉक” किया जा सकता है। लेकिन Python में किसी वैरिएबल को सीधे कड़े अधिकतम पर बाँधने का कोई अंतर्निहित तरीका नहीं है। यदि आप दो d12 रोल के आधार पर Hope और Fear को 6 तक बढ़ाते हैं, तो यह सीमा आपको खुद कोड में तय करनी होगी।

समस्या की रूपरेखा

दो d12 फेंके जाते हैं। यदि Hope वाला पासा Fear वाले पासे से बड़ा आता है, तो Hope 1 से बढ़ती है। यदि Fear जीतता है, तो Fear 1 से बढ़ती है। कोई भी संसाधन 6 से ऊपर नहीं जा सकता। नीचे एक छोटा सा अंश है जो बिना किसी सीमा के वृद्धि दिखाता है — इसलिए मान सीमा से आगे निकल सकता है:

if user_cmd == 'r':
    pos_d12 = int(random.randint(1, 12))
    neg_d12 = int(random.randint(1, 12))
    sum_roll = int(pos_d12) + int(neg_d12)
    print('You rolled {} with ...'.format(sum_roll))
    if pos_d12 > neg_d12:
        print('... hope')
        hope_pool += 1

असल समस्या कहाँ है

Python साधारण पूर्णांकों पर कोई ऊपरी सीमा लागू नहीं करता। इसका अर्थ है कि जब तक आपका कोड कहेगा, मान बढ़ता रहेगा। अधिकतम लागू करने के लिए, या तो बढ़ाने से पहले मौजूदा मान जाँचें, या परिणाम को स्पष्ट रूप से अधिकतम पर क्लैम्प करें।

randint के परिणाम को int में कास्ट करने की भी जरूरत नहीं है। यह फ़ंक्शन पहले से ही एक पूर्णांक लौटाता है। दस्तावेज़ के अनुसार:

ऐसा कोई यादृच्छिक पूर्णांक N लौटाएँ जिसके लिए a <= N <= b हो। randrange(a, b+1) का उपनाम।

सीमा तय करने के दो भरोसेमंद तरीके

पहला तरीका है सुरक्षित (guarded) वृद्धि: केवल तभी 1 जोड़ें जब वर्तमान मान सीमा से सख्ती से कम हो:

if pos_d12 > neg_d12:
    if hope_pool < 6:
        hope_pool = hope_pool + 1

दूसरा तरीका: हमेशा 1 जोड़ने का प्रयास करें, फिर min का उपयोग करके परिणाम को क्लैम्प कर दें ताकि वह 6 से ऊपर न जाए:

if pos_d12 > neg_d12:
    hope_pool = min(hope_pool + 1, 6)

यदि hope_pool पहले से 6 है, तो min(6 + 1, 6) का मान 6 ही होगा, इसलिए मान सीमा में ही रहता है।

दोनों संसाधनों पर सीमा के साथ एकीकृत स्निपेट

नीचे दिया गया रिफैक्टर Hope और Fear दोनों पर guarded increment लागू करता है और randint तथा योग पर अनावश्यक int कास्ट हटाता है:

if user_cmd == 'r':
    pos_d12 = random.randint(1, 12)
    neg_d12 = random.randint(1, 12)
    sum_roll = pos_d12 + neg_d12
    print('You rolled {} with ...'.format(sum_roll))
    if pos_d12 > neg_d12:
        print('... hope')
        if hope_pool < 6:
            hope_pool = hope_pool + 1
    if pos_d12 < neg_d12:
        print('... fear')
        if fear_pool < 6:
            fear_pool = fear_pool + 1
    if pos_d12 == neg_d12:
        print('Doubles! An extreme event')
        print('%s Hope, %s Fear' % (hope_pool, fear_pool))

यदि आपको क्लैम्पिंग शैली पसंद है, तो दोनों शाखाओं में guarded increment की जगह min का उपयोग करें, बाकी सब वैसा ही रखें:

if pos_d12 > neg_d12:
    print('... hope')
    hope_pool = min(hope_pool + 1, 6)
if pos_d12 < neg_d12:
    print('... fear')
    fear_pool = min(fear_pool + 1, 6)

संसाधन खर्च करते समय नकारात्मक मान से बचाव

जब कोई संसाधन खर्च हो, तो यह शून्य से नीचे न जाए — इसका ध्यान रखें। एक साधारण उपलब्धता जाँच पर्याप्त है:

if user_cmd == 'h':
    if hope_pool > 0:
        hope_pool = hope_pool - 1
        print('%s Hope, %s Fear' % (hope_pool, fear_pool))
    else:
        print('No hope available')

यह क्यों महत्वपूर्ण है

स्पष्ट सीमाएँ गेम की स्थिति को सुसंगत और पूर्वानुमेय रखती हैं। वे बिना शोर के ओवरफ्लो से बचाती हैं, किनारे के मामलों (जैसे पहले से अधिकतम पर पहुँचे संसाधन) को अस्पष्ट नहीं बनने देतीं, और काउंटर्स को अमान्य दायरे में भटकने से रोकती हैं। यह पूर्वानुमेयता साफ-सुथरे गेमप्ले लूप के लिए जरूरी है।

निष्कर्ष

Python में आप किसी वैरिएबल पर “अधिकतम सेट” नहीं करते—इसे तर्क से लागू करते हैं। बढ़ाने के लिए, या तो तुलना के साथ सुरक्षा करें या min से क्लैम्प करें। घटाने के लिए, पहले जाँच लें कि खर्च करने के लिए कुछ मौजूद है। randint के परिणाम वैसे ही रखें—वे पहले से पूर्णांक हैं—और आपका डाइस रोलर उम्मीद के मुताबिक चलेगा, संसाधन की सीमा कभी नहीं लांघेगा।

यह लेख StackOverflow पर एक प्रश्न (लेखक: Nienke) और StandingDuck के उत्तर पर आधारित है।