Blackjack

Blackjack

Tanulófeladat

Bevezetés

Case (más nyelvekben gyakran switch néven ismert) egyfajta vezérlési szerkezet, akárcsak az if-else. A case segítségével több if-else-if utasítást fűzhetsz egymáshoz, ami olvashatóbb is lehet, miközben megmarad a program futásának vezérlése.

A case a case kulcsszóval kezdődik, amelyet egy opcionális kifejezés követ. Ezután minden ághoz a when kulcsszót használjuk, amelyet egy kifejezés követ, és ezt hasonlítjuk össze 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 következik, amely akkor fut le, ha a case kifejezése megegyezik a when kifejezésével. A case-hez tartozhat egy opcionális else utasítás is, amely akkor fut le, ha egyetlen másik eset sem illeszkedik.

A case kifejezését kiértékeljük, majd minden when kifejezéssel összehasonlítjuk. Az összehasonlítás a case egyenlőségoperátorával (===) történik.

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

A case egyenlőségoperátora (===)

A case egyenlőségoperátora (===) kicsit más, mint az egyenlőségoperátor (==). Ez az operátor azt vizsgálja, hogy a jobb oldal tagja-e a bal oldal által leírt halmaznak. Ez azt jelenti, hogy korántsem mindegy, hova kerül az egyes operandusok. Az, hogy hogyan működik, a bal oldal típusától függ: egy Range például azt vizsgálja, 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-ben egyetlen ághoz több kifejezést is megadhatsz, a 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éket szeretnél rendelni.

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

Case tartományokkal

A case azt is ellenőrizheti, hogy egy érték egy tartományba esik-e. Ehhez csak egy tartományt kell megadnod when kifejezésként.

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

Case kifejezés nélkül

Ha nincs szükség case kifejezésre, nyugodtan elhagyhatod. Ekkor minden when kifejezés igazságérték alapján értékelődik ki. Így úgy viselkednek, mint az if-else-if utasítások.

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

Egysoros when

A Ruby lehetővé teszi az egysoros case utasításokat. Ez akkor jön jól, ha egy egyszerű, egysoros utasításod van. Az egysoros when utasítás alakja when <expression> then <statement>. Ha pedig az else utasításban használod, akkor else <statement> a formája.

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

Case típusokkal

A case segítségével típusokra is illeszkedhetsz. Ez akkor hasznos, ha egy változó típusától függően más-más viselkedést szeretnél.

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

Utasítások

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

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 kártyáját. Minden kártyát egy stringgel ábrázolunk, 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 other 0
Note

Az ász általában felveheti az 1 vagy a 11 értéket is, de az egyszerűség kedvéért feltesszük, hogy csak a 11 értékét veheti fel.

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

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

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

A játékos pontszámát értéktartományokba kell sorolni. A játékos pontszáma úgy számítódik ki, hogy összeadjuk a játékos két kártyájának értékét. A használt tartományok a következők:

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ó kártyájától függően a játék első körére létezik egy stratégia, amelyben a következő lehetőségeid vannak:

  • Megállás (S)
  • Húzás (H)
  • Osztás (P)
  • Automatikus győzelem (W)

Bár még nem optimális, azt a stratégiát fogod követni, amelyet a barátod, Alex fejlesztett ki, és ami a következő:

  • Ha két ászod van, azokat mindig szét kell osztanod.
  • Ha Blackjacked van (két kártya, amelyek összege 21), és az osztónál nincs ász, figurás kártya vagy tízes, akkor automatikusan nyersz. Ha az osztónál van ezek közül bármelyik, akkor meg kell állnod, és meg kell várnod, amíg felfedik a másik kártyá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 van, ebben az esetben mindig húznod kell.
  • Ha a kártyáid összege 11 vagy kevesebb, mindig húznod kell.

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

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

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

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