Blackjack

Blackjack

Exercício de aprendizagem

Introdução

Tal como outras linguagens, o Go também tem uma instrução switch. As instruções switch são uma forma mais curta de escrever cadeias longas de instruções if ... else if. Para criar um switch, começamos por usar a palavra-chave switch seguida de um valor ou de uma expressão. Depois, declaramos cada uma das condições com a palavra-chave case. Também podemos declarar um caso default, que é executado quando nenhuma das condições case anteriores corresponde:

operatingSystem := "windows"

switch operatingSystem {
case "windows":
    // do something if the operating system is windows
case "linux":
    // do something if the operating system is linux
case "macos":
    // do something if the operating system is macos
default:
    // do something if the operating system is none of the above
} 

Uma coisa interessante nas instruções switch é que o valor a seguir à palavra-chave switch pode ser omitido, e podemos ter condições booleanas para cada case:

age := 21

switch {
case age > 20 && age < 30:
    // do something if age is between 20 and 30
case age == 10:
    // do something if age is equal to 10
default:
    // do something else for every other case
}

Instruções

Neste exercício vamos simular o primeiro turno de um jogo de Blackjack.

Vais receber duas cartas e vais poder ver a carta do crupiê que está virada para cima. Todas as cartas são representadas por uma string, como "ace", "king", "three", "two", etc. Os valores de cada carta são:

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

Nota: Habitualmente, os aces podem valer 1 ou 11, mas, para simplificar, vamos assumir que só podem valer 11.

Consoante as tuas duas cartas e a carta do crupiê, há uma estratégia para o primeiro turno do jogo, na qual tens as seguintes opções:

  • Ficar (S)
  • Pedir (H)
  • Dividir (P)
  • Ganhar automaticamente (W)

Apesar de ainda não ser a ideal, vais seguir a estratégia que o teu amigo Alex tem vindo a desenvolver, que é a seguinte:

  • Se tiveres um par de aces, tens sempre de os dividir.
  • Se tiveres um Blackjack (duas cartas que somam 21) e o crupiê não tiver um ace, uma figura (Jack/Queen/King) ou um ten, ganhas automaticamente. Se o crupiê tiver alguma dessas cartas, tens de ficar e esperar que a outra carta seja revelada.
  • Se as tuas cartas somarem um valor dentro do intervalo [17, 20], tens sempre de ficar.
  • Se as tuas cartas somarem um valor dentro do intervalo [12, 16], tens sempre de ficar, a não ser que o crupiê tenha um 7 ou mais, caso em que tens sempre de pedir.
  • Se as tuas cartas somarem 11 ou menos, tens sempre de pedir.

1. Calcula o valor de uma carta qualquer

Implementa uma função que calcule o valor numérico de uma carta:

value := ParseCard("ace")
fmt.Println(value)
// Output: 11

2. Implementa a lógica de decisão para o primeiro turno

Escreve uma função que implemente a lógica de decisão descrita acima:

func FirstTurn(card1, card2, dealerCard string) string

Aqui ficam alguns exemplos dos resultados esperados:

FirstTurn("ace", "ace", "jack") == "P"
FirstTurn("ace", "king", "ace") == "S"
FirstTurn("five", "queen", "ace") == "H"
Editar via GitHub A ligação abre numa nova janela ou separador
Go Exercism

Estás pronto para começar Blackjack?

Inscreve-te no Exercism para aprenderes e dominares Go com 35 conceitos167 exercícios, e mentoria humana real, tudo grátis.