बॉलिंग

बॉलिंग

कठिन

निर्देश

बॉलिंग के खेल का स्कोर बनाइए।

बॉलिंग एक खेल है जिसमें खिलाड़ी एक भारी गेंद लुढ़काकर त्रिभुज के आकार में सजी पिन गिराते हैं। बॉलिंग के खेल का स्कोर दर्ज रखने के लिए कोड लिखिए।

बॉलिंग का स्कोर

एक खेल में 10 फ्रेम होते हैं। हर फ्रेम में एक या दो बार गेंद फेंकी जाती है, और फ्रेम शुरू होते समय 10 पिन खड़ी रहती हैं। फ्रेम का स्कोर निकालने के लिए तीन स्थितियाँ होती हैं।

  • ओपन फ्रेम वह है जिसमें उस फ्रेम का स्कोर 10 से कम दर्ज होता है। इस मामले में फ्रेम का स्कोर गिराई गई पिन की संख्या के बराबर होता है।

  • स्पेयर वह फ्रेम है जिसमें दूसरी बार गेंद फेंकने पर सभी दस पिन गिर जाती हैं। स्पेयर का कुल मान 10 और अगली बार गेंद फेंकने पर गिराई गई पिन की संख्या के जोड़ के बराबर होता है।

  • स्ट्राइक वह फ्रेम है जिसमें पहली बार गेंद फेंकने पर सभी दस पिन गिर जाती हैं। स्ट्राइक का कुल मान 10 और अगली दो बार गेंद फेंकने पर गिराई गई पिन की संख्या के जोड़ के बराबर होता है। अगर किसी स्ट्राइक के ठीक बाद दूसरा स्ट्राइक हो जाए, तो एक और गेंद फेंके जाने तक पहले स्ट्राइक का मान तय नहीं हो पाता।

यहाँ तीन फ्रेम का एक उदाहरण है:

फ्रेम 1 फ्रेम 2 फ्रेम 3
X (स्ट्राइक) 5/ (स्पेयर) 9 0 (ओपन फ्रेम)

फ्रेम 1 का स्कोर (10 + 5 + 5) = 20 है।

फ्रेम 2 का स्कोर (5 + 5 + 9) = 19 है।

फ्रेम 3 का स्कोर (9 + 0) = 9 है।

यानी इस समय तक का कुल जोड़ 48 है।

खेल का दसवाँ फ्रेम एक खास मामला है। अगर कोई खिलाड़ी स्पेयर या स्ट्राइक करता है, तो उसे क्रमशः एक या दो फिल बॉल मिलती हैं। फिल बॉल दसवें फ्रेम का कुल स्कोर निकालने के लिए ही होती हैं। फिल बॉल पर स्ट्राइक या स्पेयर होने से खिलाड़ी को और फिल बॉल नहीं मिलतीं। दसवें फ्रेम का कुल मान गिराई गई कुल पिन की संख्या के बराबर होता है।

X1/ (स्ट्राइक और स्पेयर) वाले दसवें फ्रेम का कुल मान 20 होता है।

XXX (तीन स्ट्राइक) वाले दसवें फ्रेम का कुल मान 30 होता है।

आवश्यकताएँ

बॉलिंग के खेल के स्कोर का हिसाब रखने के लिए कोड लिखिए। इस कोड में दो काम होने चाहिए:

  • जब भी खिलाड़ी गेंद फेंकता है, हर बार roll(pins : int) को कॉल किया जाता है। इसका आर्गुमेंट बताता है कि कितनी पिन गिरीं।
  • score() : int को खेल के बिलकुल अंत में ही कॉल किया जाता है। यह उस खेल का कुल स्कोर लौटाता है।

शब्द

एक game ट्यूपल और एक कंस्ट्रक्टर <game> ( -- game ) बनाइए। यह कंस्ट्रक्टर बिना किसी रोल वाला नया गेम लौटाता है।

गेम पर काम करने वाले ये शब्द दीजिए:

  • roll ( pins game -- ): यह दर्ज करता है कि pins पिन गिर गए। रोल अमान्य होने पर एरर फेंकिए:
    • पिन की संख्या ऋणात्मक होने पर "Negative roll is invalid"।
    • जब सारे दस फ्रेम (और कोई भी फिल बॉल) रोल हो चुके हों, तब "Cannot roll after game is over"।
    • जब लेन पर खड़े पिनों से अधिक पिन गिर जाएँ, तब "Pin count exceeds pins on the lane"।
  • score ( game -- n ): गेम का कुल स्कोर। जब गेम अभी पूरा न हुआ हो, तब "Score cannot be taken until the end of the game" फेंकिए।

ध्यान दीजिए कि यहाँ roll नाम kernel शब्दावली के roll शफल शब्द को छिपा देता है। टेस्ट सूट FROM: bowling => roll ; लिखकर यह स्पष्ट करता है कि किस roll का इस्तेमाल करना है।

GitHub के ज़रिए संपादित करें यह लिंक एक नई विंडो या टैब में खुलता है
Factor Exercism

बॉलिंग शुरू करने के लिए तैयार हैं?

Exercism पर साइन अप कीजिए और Factor को 47 कॉन्सेप्ट163 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।