Track
/
Ruby
Ruby
/
Esercizi
/
BlackJack
BlackJack

BlackJack

Esercizio di apprendimento

Introduzione

Case (spesso chiamato switch in altri linguaggi) è una forma di espressione di controllo simile a if-else. Case permette di concatenare più istruzioni if-else-if e può risultare più leggibile pur offrendo comunque il controllo di flusso.

Un case è definito dalla parola chiave case seguita da un'espressione facoltativa. Poi, per ogni caso, si usa la parola chiave when seguita da un'espressione che viene confrontata con l'espressione del case. La parola chiave when non deve essere indentata rispetto alla parola chiave case. Dopo la parola chiave when c'è il codice che deve essere eseguito se l'espressione del case corrisponde all'espressione del when. Case permette di usare un'istruzione else facoltativa, che viene eseguita se nessun altro caso corrisponde.

L'espressione del case viene valutata e poi confrontata con ciascuna espressione del when. Il confronto avviene tramite l'operatore di uguaglianza del case (===).

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

L'operatore di uguaglianza del case (===)

L'operatore di uguaglianza del case (===) è un po' diverso dall'operatore di uguaglianza (==). Questo operatore controlla se il lato destro è un membro dell'insieme descritto dal lato sinistro. Questo significa che la posizione di ciascun operando conta davvero. Il funzionamento dipende dal tipo del lato sinistro: per esempio, un Range controlla se il lato destro è compreso nell'intervallo, mentre un Object controlla se il lato destro è un'istanza di Object.

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

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

Il case con più espressioni

Il case permette di far corrispondere più espressioni in un unico caso, separando ogni valore possibile con una virgola. Il codice viene eseguito se una qualsiasi delle espressioni corrisponde. Questo può essere utile quando vuoi che un singolo caso abbia più valori possibili.

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

Il case con gli intervalli

Il case può anche controllare se un valore è compreso in un intervallo. Per farlo, si usa un intervallo come espressione del when.

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

Il case senza espressione

Quando non c'è bisogno di un'espressione del case, è possibile ometterla. In questo modo, ogni espressione del when viene valutata in base alla sua veridicità, ed il case si comporta come una serie di istruzioni if-else-if.

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

Il when su una sola riga

Ruby permette di scrivere istruzioni case su una sola riga. Puoi usarle quando hai una semplice istruzione su una sola riga. L'istruzione when su una sola riga si scrive come when <expression> then <statement>. E quando viene usata nell'istruzione else, si scrive come else <statement>.

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

Il case con i tipi

Il case permette di far corrispondere i tipi. Questo è utile quando si vuole un comportamento diverso a seconda del tipo di una variabile.

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

Istruzioni

In questo esercizio simuleremo il primo turno di una partita a Blackjack.

1. Calcola il valore di ogni carta.

Riceverai due carte e potrai vedere la carta scoperta del mazziere. Tutte le carte sono rappresentate da una stringa come "ace", "king", "three", "two", ecc. I valori di ogni carta sono:

carta valore carta valore
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 altre 0
Note

Di solito gli assi possono valere 1 o 11, ma per semplicità assumeremo che possano valere solo 11.

Implementa il metodo Blackjack.parse_card, che prende una carta come argomento sotto forma di stringa. Il metodo deve restituire il valore della carta come numero intero.

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

2. Dai un nome agli intervalli di valori.

Il punteggio del giocatore deve essere suddiviso in intervalli di valori. Il punteggio del giocatore si calcola sommando i valori delle due carte del giocatore. Gli intervalli utilizzati sono:

intervallo valore
low [4, 11]
mid [12, 16]
high [17, 20]
blackjack [21]

Implementa il metodo Blackjack.card_range, che prende due carte come argomenti sotto forma di stringa. Il metodo deve restituire il nome dell'intervallo di valori in cui rientrano le due carte.

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

3. Implementa la logica decisionale per il primo turno.

A seconda delle due carte che hai e della carta del mazziere, esiste una strategia per il primo turno del gioco, in cui hai le seguenti opzioni:

  • Stare (S)
  • Chiedere carta (H)
  • Dividere (P)
  • Vincere automaticamente (W)

Anche se non è ancora ottimale, seguirai la strategia che il tuo amico Alex ha sviluppato, che è la seguente:

  • Se hai una coppia di assi, devi sempre dividerli.
  • Se hai un Blackjack (due carte la cui somma è 21) e il mazziere non ha un asso, una figura o un dieci, vinci automaticamente. Se invece il mazziere ha una di queste carte, devi stare e aspettare che venga scoperta l'altra carta.
  • Se la somma delle tue carte rientra nell'intervallo [17, 20], devi sempre stare.
  • Se la somma delle tue carte rientra nell'intervallo [12, 16], devi sempre stare, a meno che il mazziere non abbia una carta di valore 7 o superiore: in quel caso devi sempre chiedere carta.
  • Se la somma delle tue carte è 11 o meno, devi sempre chiedere carta.

Implementa il metodo Blackjack.first_turn, che prende tre carte come argomenti sotto forma di stringa. Il metodo deve restituire come stringa la decisione da prendere.

Blackjack.first_turn("ace", "ace", "two")
# => "P"
Modifica tramite GitHub Il link si apre in una nuova finestra o scheda
Ruby Exercism

Vuoi iniziare BlackJack?

Iscriviti a Exercism per imparare e padroneggiare Ruby con 21 concetti121 esercizi e il mentoring di persone reali, tutto gratis.