بلک‌جک

بلک‌جک

تمرین یادگیری

مقدمه

Go هم مانند زبان‌های دیگر، دستور switch را در اختیار شما قرار می‌دهد. دستور switch روشی کوتاه‌تر برای نوشتن دستورهای طولانی if ... else if است. برای ساختن یک switch، ابتدا از کلیدواژه‌ی switch استفاده می‌کنیم و بعد از آن یک مقدار یا عبارت می‌آوریم. سپس هر یک از شرط‌ها را با کلیدواژه‌ی case اعلام می‌کنیم. همچنین می‌توانیم یک حالت default تعریف کنیم که وقتی هیچ‌یک از شرط‌های case پیشین برقرار نباشد، اجرا می‌شود:

operatingSystem := "windows"

switch operatingSystem {
case "windows":
    // do something if the operating system is windows
case "linux":
    // do something if the operating system is linux
case "macos":
    // do something if the operating system is macos
default:
    // do something if the operating system is none of the above
} 

یک نکته‌ی جالب درباره‌ی دستور switch این است که می‌توان مقدار بعد از کلیدواژه‌ی switch را حذف کرد و برای هر case یک شرط «منطقی» نوشت:

age := 21

switch {
case age > 20 && age < 30:
    // do something if age is between 20 and 30
case age == 10:
    // do something if age is equal to 10
default:
    // do something else for every other case
}

دستورالعمل‌ها

در این تمرین، اولین نوبت یک بازی Blackjack را شبیه‌سازی می‌کنیم.

شما دو کارت دریافت می‌کنید و می‌توانید کارت روباز دیلر را ببینید. همه‌ی کارت‌ها با رشته‌ای مانند "ace"، "king"، "three"، "two" و غیره نمایش داده می‌شوند. ارزش هر کارت به این شرح است:

کارت ارزش کارت ارزش
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 سایر 0

نکته: معمولاً آس‌ها می‌توانند ارزش ۱ یا ۱۱ داشته باشند، اما برای سادگی فرض می‌کنیم که فقط ارزش ۱۱ را دارند.

بسته به دو کارت شما و کارت دیلر، برای نوبت اول بازی استراتژی‌ای وجود دارد که در آن این گزینه‌ها را دارید:

  • ایستادن (S)
  • کارت گرفتن (H)
  • تقسیم کردن (P)
  • برد خودکار (W)

هرچند این استراتژی هنوز بهینه نیست، شما استراتژی‌ای را دنبال می‌کنید که دوستتان Alex در حال توسعه‌ی آن بوده است. این استراتژی به این صورت است:

  • اگر یک جفت آس داشته باشید، باید همیشه آن دو را تقسیم کنید.
  • اگر یک Blackjack داشته باشید (دو کارت که مجموعشان ۲۱ می‌شود) و دیلر آس، کارت تصویری (Jack/Queen/King) یا ده نداشته باشد، به‌طور خودکار برنده می‌شوید. اگر دیلر یکی از این کارت‌ها را داشته باشد، باید بایستید و صبر کنید تا کارت دیگر رو شود.
  • اگر مجموع کارت‌هایتان در بازه‌ی [۱۷، ۲۰] باشد، باید همیشه بایستید.
  • اگر مجموع کارت‌هایتان در بازه‌ی [۱۲، ۱۶] باشد، باید همیشه بایستید، مگر اینکه دیلر ۷ یا بالاتر داشته باشد، که در این صورت باید همیشه کارت بگیرید.
  • اگر مجموع کارت‌هایتان ۱۱ یا کمتر باشد، باید همیشه کارت بگیرید.

1. محاسبه‌ی ارزش هر کارت

تابعی پیاده‌سازی کنید که ارزش عددی یک کارت را محاسبه کند:

value := ParseCard("ace")
fmt.Println(value)
// Output: 11

2. پیاده‌سازی منطق تصمیم‌گیری برای نوبت اول

تابعی بنویسید که منطق تصمیم‌گیری توصیف‌شده در بالا را پیاده‌سازی کند:

func FirstTurn(card1, card2, dealerCard string) string

در ادامه چند نمونه از نتایج مورد انتظار را می‌بینید:

FirstTurn("ace", "ace", "jack") == "P"
FirstTurn("ace", "king", "ace") == "S"
FirstTurn("five", "queen", "ace") == "H"
ویرایش از طریق GitHub این لینک در پنجره یا زبانه‌ی جدیدی باز می‌شود
Go Exercism

آماده‌اید بلک‌جک را شروع کنید؟

در Exercism ثبت‌نام کنید تا Go را همراه با 35 مفهوم167 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.