मैं एक ऐसा टाइमर बनाने की कोशिश कर रहा हूं कि यह प्रत्येक 10 के लिए उपयोगकर्ता स्कोर से एक मान 1 घटा देगा। लेकिन एक बार जब मैं प्रोग्राम चलाता हूं और मेरे द्वारा लिखे गए कोड को ट्रिगर करने के लिए 30 के निशान तक प्रतीक्षा करता हूं, तो नीचे त्रुटि हुई। इसे करने का कोई बेहतर तरीका है?

def countdown():

    score=0
    stop_thread=True
    count=0
    while stop_thread and count<40:
        count=count+1
        time.sleep(0.5)
    if stop_thread:
        print("You took too long to guess. Your score is deducted by 1.")
        score=score-1
        if count==20:
            print("You took too long to guess again. Your score is deducted by 1 again.")
            score=score-1
    else:
        score=score

screenshot

-1
cena 19 मार्च 2020, 11:38
स्कोर का प्रारंभिक मूल्य क्या है?
 – 
Johnny
19 मार्च 2020, 11:42
क्षमा करें मैंने नहीं दिखाया। यह 0 है।
 – 
cena
19 मार्च 2020, 11:43
और स्टॉप_थ्रेड?
 – 
Johnny
19 मार्च 2020, 11:45
मेरा स्टॉप_थ्रेड बस स्टॉप_थ्रेड = सच है
 – 
cena
19 मार्च 2020, 11:47

2 जवाब

आपको पूरे तर्क से पहले score को इनिशियलाइज़ करना चाहिए, जो भी अधिकतम मूल्य आप चाहते थे कि छात्र के पास हो, यदि उसने बहुत अधिक समय नहीं लिया है:

score=0  # starts from 0
count=0
while stop_thread and count<40:
    count=count+1
    time.sleep(0.5)
if stop_thread:
    print("You took too long to guess. Your score is deducted by 1.")
    score=score-1
    if count==20:
        print("You took too long to guess again. Your score is deducted by 1 again.")
        score=score-1
else:
    score=score
1
arnaud 19 मार्च 2020, 11:42
लेकिन यह स्कोर = 0 सहित भी घटाना जारी नहीं रखता है।
 – 
cena
19 मार्च 2020, 11:45

जैसा कि @Arnaud ने कहा था, आपको score वैरिएबल को इनिशियलाइज़ करने का प्रयास करने से पहले इसे इनिशियलाइज़ करना होगा।

लेकिन बड़ा मुद्दा यह है कि आपको इसके लिए थ्रेडिंग के बजाय एसिंक्रोनस I/O (और टाइमर) डिज़ाइन का उपयोग करने पर विचार करना चाहिए। अपने प्रोग्राम को मुख्य ईवेंट लूप के आसपास डिज़ाइन करें; और गैर-अवरुद्ध संचालन या संचालन करते समय इनपुट के लिए जांच करें, डिस्प्ले अपडेट करें, और अन्य एसिंक्रोनस घटनाओं (टाइमर समाप्ति) की जांच करें, जो केवल छोटे अंतराल के लिए इनपुट पर अवरुद्ध होते हैं (जैसे नए चयनकर्ता या पुराने, निचले स्तर, चुनें मानक पुस्तकालय से मॉड्यूल, या ascynio उच्च स्तरीय प्रणाली।

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

वह मुख्य पाश खेल के लिए राज्य मशीन को लागू करता है। परिचय प्रदर्शित करना, मुख्य खेल खेलना, इन टाइमर घटनाओं को संभालना, जीत / हानि की स्थिति का पता लगाना और खेल के अगले दौर में वापस लूप करने के लिए स्कोर और विकल्प प्रदर्शित करना, जैसा उपयुक्त हो।

थ्रेड्स का प्रयास करते समय एक ठोस डिज़ाइन होना महत्वपूर्ण है। मल्टीटास्किंग और मल्टीथ्रेडिंग के लिए डिज़ाइन प्राइमेटिव के रूप में सुसंगत कतार अविश्वसनीय रूप से उपयोगी हैं।

0
Jim Dennis 19 मार्च 2020, 11:58
धागे मेरे जैसे किसी के लिए जटिल लगता है जो अभी बहुत पहले अजगर में शुरू नहीं होता है। वर्तमान में मैं अपने जल्लाद कार्यक्रम के लिए ज्यूपिटर का उपयोग कर रहा हूं, इसलिए मुझे लगता है कि ज्यूपिटर में धागे अभी भी लागू हैं? और यदि ऐसा है तो मुझे किस प्रकार की उपयुक्त कतार वस्तुओं को जोड़ना चाहिए?
 – 
cena
19 मार्च 2020, 12:13
क्षमा करें, मैंने प्रश्न को गलत तरीके से पढ़ा। मैंने सोचा था कि आप पहले से ही कुछ थ्रेडिंग लॉजिक के साथ ऐसा करने की कोशिश कर रहे थे (कोड स्निपेट में नहीं दिखाया गया)। इसलिए हां। इससे पहले कि आप उन्हें "संदर्भित" करने का प्रयास करने से पहले अपने चर को प्रारंभ करें ... इससे पहले कि आप उनके पूर्व मूल्य के आधार पर कुछ भी करने का प्रयास करें जैसे score=score-1 या , अधिक मुहावरेदार रूप से: स्कोर -= 1 (संवर्धित असाइनमेंट)।
 – 
Jim Dennis
19 मार्च 2020, 12:18
लेकिन मुझे जिस समस्या का सामना करना पड़ रहा है वह यह है कि परिवर्तनीय स्कोर = 0 शुरू करने के बाद, यह 10 सेकंड के बाद कटौती करना जारी नहीं रखता है जैसा कि मेरे प्रयास में दिखाया गया है अगर गिनती == 20: आगे ...
 – 
cena
19 मार्च 2020, 12:23
तो आप इन चरों को अपनी फ़ंक्शन परिभाषा में प्रारंभ कर रहे हैं। लेकिन इसका मतलब है कि आप उन्हें समारोह के प्रत्येक आह्वान के लिए फिर से शुरू कर रहे हैं। वे कॉल के बीच अपने मूल्यों को बरकरार नहीं रख रहे हैं। यह फ़ंक्शन शायद एक वर्ग होना चाहिए, या आपको एक कॉल (आह्वान) और अगले के बीच राज्य को बनाए रखने के लिए एक परिवर्तनीय वस्तु (शब्दकोश) पास करना चाहिए और वापस करना चाहिए।
 – 
Jim Dennis
21 मार्च 2020, 02:52