Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Minha versão do código Jogo de Adivinhação

Salve salve rapaziada, todo mundo bem?

Espero que sim!

Gostaria de publicar aqui no fórum, meu primeiro código python (linguagem da qual estou aprendendo agora), iniciando meus estudos para que possa me tornar programador.

Tomei a liberdade durante os exercícios de fazer algumas pequenas alterações e gostaria do feedback de vocês sobre. Como boa pratica de programação, gostaria de tentar "usar menos if's" e ser menos verborrágico nos meus códigos. Contudo, isso é algo que eu preciso aprender muito ainda, pois além de saber pouco sobre python, eu também sei pouco sobre programação.

Desde já, grato por todos os feedbacks possíveis.

Um forte abraço!

def jogo1():


    import random

    print("____________________________________________")
    print("Seja bem-vindo ao jogo Teste de Adivinhação!")
    print("____________________________________________\n")
    print("Nesse jogo, você irá começar com 1000 pontos.")
    print("Quanto mais distante for o seu palpite do número a ser adivinhado, mais pontos você perde.")
    print("O objetivo é acertar o número secreto com a maior quantidade de pontos.\n")

    numero_secreto = random.randrange(1, 101)
    tentativas = 0
    pontos = 1000

    # Configuração dos níveis de dificuldade.
    print("Em qual nível de dificuldade você gostaria de jogar?")
    print("[1] Fácil / [2] Médio / [3] Difícil\n")

    dificuldade = int(input("Selecione o nível de dificuldade: "))

    if (dificuldade == 1):
        print("Você selecionou a dificuldade fácil, com 20 tentativas.")
        tentativas = 20
    elif (dificuldade == 2):
        print("Você selecionou a dificuldade médio, com 10 tentativas.")
        tentativas = 10
    else:
        dificuldade = 3
        print("Você selecionou a dificuldade difícil, com 5 tentativas. Que coragem, boa sorte!")
        tentativas = 5

    # Configuração das rodadas
    for rodada in range(1, tentativas + 1):
        print("Tentativa {} de {}".format(rodada, tentativas))
        palpite = input("Digite o seu palpite numérico entre 1 e 100: ")
        print("Você digitou o número: ", palpite)
        palpite_correto = int(palpite)

        if (palpite_correto < 1 or palpite_correto > 100):
            print("Por favor, digite um número entre 1 e 100!")
            continue

        # Verificação da proximidade de acerto.
        acertou = palpite_correto == numero_secreto
        palpite_maior = palpite_correto > numero_secreto
        palpite_menor = palpite_correto < numero_secreto

        if (acertou):
            print("Parabens! Você achou o número correto e finalizou o jogo  com {}".format(pontos))
            break
        else:
            if (palpite_maior):
                print("Que pena, você errou! Seu palpite foi maior que o número a ser adivinhado. Tenta novamente!")
            elif (palpite_menor):
                print("Que pena, você errou! Seu palpite foi menor que o número a ser adivinhado. Tenta novamente!")

            pontos_perdidos = abs(numero_secreto - palpite_correto)
            pontos = pontos - pontos_perdidos

        # Alertas de última rodada.
        if (rodada == 19 and tentativas == 20):
            print("Atenção! Essa é sua última tentativa. Boa sorte.")
        elif (rodada == 9 and tentativas == 10):
            print("Atenção! Essa é sua última tentativa. Boa sorte.")
        elif (rodada == 4 and tentativas == 5):
            print("Atenção! Essa é sua última tentativa. Boa sorte.")

    print("Fim da partida! Você terminou o jogo com {} pontos.\n".format(pontos))

    recomeco = int(input("Você gostaria de jogar novamente? [1] para SIM ou [2] para NÃO\n"))
    if (recomeco == 1):
        jogo1()
    elif (recomeco == 2):
        print("Obrigado por jogar!")
        exit()
    else:
        exit()

# Fim do código base e comando para rodar.
if (__name__ == "__main__"):
    jogo1()
3 respostas

Bom dia, Thalmonn, tudo bem?

Que legal que está começando sua jornada na programação com o python! Espero que seja uma experiência muito proveitosa!

Seu código está muito bem estruturado, com um aspecto muito importante para documentação que é o uso de comentários para explicar o funcionamento de blocos, o que é uma ótima prática.

Tenho alguns apontamentos que talvez possam te ajudar a otimizá-lo:

No início do código, no trecho em que a dificuldade é setada, você fez dificuldade = 3 dentro da condição else. Desta forma você está fazendo uma atribuição dessa variável ao invés de uma comparação com o número 3. Se o propósito for comparar, deve-se usar um elif da mesma forma que foi feita para as outras dificuldades. Além disso, a presença do else implica que se o usuário entrar com qualquer valor que não seja 1 ou 2 ele entrará nessa condição, o que gera um erro conceitual, visto que foi dito ao usuário que seria difícil somente se ele entrasse com o valor 3. Isso pode ser resolvido criando um bloco para validação da entrada do usuário. O código então poderia ficar algo como:

dificuldade = int(input("Selecione o nível de dificuldade: "))

# Função que valida a entrada do usuário e retorna o valor escolhido se for válido
# caso contrário continuará pedindo para inserir um valor até que seja válido
valor = validacao_dificuldade(dificuldade)

if (valor == 1):
    print("Você selecionou a dificuldade fácil, com 20 tentativas.")
    tentativas = 20
 elif (valor == 2):
    print("Você selecionou a dificuldade médio, com 10 tentativas.")
    tentativas = 10
 else:
    print("Você selecionou a dificuldade difícil, com 5 tentativas. Que coragem, boa sorte!")
    tentativas = 5

Além disso, no bloco para avisar o jogador que está na última rodada, daria para simplificar fazendo a seguinte comparação:

if (rodada == tentativas - 1):
    print("Atenção! Essa é sua última tentativa. Boa sorte.")

Dessa forma você não precisa reescrever a mensagem dentro do print pra cada caso e ela aparecerá para qualquer dificuldade. Daria para simplificar ainda mais utilizando um operador ternário, que é uma expressão if dentro de uma única linha fazendo:

print("Atenção! Essa é sua última tentativa. Boa sorte." if (rodada == tentativas - 1) else "\n")

Por fim, no bloco para sair do jogo (reescrito abaixo), dá para fazer uma de duas coisas para otimizar.

if (recomeco == 1):
     jogo1()
 elif (recomeco == 2):
     print("Obrigado por jogar!")
     exit()
 else:
     exit()

Como existe o bloco else, qualquer número que inserido que não for igual a 1 ele sairá do jogo. Desta forma, não é necessário o uso do elif e poderia simplicar para:

if (recomeco == 1):
     jogo1()
 else:
     print("Obrigado por jogar!")
     exit()

Porém, novamente entramos no caso do primeiro input, em que definimos para o usuário que um valor tal fará alguma coisa (no caso o valor 2 sairá do jogo) porém se ele entrar com qualquer valor que não seja 1 ele sairá de qualquer jeito. Dessa forma, poderia-se novamente criar uma validação para o input do usuário para ver se está entre os valores esperados (nesse caso 1 e 2) e, caso contrário, peça para ele continuar inserindo até que seja algum dos valores esperados. Poderia ser algo desta forma:

recomeco = int(input("Você gostaria de jogar novamente? [1] para SIM ou [2] para NÃO\n"))

# Função que valida a entrada do usuário e retorna o valor escolhido se for válido
# caso contrário continuará pedindo para inserir um valor até que seja válido
valor = validacao_recomeco(recomeco)

if (valor == 1):
     jogo1()
 else:
     print("Obrigado por jogar!")
     exit()

Você comentou sobre que gostaria de utilizar menos ifs pra facilitar a leitura do código. Geralmente da pra se utilizar esse operador ternário para simplificar quando é um if else simples. Porém cuidado quando usar ternários porque podem acabar deixando seu código mais difícil de entender do que mais fácil.

Espero ter ajudado de alguma forma! Bons estudos!

Alô @Gian tudo bem?

Então, estive fazendo verificações no código conforme você mencionou. Fiz alguns ajustes, também utilizamos conhecimentos que aprendi na segunda parte do curso. Em breve vou postar o código atualizado completo.

Verifiquei um erro quando tento utilizar como entrada ao imput inicial de números uma string.

ValueError: invalid literal for int() with base 10:

Dei uma pesquisada e me parece um erro relacionado a impossibilidade de conversão de uma string literal para número inteiro. Tentei converter ela primeiro para float e depois inteiro e também não vai. A solução para esse caso seria criar também uma validação/tratamento do imput com uma função específica?

solução!

Exatamente, Thalmonn!

O que acontece é que a função int(variavel) espera que a variável seja possível de se converter a um valor numérico. Por exemplo, se eu tentar fazer int('teste') ele levantaria erro pois não tem como converter a string 'teste' para numérico. Nesse caso, como você falou, tem que fazer uma validação do input pra ver se é possível de se converter a numérico.

Existe um método de strings chamado isnumeric que faz exatamente isso. Esse método retorna True se dentro da string existe apenas números e False caso contrário.

Exemplo:

 string = '123'
 print(string.isnumeric())  # Retorna True

 string = 'Teste123'
 print(string.isnumeric())  # Retorna False

 string = 'Teste'
 print(string.isnumeric())  # Retorna False

A função de validação pode ser algo desta forma:

 def valida_input(str_input):
    lista_validacao = [1, 2, 3]  # valores para validação se entrada é numérica
    eh_numero = str_input.isnumeric()
    valido = False

    # se entrada é numérica, checa se está dentro da lista de validação
    if eh_numero:
        valido = int(str_input) in lista_validacao:
    else:
        valido = False

    return valido

A saída desta função pode ser utilizada num loop while. Esse loop vai pedir a entrada do usuário enquanto a saída da função não for True.

Bons estudos e grande abraço, Thalmonn!