Tracks
/
Ruby
Ruby
/
Ejercicios
/
Blackjack
Blackjack

Blackjack

Ejercicio de aprendizaje

Introducción

Case (a menudo llamado switch en otros lenguajes) es una forma de expresión de control como if-else. Case permite encadenar múltiples sentencias if-else-if y puede ser más legible a la vez que sigue proporcionando control de flujo.

Un case se define con la palabra clave case, seguida de una expresión opcional. Luego, para cada case, se usa la palabra clave when seguida de una expresión que se compara con la expresión de case. La palabra clave when no debe estar indentada con respecto a la palabra clave case. Después de la palabra clave when va el código que debe ejecutarse si la expresión de case coincide con la expresión de when. Case permite una sentencia else opcional que se ejecuta si ningún otro case coincide.

La expresión de case se evalúa y luego se compara con cada expresión de when. La expresión se compara usando el operador de igualdad de 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

Operador de igualdad de case (===)

El operador de igualdad de case (===) es un poco diferente del operador de igualdad (==). El operador verifica si el lado derecho es un miembro del conjunto descrito por el lado izquierdo. Esto significa que sí importa dónde se coloca cada operando. Cómo funciona esto depende del tipo del lado izquierdo; por ejemplo, un Range verificaría si el lado derecho está dentro del rango, o un Object verificaría si el lado derecho es una instancia de Object.

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

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

Case con múltiples expresiones

Case permite hacer coincidir múltiples expresiones en un solo case, con cada valor posible separado por una coma. Ejecutará el código si alguna de las expresiones coincide. Esto puede ser útil cuando quieres que un solo case tenga múltiples valores posibles.

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

Case con rangos

Case también puede verificar si un valor está dentro de un rango. Esto se hace usando un rango como expresión de when.

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

Case sin expresión de case

Cuando no se necesita una expresión de case, es posible omitirla. Hacer esto hará que cada expresión de case se evalúe según su veracidad. Y hace que se comporten como sentencias if-else-if.

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

when en una sola línea

Ruby permite sentencias case de una sola línea. Esto se puede usar cuando tienes una sentencia simple de una sola línea. La sentencia when de una sola línea se escribe como when <expression> then <statement>. Y cuando se usa en la sentencia else, se escribe como else <statement>.

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

Case con tipos

Case permite hacer coincidencias con tipos. Esto es útil cuando quieres un comportamiento diferente según el tipo de una variable.

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

Instrucciones

En este ejercicio vamos a simular el primer turno de una partida de Blackjack.

1. Calcula el valor de cualquier carta.

Recibirás dos cartas y podrás ver la carta boca arriba del crupier. Todas las cartas se representan con un string como «ace», «king», «three», «two», etc. Los valores de cada carta son:

carta valor carta valor
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

Comúnmente, los ases pueden tomar el valor de 1 o 11, pero por simplicidad asumiremos que solo pueden tomar el valor de 11.

Implementa el método Blackjack.parse_card, que recibe una carta como argumento, en forma de string. El método debe devolver el valor de la carta como un número entero.

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

2. Nombra rangos de valores.

El puntaje del jugador tiene que clasificarse en rangos de valores. El puntaje del jugador se calcula sumando los valores de las dos cartas del jugador. Los rangos que se usan son:

rango valor
low [4, 11]
mid [12, 16]
high [17, 20]
blackjack [21]

Implementa el método Blackjack.card_range, que recibe dos cartas como argumentos, en forma de strings. El método debe devolver el nombre del rango de valores en el que caen las dos cartas.

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

3. Implementa la lógica de decisión para el primer turno.

Según tus dos cartas y la carta del crupier, existe una estrategia para el primer turno del juego, en la que tienes las siguientes opciones:

  • Plantarse (S)
  • Pedir carta (H)
  • Dividir (P)
  • Ganar automáticamente (W)

Aunque todavía no es óptima, seguirás la estrategia que tu amigo Alex ha estado desarrollando, que es la siguiente:

  • Si tienes un par de ases, siempre debes dividirlos.
  • Si tienes un Blackjack (dos cartas que suman un valor de 21) y el crupier no tiene un as, una figura o un diez, ganas automáticamente. Si el crupier sí tiene alguna de esas cartas, tendrás que plantearte y esperar a que se revele la otra carta.
  • Si tus cartas suman un valor dentro del rango [17, 20], siempre debes plantearte.
  • Si tus cartas suman un valor dentro del rango [12, 16], siempre debes plantearte, a menos que el crupier tenga un 7 o más, en cuyo caso siempre debes pedir carta.
  • Si tus cartas suman 11 o menos, siempre debes pedir carta.

Implementa el método Blackjack.first_turn, que recibe tres cartas como argumentos, en forma de strings. El método debe devolver, como string, la decisión que debes tomar.

Blackjack.first_turn("ace", "ace", "two")
# => "P"
Editar en GitHub El enlace se abre en una ventana o una pestaña nuevas
Ruby Exercism

¿Todo listo para empezar Blackjack?

Regístrate en Exercism para aprender y dominar Ruby con 21 conceptos121 ejercicios y mentoría humana real, todo gratis.