Blackjack

Blackjack

Exercice d'apprentissage

Introduction

Case (souvent appelé switch dans d'autres langages) est une forme d'expression de contrôle, comme if-else. Un case permet d'enchaîner plusieurs instructions if-else-if et peut être plus lisible tout en assurant le contrôle du flux.

Un case est défini par le mot-clé case suivi d'une expression optionnelle. Ensuite, pour chaque cas, on utilise le mot-clé when suivi d'une expression qui est comparée à l'expression du case. Le mot-clé when ne doit pas être indenté par rapport au mot-clé case. Après le mot-clé when vient le code qui doit être exécuté si l'expression du case correspond à l'expression du when. Le case accepte une instruction else optionnelle, qui est exécutée si aucun autre cas ne correspond.

L'expression du case est évaluée, puis comparée à chaque expression du when. La comparaison se fait à l'aide de l'opérateur d'égalité 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

L'opérateur d'égalité de case (===)

L'opérateur d'égalité de case (===) est un peu différent de l'opérateur d'égalité (==). Il vérifie si l'opérande de droite est un membre de l'ensemble décrit par l'opérande de gauche. Cela signifie que l'ordre des opérandes a son importance. Le fonctionnement dépend du type de l'opérande de gauche : par exemple, un Range vérifie si la valeur de droite appartient à l'intervalle, tandis qu'un Object vérifie si celle de droite est une instance de cet Object.

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

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

Les case avec plusieurs expressions

Un case permet de faire correspondre plusieurs expressions dans un même cas, chaque valeur possible étant séparée par une virgule. Le code est exécuté si l'une des expressions correspond. C'est utile lorsque tu veux qu'un même cas ait plusieurs valeurs possibles.

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

Les case avec des intervalles

Un case peut aussi vérifier si une valeur se trouve dans un intervalle. Il suffit pour cela d'utiliser un intervalle comme expression du when.

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

Les case sans expression de case

Lorsqu'une expression de case n'est pas nécessaire, il est possible de l'omettre. Chaque expression du when est alors évaluée pour sa valeur de vérité, et les cas se comportent comme des instructions if-else-if.

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

Le when sur une seule ligne

Ruby permet d'écrire des case sur une seule ligne. C'est utile lorsque tu as une instruction simple, elle aussi sur une seule ligne. Le when sur une seule ligne s'écrit when <expression> then <statement>. Et lorsqu'il est utilisé dans le else, il s'écrit else <statement>.

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

Les case avec des types

Un case permet aussi de faire correspondre des types. C'est utile lorsque tu veux un comportement différent selon le type d'une variable.

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

Instructions

Dans cet exercice, on va simuler le premier tour d'une partie de Blackjack.

1. Calcule la valeur d'une carte donnée.

Tu recevras deux cartes et tu pourras voir la carte visible du croupier. Toutes les cartes sont représentées par une string comme « ace », « king », « three », « two », etc. La valeur de chaque carte est la suivante :

carte valeur carte valeur
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 autre 0
Note

En général, un as peut valoir 1 ou 11, mais pour simplifier, on considérera qu'il vaut toujours 11.

Implémente la méthode Blackjack.parse_card qui prend une carte sous forme de string en argument. La méthode doit renvoyer la valeur de la carte sous forme d'un entier.

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

2. Nomme les intervalles de valeurs.

Le score du joueur doit être réparti en intervalles de valeurs. Le score du joueur se calcule en additionnant les valeurs de ses deux cartes. Les intervalles utilisés sont les suivants :

intervalle valeur
low [4, 11]
mid [12, 16]
high [17, 20]
blackjack [21]

Implémente la méthode Blackjack.card_range qui prend deux cartes sous forme de strings en arguments. La méthode doit renvoyer le nom de l'intervalle de valeurs auquel appartiennent les deux cartes.

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

3. Implémente la logique de décision pour le premier tour.

Selon tes deux cartes et la carte du croupier, il existe une stratégie pour le premier tour de la partie, dans laquelle tu as les options suivantes :

  • Rester (S)
  • Tirer (H)
  • Séparer (P)
  • Gagner automatiquement (W)

Même si elle n'est pas encore optimale, tu vas suivre la stratégie que ton ami Alex a développée, qui est la suivante :

  • Si tu as une paire d'as, tu dois toujours les séparer.
  • Si tu as un Blackjack (deux cartes dont la somme vaut 21) et que le croupier n'a ni as, ni figure, ni dix, alors tu gagnes automatiquement. Si le croupier a l'une de ces cartes, tu devras rester et attendre que l'autre carte soit révélée.
  • Si la somme de tes cartes se situe dans l'intervalle [17, 20], tu dois toujours rester.
  • Si la somme de tes cartes se situe dans l'intervalle [12, 16], tu dois toujours rester, sauf si le croupier a un 7 ou plus, auquel cas tu dois toujours tirer.
  • Si la somme de tes cartes est inférieure ou égale à 11, tu dois toujours tirer.

Implémente la méthode Blackjack.first_turn qui prend trois cartes sous forme de strings en arguments. La méthode doit renvoyer la décision à prendre sous forme de string.

Blackjack.first_turn("ace", "ace", "two")
# => "P"
Modifie via GitHub Le lien s'ouvre dans une nouvelle fenêtre ou un nouvel onglet
Ruby Exercism

Prêt à commencer Blackjack ?

Inscris-toi sur Exercism pour apprendre et maîtriser Ruby avec 21 concepts121 exercices, et un vrai mentorat humain, le tout gratuitement.