ट्रैक
/
Ruby
Ruby
/
अभ्यास
/
ब्लैकजैक
ब्लैकजैक

ब्लैकजैक

सीखने का अभ्यास

परिचय

केस (अक्सर दूसरी भाषाओं में इसे switch कहा जाता है), if-else की तरह कंट्रोल एक्सप्रेशन का ही एक रूप है। केस की मदद से कई if-else-if स्टेटमेंट एक साथ जोड़े जा सकते हैं। ऐसा कोड पढ़ने में ज़्यादा साफ़ लगता है, और फ्लो कंट्रोल भी बना रहता है।

केस case कीवर्ड से बनता है, जिसके बाद एक वैकल्पिक एक्सप्रेशन लिखा जाता है। फिर हर केस के लिए when कीवर्ड लिखा जाता है, और उसके बाद वह एक्सप्रेशन आता है जिसकी तुलना केस एक्सप्रेशन से की जाती है। when कीवर्ड को case कीवर्ड से अधिक इंडेंट नहीं करना चाहिए। when कीवर्ड के बाद वह कोड लिखा जाता है जो तब चलाया जाता है जब केस एक्सप्रेशन और when एक्सप्रेशन मेल खाते हैं। केस में एक वैकल्पिक else स्टेटमेंट भी लिखा जा सकता है, जो तब चलता है जब कोई और केस मेल नहीं खाता।

केस एक्सप्रेशन का मूल्यांकन किया जाता है, और फिर उसकी तुलना हर when एक्सप्रेशन से की जाती है। तुलना के लिए केस समानता ऑपरेटर (===) का उपयोग किया जाता है।

value = 1
case value
when 1
  "One"
when 2
  "Two"
else
  "Other"
end

# This is the same as:
value = 1
if 1 === value
  "One"
elsif 2 === value
  "Two"
else
  "Other"
end

केस समानता ऑपरेटर (===)

केस समानता ऑपरेटर (===) समानता ऑपरेटर (==) से थोड़ा अलग है। यह ऑपरेटर जाँचता है कि दाईं ओर की वैल्यू, बाईं ओर बताए गए समूह का सदस्य है या नहीं। इसका मतलब है कि यह मायने रखता है कि हर ऑपरेंड किस तरफ़ रखा गया है। यह कैसे काम करता है, यह बाईं ओर के टाइप पर निर्भर करता है। जैसे Range यह जाँचता है कि दाईं ओर की वैल्यू रेंज के अंदर है या नहीं, और Object यह जाँचता है कि दाईं ओर की वैल्यू Object का इंस्टेंस है या नहीं।

(1..3) == 1  # => false
(1..3) === 1 # => true

String == "foo"  # => false
String === "foo" # => true

एक से ज़्यादा एक्सप्रेशन वाले केस

केस में एक ही जगह कई एक्सप्रेशन मैच किए जा सकते हैं, जहाँ हर संभव वैल्यू को कॉमा से अलग किया जाता है। अगर इनमें से कोई भी एक्सप्रेशन मैच हो जाए, तो कोड चल जाता है। यह तब काम आता है जब आप चाहते हैं कि एक ही केस के लिए कई संभव वैल्यू हों।

case var
when 1, 2
  "One or two"
else
  "Other"
end

रेंज वाले केस

केस यह भी जाँच सकता है कि कोई वैल्यू किसी रेंज के अंदर है या नहीं। इसके लिए when एक्सप्रेशन के रूप में एक रेंज का उपयोग किया जाता है।

case var
when 1..3
  puts "One to three"
else
  puts "Other"
end

जब कोई केस एक्सप्रेशन न हो

जब केस एक्सप्रेशन की ज़रूरत न हो, तो उसे छोड़ा जा सकता है। ऐसा करने पर हर when एक्सप्रेशन की जाँच केवल इस आधार पर की जाती है कि वह सही है या नहीं। इससे ये if-else-if स्टेटमेंट की तरह व्यवहार करते हैं।

case
when 1 == 1
  "One is equal to one"
when 1 > 2
  "One is greater than two"
else
  "Other"
end

एक ही लाइन में when

Ruby में एक ही लाइन वाले केस स्टेटमेंट लिखे जा सकते हैं। इसका उपयोग तब किया जा सकता है जब आपके पास कोई सरल, एक लाइन वाला स्टेटमेंट हो। एक लाइन वाला when स्टेटमेंट इस तरह लिखा जाता है: when <expression> then <statement>। और जब इसे else स्टेटमेंट में इस्तेमाल किया जाता है, तो यह else <statement> लिखा जाता है।

case var
when 1 then "One"
when 2 then "Two"
else "Other"
end

टाइप के साथ केस

केस की मदद से टाइप के आधार पर भी मैच किया जा सकता है। यह तब काम आता है जब वेरिएबल के टाइप के हिसाब से अलग-अलग व्यवहार चाहिए हो।

case var
when Integer
  "Integer"
when String
  "String"
else
  "Other"
end

निर्देश

इस अभ्यास में हम Blackjack खेल की पहली बारी का अनुकरण करेंगे।

1. किसी भी दिए गए कार्ड की वैल्यू निकालिए

आपको दो कार्ड मिलेंगे और आप डीलर का खुला हुआ कार्ड देख पाएँगे। सभी कार्ड एक स्ट्रिंग से दर्शाए जाते हैं, जैसे "ace", "king", "three", "two" इत्यादि। हर कार्ड की वैल्यू यह है:

card value card value
ace 11 eight 8
two 2 nine 9
three 3 ten 10
four 4 jack 10
five 5 queen 10
six 6 king 10
seven 7 other 0
Note

आम तौर पर ace की वैल्यू 1 या 11 हो सकती है, लेकिन सरलता के लिए हम मान लेंगे कि ये केवल 11 की वैल्यू ले सकते हैं।

Blackjack.parse_card मेथड बनाइए, जो आर्गुमेंट के रूप में एक कार्ड को स्ट्रिंग के रूप में लेता है। मेथड को कार्ड की वैल्यू पूर्णांक के रूप में लौटाना चाहिए।

Blackjack.parse_card("ace")
# => 11

2. वैल्यू के रेंज को नाम दीजिए

खिलाड़ी के स्कोर को वैल्यू के रेंज में बाँटा जाता है। खिलाड़ी का स्कोर उसके दोनों कार्ड की वैल्यू जोड़कर निकाला जाता है। जिन रेंजों का इस्तेमाल किया जाता है, वे ये हैं:

range value
low [4, 11]
mid [12, 16]
high [17, 20]
blackjack [21]

Blackjack.card_range मेथड बनाइए, जो आर्गुमेंट के रूप में दो कार्ड को स्ट्रिंग के रूप में लेता है। मेथड को उस रेंज का नाम लौटाना चाहिए जिसमें ये दोनों कार्ड आते हैं।

Blackjack.card_range("ten", "king")
# => "high"

3. पहली बारी के लिए फैसला लेने का लॉजिक बनाइए

आपके दो कार्ड और डीलर के कार्ड के आधार पर खेल की पहली बारी के लिए एक रणनीति होती है, जिसमें आपके पास ये विकल्प होते हैं:

  • रुकना (S)
  • कार्ड लेना (H)
  • जोड़ी अलग करना (P)
  • अपने आप जीत जाना (W)

हालाँकि यह अभी सबसे अच्छी नहीं है, फिर भी आप उस रणनीति का पालन करेंगे जिसे आपका दोस्त Alex तैयार कर रहा है। वह इस प्रकार है:

  • अगर आपके पास दो ace हैं तो आपको उन्हें हमेशा अलग करना होता है।
  • अगर आपके पास Blackjack है (दो कार्ड जिनकी वैल्यू जोड़कर 21 बनती है), और डीलर के पास ace, कोई फेस कार्ड या ten नहीं है, तो आप अपने आप जीत जाते हैं। अगर डीलर के पास इनमें से कोई कार्ड है, तो आपको रुकना होगा और दूसरे कार्ड के खुलने का इंतज़ार करना होगा।
  • अगर आपके कार्डों की वैल्यू जोड़कर [17, 20] के रेंज में आती है, तो आपको हमेशा रुकना चाहिए।
  • अगर आपके कार्डों की वैल्यू जोड़कर [12, 16] के रेंज में आती है, तो आपको हमेशा रुकना चाहिए, सिवाय इसके कि डीलर के पास 7 या उससे बड़ा कार्ड हो; ऐसी स्थिति में आपको हमेशा कार्ड लेना चाहिए।
  • अगर आपके कार्डों की वैल्यू जोड़कर 11 या उससे कम होती है, तो आपको हमेशा कार्ड लेना चाहिए।

Blackjack.first_turn मेथड बनाइए, जो आर्गुमेंट के रूप में तीन कार्ड को स्ट्रिंग के रूप में लेता है। मेथड को वह फैसला स्ट्रिंग के रूप में लौटाना चाहिए जो आपको लेना चाहिए।

Blackjack.first_turn("ace", "ace", "two")
# => "P"
GitHub के ज़रिए संपादित करें यह लिंक एक नई विंडो या टैब में खुलता है
Ruby Exercism

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

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