ট্র্যাক
/
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

কেস এক্সপ্রেশন ছাড়া কেস

কেস এক্সপ্রেশনের প্রয়োজন না থাকলে সেটি বাদ দেওয়া যায়। এভাবে করলে প্রতিটি কেস এক্সপ্রেশন সত্যতা হিসেবে মূল্যায়ন করা হয়। আর তখন এগুলো 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

নির্দেশনা

এই অনুশীলনীতে আমরা একটি ব্ল্যাকজ্যাক গেমের প্রথম চাল অনুকরণ করব।

1. যেকোনো কার্ডের মান বের করুন।

আপনি দুটি কার্ড পাবেন এবং ডিলারের খোলা কার্ডটি দেখতে পাবেন। সব কার্ডকে "ace", "king", "three", "two" ইত্যাদির মতো একটি স্ট্রিং দিয়ে প্রকাশ করা হয়। প্রতিটি কার্ডের মান হলো:

কার্ড মান কার্ড মান
ace ১১ eight ৮
two ২ nine ৯
three ৩ ten ১০
four ৪ jack ১০
five ৫ queen ১০
six ৬ king ১০
seven ৭ other ০
Note

সাধারণত ace-এর মান ১ বা ১১ হতে পারে, কিন্তু সহজ রাখতে আমরা ধরে নেব যে এর মান কেবল ১১-ই হতে পারে।

Blackjack.parse_card মেথডটি ইমপ্লিমেন্ট করুন, যা আর্গুমেন্ট হিসেবে একটি কার্ড স্ট্রিং নেয়। মেথডটি কার্ডের মানটি একটি ইন্টিজার হিসেবে রিটার্ন করবে।

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

2. মানের রেঞ্জগুলোর নাম দিন।

প্লেয়ারের স্কোরকে মানের রেঞ্জে ভাগ করতে হবে। প্লেয়ারের স্কোর হিসাব করা হয় প্লেয়ারের দুটি কার্ডের মান যোগ করে। যে রেঞ্জগুলো ব্যবহার করা হয় সেগুলো হলো:

রেঞ্জ মান
low [৪, ১১]
mid [১২, ১৬]
high [১৭, ২০]
blackjack [২১]

Blackjack.card_range মেথডটি ইমপ্লিমেন্ট করুন, যা আর্গুমেন্ট হিসেবে দুটি কার্ড স্ট্রিং নেয়। মেথডটি রিটার্ন করবে দুটি কার্ড যে মানের রেঞ্জে পড়ে তার নাম।

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

3. প্রথম চালের সিদ্ধান্তের লজিক ইমপ্লিমেন্ট করুন।

আপনার দুটি কার্ড এবং ডিলারের কার্ডের উপর নির্ভর করে গেমের প্রথম চালের জন্য একটি স্ট্র্যাটেজি আছে, যেখানে আপনার কাছে নিচের অপশনগুলো থাকে:

  • স্ট্যান্ড (S)
  • হিট (H)
  • স্প্লিট (P)
  • স্বয়ংক্রিয়ভাবে জেতা (W)

যদিও এটি এখনো অপ্টিমাল নয়, তবুও আপনি আপনার বন্ধু Alex-এর তৈরি করা স্ট্র্যাটেজিটি অনুসরণ করবেন, যা নিচের মতো:

  • আপনার কাছে ace-এর একটি জোড়া থাকলে সেটি সবসময় স্প্লিট করতে হবে।
  • আপনার কাছে ব্ল্যাকজ্যাক থাকলে (দুটি কার্ড যাদের মান যোগ করলে ২১ হয়) এবং ডিলারের কাছে ace, কোনো ফেস কার্ড বা ten না থাকলে আপনি স্বয়ংক্রিয়ভাবে জিতে যাবেন। ডিলারের কাছে এসব কার্ডের যেকোনো একটি থাকলে আপনাকে স্ট্যান্ড করতে হবে এবং অন্য কার্ডটি খোলার অপেক্ষা করতে হবে।
  • আপনার কার্ড দুটির মান যোগ করলে [১৭, ২০] রেঞ্জের মধ্যে পড়লে আপনাকে সবসময় স্ট্যান্ড করতে হবে।
  • আপনার কার্ড দুটির মান যোগ করলে [১২, ১৬] রেঞ্জের মধ্যে পড়লে আপনাকে সবসময় স্ট্যান্ড করতে হবে, যদি না ডিলারের কার্ড ৭ বা তার বেশি হয়; সেক্ষেত্রে আপনাকে সবসময় হিট করতে হবে।
  • আপনার কার্ড দুটির মান যোগ করলে ১১ বা তার কম হলে আপনাকে সবসময় হিট করতে হবে।

Blackjack.first_turn মেথডটি ইমপ্লিমেন্ট করুন, যা আর্গুমেন্ট হিসেবে তিনটি কার্ড স্ট্রিং নেয়। মেথডটি আপনার নেওয়া সিদ্ধান্তটি একটি স্ট্রিং হিসেবে রিটার্ন করবে।

Blackjack.first_turn("ace", "ace", "two")
# => "P"
GitHub-এর মাধ্যমে সম্পাদনা করুন লিংকটি একটি নতুন উইন্ডো বা ট্যাবে খোলে
Ruby Exercism

ব্ল্যাকজ্যাক শুরু করতে প্রস্তুত?

Exercism-এ সাইন আপ করুন, Ruby ট্র্যাকের 21টি কনসেপ্ট121টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।