Implemente o jogo Blackjack ou 21. No caso temos apenas dois jogadores, o cliente (humano) e a banca (computador). O ás pode valer 1 ou 11, de acordo com as cartas que o jogador possui. O valete (J), a dama (Q) e o rei (K) valem 10. A simulação da obtenção das cartas deve ser feita com o uso de números aleatórios (Dica: carta random.randint( 1,13 ), isto é, variando de 1 a 13). Os números 11, 12 e 13 representam respectivamente J, Q e K. Não há a necessidade de representar um baralho real de 52 cartas. O cliente recebe inicialmente duas cartas aleatoriamente e decide se pede outra ou não, dependendo do somatório. Caso a soma das cartas seja maior que 21, o cliente perde. O cliente pode passar a vez para a banca (que não possui cartas no início do jogo), que, para vencer, terá que obter obrigatoriamente um número maior que o cliente e MENOR do que 21, caso contrário, o cliente ganha. O jogo tem apenas uma rodada. Informe quem ganhou ou se houve empate.

Passo 1

Beleza! Vamos resolver esse exercício de implementar o jogo Blackjack, também conhecido como 21. O objetivo aqui é criar uma simulação do jogo entre um cliente (você) e a banca (computador). Para isso, vamos precisar entender como as cartas funcionam no Blackjack:
  • Ás (A): Pode valer 1 ou 11, dependendo das outras cartas do jogador.
  • Valete (J), Dama (Q) e Rei (K): Valem 10 pontos cada.
  • Cartas numeradas de 2 a 10: Valem seu próprio número.
Vamos utilizar números aleatórios para simular a obtenção das cartas, usando a função random.randint(1,13), onde cada número representa uma carta específica.

Passo 2

Primeiro, vamos importar o módulo random que nos ajudará a gerar números aleatórios para as cartas:
import random

Passo 3

Vamos criar uma função para gerar uma carta aleatória. Essa função vai retornar o valor da carta de acordo com as regras do Blackjack:
def obter_carta():
    carta = random.randint(1, 13)
    if carta == 1:
        return 'A'
    elif carta == 11:
        return 'J'
    elif carta == 12:
        return 'Q'
    elif carta == 13:
        return 'K'
    else:
        return str(carta)

Passo 4

Agora, precisamos de uma função para calcular o valor total das cartas de um jogador. Essa função deve considerar que o Ás pode valer 1 ou 11:
def calcular_pontos(cartas):
    pontos = 0
    ases = 0
    for carta in cartas:
        if carta in ['J', 'Q', 'K']:
            pontos += 10
        elif carta == 'A':
            ases += 1
            pontos += 11
        else:
            pontos += int(carta)
    while pontos > 21 and ases:
        pontos -= 10
        ases -= 1
    return pontos

Passo 5

Vamos iniciar o jogo atribuindo duas cartas para o cliente:
cartas_cliente = [obter_carta(), obter_carta()]
pontos_cliente = calcular_pontos(cartas_cliente)
print(f"Cartas do Cliente: {cartas_cliente} - Pontos: {pontos_cliente}")

Passo 6

Agora, vamos permitir que o cliente decida se quer receber mais cartas ou não. Para simplificar, vamos automatizar essa decisão: o cliente vai pedir mais cartas enquanto a soma for menor que 17:
while pontos_cliente < 17:
    nova_carta = obter_carta()
    cartas_cliente.append(nova_carta)
    pontos_cliente = calcular_pontos(cartas_cliente)
    print(f"Cliente pede mais uma carta: {nova_carta} - Pontos: {pontos_cliente}")
    if pontos_cliente > 21:
        print("Cliente estourou! Banca vence.")
        exit()

Passo 7

Se o cliente não estourou, é a vez da banca jogar. A banca vai continuar puxando cartas até que tenha uma pontuação maior que a do cliente, mas sem ultrapassar 21:
cartas_banca = []
pontos_banca = 0
while pontos_banca <= pontos_cliente and pontos_banca < 21:
    nova_carta = obter_carta()
    cartas_banca.append(nova_carta)
    pontos_banca = calcular_pontos(cartas_banca)
    print(f"Banca recebe uma carta: {nova_carta} - Pontos: {pontos_banca}")
    if pontos_banca > 21:
        print("Banca estourou! Cliente vence.")
        exit()

Passo 8

Finalmente, vamos comparar os pontos do cliente e da banca para determinar o vencedor:
print(f"Pontos do Cliente: {pontos_cliente} vs Pontos da Banca: {pontos_banca}")
if pontos_cliente > pontos_banca:
    print("Cliente vence!")
elif pontos_cliente < pontos_banca:
    print("Banca vence!")
else:
    print("Empate!")

Resposta

O jogo foi simulado com as regras estabelecidas. Dependendo das cartas sorteadas, o resultado será:
  • Cliente vence: Se a pontua��ão do cliente for maior que a da banca e não ultrapassar 21.
  • Banca vence: Se a pontuação da banca for maior que a do cliente e não ultrapassar 21, ou se o cliente estourar (ultrapassar 21).
  • Empate: Se a pontuação do cliente e da banca forem iguais.

Exercícios relacionados

Crie um algoritmo que leia um número decimal (com qualquer número de dígitos) e o converta para a base hexadecimal. A resposta deve ser dada em string.
Crie um algoritmo se imprima os N primeiros números que sejam primos e façam parte da série de Fibonacci UTILIZANDO OBRIGATORIAMENTE FUNÇÕES.
Implemente a função area_poligono(matriz). Esta função calculará a área de um polígono convexo cujos vértices estão na matriz ( indeterminado). Dicas: utilize a função area_triangulo(mat) que calcula a área de um triângulo. Em um quadrilátero com vértices e , a área do mesmo consiste da soma dos triângulos com vértices e e e .
Sudoku. Implemente a função Sudoku(matriz). matriz é uma matriz 9×9 com números de 0 a 9 , onde 0 representaria uma posição vazia num jogo de Sudoku. A função deve trocar todas os números errados, segundo o critério do Sudoku por 0. Você pode utilizar os métodos embutidos nas classes list e set do Python.