Tracks
/
Ruby
Ruby
/
Übungen
/
Blackjack
Blackjack

Blackjack

Lernübung

Einführung

Case (in anderen Sprachen oft als switch bezeichnet) ist eine Form von Kontrollausdruck, ähnlich wie if-else. Mit Case lassen sich mehrere if-else-if-Anweisungen verketten. Das kann lesbarer sein und übernimmt trotzdem die Ablaufsteuerung.

Ein Case wird durch das Schlüsselwort case definiert, auf das ein optionaler Ausdruck folgt. Dann wird für jeden Fall das Schlüsselwort when verwendet, gefolgt von einem Ausdruck, der mit dem Case-Ausdruck verglichen wird. Das Schlüsselwort when sollte nicht gegenüber dem Schlüsselwort case eingerückt werden. Auf das Schlüsselwort when folgt der Code, der ausgeführt werden soll, wenn der Case-Ausdruck mit dem when-Ausdruck übereinstimmt. Case erlaubt eine optionale else-Anweisung, die ausgeführt wird, wenn kein anderer Fall passt.

Der Case-Ausdruck wird ausgewertet und dann mit jedem when-Ausdruck verglichen. Der Vergleich erfolgt mit dem Case-Gleichheitsoperator (===).

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

Case-Gleichheitsoperator (===)

Der Case-Gleichheitsoperator (===) unterscheidet sich etwas vom Gleichheitsoperator (==). Der Operator prüft, ob die rechte Seite ein Element der Menge ist, die von der linken Seite beschrieben wird. Das bedeutet, dass es eine Rolle spielt, auf welcher Seite jeder Operand steht. Wie das funktioniert, hängt vom Typ der linken Seite ab. Eine Range prüft zum Beispiel, ob die rechte Seite im Bereich liegt, und ein Object prüft, ob die rechte Seite eine Instanz des Object ist.

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

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

Case mit mehreren Ausdrücken

Mit Case lassen sich mehrere Ausdrücke in einem einzigen Case abgleichen, wobei jeder mögliche Wert durch ein Komma getrennt wird. Der Code wird ausgeführt, wenn einer der Ausdrücke passt. Das ist nützlich, wenn ein einzelner Fall mehrere mögliche Werte haben soll.

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

Cases mit Bereichen

Mit Case lässt sich auch prüfen, ob ein Wert in einem Bereich liegt. Dazu verwendest du einen Bereich als when-Ausdruck.

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

Case ohne Case-Ausdruck

Wenn kein Case-Ausdruck benötigt wird, kannst du ihn weglassen. In diesem Fall wird jeder when-Ausdruck darauf geprüft, ob er wahr ist. Und sie verhalten sich dann wie if-else-if-Anweisungen.

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

Einzeiliges when

Ruby erlaubt einzeilige Case-Anweisungen. Das kannst du verwenden, wenn du eine einfache einzeilige Anweisung hast. Die einzeilige when-Anweisung wird als when <expression> then <statement> geschrieben. Und in der else-Anweisung wird sie als else <statement> geschrieben.

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

Case mit Typen

Mit Case lässt sich auch nach Typen abgleichen. Das ist nützlich, wenn du je nach Typ einer Variable ein unterschiedliches Verhalten möchtest.

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

Anleitung

In dieser Übung simulieren wir den ersten Zug eines Blackjack-Spiels.

1. Berechne den Wert einer beliebigen Karte.

Du erhältst zwei Karten und kannst die offene Karte des Dealers sehen. Alle Karten werden als String dargestellt, zum Beispiel „ace“, „king“, „three“, „two“ usw. Die Werte der einzelnen Karten sind:

Karte Wert Karte Wert
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

Üblicherweise können ace-Karten den Wert 1 oder 11 haben, aber der Einfachheit halber gehen wir davon aus, dass sie nur den Wert 11 haben können.

Implementiere die Methode Blackjack.parse_card, die eine Karte als String als Argument entgegennimmt. Die Methode sollte den Wert der Karte als Ganzzahl zurückgeben.

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

2. Benenne Wertebereiche.

Der Punktestand des Spielers muss in Wertebereiche eingeteilt werden. Der Punktestand eines Spielers wird berechnet, indem die Werte der beiden Spielerkarten addiert werden. Folgende Bereiche werden verwendet:

Bereich Wert
low [4, 11]
mid [12, 16]
high [17, 20]
blackjack [21]

Implementiere die Methode Blackjack.card_range, die zwei Karten als Strings als Argumente entgegennimmt. Die Methode sollte den Namen des Wertebereichs zurückgeben, in den die beiden Karten fallen.

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

3. Implementiere die Entscheidungslogik für den ersten Zug.

Abhängig von deinen beiden Karten und der Karte des Dealers gibt es für den ersten Zug des Spiels eine Strategie, bei der du die folgenden Optionen hast:

  • Stehen (S)
  • Ziehen (H)
  • Splitten (P)
  • Automatisch gewinnen (W)

Auch wenn sie noch nicht optimal ist, folgst du der Strategie, die dein Freund Alex entwickelt hat, und die wie folgt aussieht:

  • Wenn du ein Paar ace-Karten hast, musst du sie immer splitten.
  • Wenn du ein Blackjack hast (zwei Karten, die zusammen den Wert 21 ergeben) und der Dealer weder eine ace-Karte noch eine Bildkarte noch eine ten-Karte hat, gewinnst du automatisch. Hat der Dealer eine dieser Karten, musst du stehen und auf das Aufdecken der anderen Karte warten.
  • Wenn deine Karten zusammen einen Wert im Bereich [17, 20] ergeben, solltest du immer stehen.
  • Wenn deine Karten zusammen einen Wert im Bereich [12, 16] ergeben, solltest du immer stehen, es sei denn, der Dealer hat eine 7 oder höher; dann solltest du immer ziehen.
  • Wenn deine Karten zusammen 11 oder weniger ergeben, solltest du immer ziehen.

Implementiere die Methode Blackjack.first_turn, die drei Karten als Strings als Argumente entgegennimmt. Die Methode sollte die Entscheidung, die du treffen solltest, als String zurückgeben.

Blackjack.first_turn("ace", "ace", "two")
# => "P"
Über GitHub bearbeiten Der Link öffnet sich in einem neuen Fenster oder Tab
Ruby Exercism

Bereit, mit Blackjack zu starten?

Melde dich bei Exercism an, um Ruby mit 21 Konzepte121 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.