Blackjack

Blackjack

Tanulófeladat

Bevezetés

case (más nyelvekben gyakran switch néven ismert) egy vezérlési kifejezés, akárcsak az if-else. A case lehetővé teszi több if-else-if utasítás láncolását, olvashatóbb lehet, és hatékony szerkezeteket tesz lehetővé.

A case-t a case kulcsszó vezeti be, amelyet egy opcionális kifejezés követ. Ezután minden ágnál a when kulcsszót használjuk, amelyet egy kifejezés követ; ezt hasonlítja össze a program a case kifejezésével. A when kulcsszó ne legyen beljebb húzva, mint a case kulcsszó. A when kulcsszó után az a kód áll, amely akkor fut le, ha a case kifejezés megegyezik a when kifejezéssel. A case megenged egy opcionális else ágat is, amely akkor fut le, ha egyetlen másik ág sem illeszkedik.

A case kifejezés kiértékelése után a program összehasonlítja minden when kifejezéssel. Az összehasonlítás a case-illesztés operátorával (===) történik.

case 1
when 1
  puts "One"
when 2
  puts "Two"
else
  puts "Other"
end
# => One

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

A case-illesztés operátora (===)

A case-illesztés operátora (===) némileg eltér az egyenlőség operátorától (==). Ez az operátor azt vizsgálja, hogy a jobb oldal eleme-e a bal oldal által leírt halmaznak. Ez azt jelenti, hogy számít, melyik operandus hova kerül. A működés a bal oldal típusától függ: például egy Range azt ellenőrzi, hogy a jobb oldal benne van-e a tartományban, egy Object pedig azt, hogy a jobb oldal a Object egy példánya-e.

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

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

case több kifejezéssel

A case lehetővé teszi, hogy egyetlen ágban több kifejezést adjunk meg, az egyes lehetséges értékeket vesszővel elválasztva. A kód akkor fut le, ha a kifejezések bármelyike illeszkedik. Ez akkor lehet hasznos, ha egy ághoz több lehetséges érték tartozik.

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

case tartományokkal

A case azt is ellenőrizheti, hogy egy érték benne van-e egy tartományban. Ehhez a when kifejezésként egy tartományt adunk meg.

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

A case kifejezés elhagyása

Ha nincs szükség a case kifejezésre, el is hagyható. Ekkor minden when kifejezés igaz vagy hamis értéke dönt az illeszkedésről, így úgy viselkednek, mint az if-else-if utasítások.

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

Egysoros when

A Crystal megengedi az egysoros case utasításokat. Ez akkor hasznos, ha egy egyszerű, egysoros utasításod van. Egysoros formában a when ágat így írod le: when <expression> then <statement>. Az else ágban pedig így: else <statement>.

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

case típusokkal

A case lehetővé teszi a típusok szerinti illesztést. Az összehasonlítás az is_a? operátort használja a változó típusának ellenőrzésére. Ez például lehetővé teszi, hogy egy uniótípus minden típusához külön ágat írjunk.

case var
when Int32
  puts "Int32"
when String
  puts "String"
else
  puts "Other"
end

Az implicit objektum

A case lehetővé teszi egy implicit objektum használatát. Ennek köszönhetően például egy when kifejezés metódushívás lehet a case kifejezésen. Attól függően, hogy a metódus igaz vagy hamis értéket ad vissza, az ág illeszkedni fog vagy sem.

case 1
when .odd?
  puts "Odd"
when .even?
  puts "Even"
end

Utasítások

Ebben a feladatban egy Blackjack-játék első körét szimuláljuk.

1. Számítsd ki bármely megadott kártya értékét.

Két kártyát kapsz, és látni fogod az osztó felfordított lapját. A kártyákat stringként adjuk meg, például „ace”, „king”, „three”, „two” és így tovább. Az egyes kártyák értékei:

kártya érték kártya érték
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 egyéb 0
Note

Az ászok általában 1-et vagy 11-et érhetnek, de az egyszerűség kedvéért most azt feltételezzük, hogy csak 11-et érhetnek.

Valósítsd meg a Blackjack.parse_card metódust, amely argumentumként egy kártyát kap stringként. A metódusnak egész számként kell visszaadnia a kártya értékét.

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

2. Nevezd el az értéktartományokat.

A játékos pontszámát értéktartományokba kell sorolni. A játékos pontszámát úgy számítjuk ki, hogy összeadjuk a két játékoskártya értékét. A használt tartományok:

tartomány érték
low [4, 11]
mid [12, 16]
high [17, 20]
blackjack [21]

Valósítsd meg a Blackjack.card_range metódust, amely argumentumként két kártyát kap stringként. A metódusnak vissza kell adnia annak az értéktartománynak a nevét, amelybe a két kártya esik.

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

3. Valósítsd meg az első kör döntési logikáját.

A két kártyádtól és az osztó lapjától függően létezik egy stratégia a játék első körére, amelyben a következő lehetőségeid vannak:

  • Megállás (S)
  • Lapkérés (H)
  • Szétválasztás (P)
  • Automatikus győzelem (W)

Bár még nem optimális, azt a stratégiát követed, amelyet Alex barátod dolgozott ki, és amely a következő:

  • Ha két ászod van, azokat mindig szét kell választanod.
  • Ha Blackjacked van (két kártya, amelyek összege 21), és az osztónál nincs ász, figura vagy tízes, akkor automatikusan nyersz. Ha az osztónál van ilyen kártya, akkor meg kell állnod, és meg kell várnod, amíg felfedik a másik lapját.
  • Ha a kártyáid összege a [17, 20] tartományba esik, mindig meg kell állnod.
  • Ha a kártyáid összege a [12, 16] tartományba esik, mindig meg kell állnod, kivéve ha az osztónál 7 vagy annál nagyobb értékű lap van, mert akkor mindig lapot kell kérned.
  • Ha a kártyáid összege 11 vagy kevesebb, mindig lapot kell kérned.

Valósítsd meg a Blackjack.first_turn metódust, amely argumentumként három kártyát kap stringként. A metódusnak stringként kell visszaadnia a meghozandó döntést.

Blackjack.first_turn("ace", "ace", "two")
# => "P"
Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg
Crystal Exercism

Készen állsz elkezdeni a(z) Blackjack feladatot?

Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Crystal nyelvet 26 fogalom142 feladat segítségével, valódi emberi mentorálással, mindez ingyen.