2
respostas

[Dúvida] Limitando as opções de entrada

Bom eu gostaria de fazer um plus no meu código, no caso gostaria que na dificuldade ele aceitasse apenas os valores (1), (2) e (3). Caso o usuário coloque 10 como input o programa enviasse uma mensagem dizendo "Entrada inválida, tente novamente!", com isso ele voltaria para o inicio do programa. |Gostaria de saber a opinião do grupo a respeito disso.

Parte do código que estou alterando: (o valor total_de_tent não está funcionando)

    def retornar():
        print("Níveis de dificuldade:")
        print("(1)Fácil, (2)Médio, (3)Difícil")
        nivel = int(input('Qual o nível desejado?'))
        if (nivel == 1):
            total_de_tent = 20
        elif (nivel == 2):
            total_de_tent = 10
        elif (nivel == 3):
            total_de_tent = 5
        else:
            print('Número informado inválido!')
            return retornar()

    retornar()

Meu código completo:

import random

def jogar():

    print('===================================')
    print('Bem-Vindo ao jogo de Adivinhação!')
    print('===================================')

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

    def retornar():
        print("Níveis de dificuldade:")
        print("(1)Fácil, (2)Médio, (3)Difícil")
        nivel = int(input('Qual o nível desejado?'))
        if (nivel == 1):
            total_de_tent = 20
        elif (nivel == 2):
            total_de_tent = 10
        elif (nivel == 3):
            total_de_tent = 5
        else:
            print('Número informado inválido!')
            return retornar()

    retornar()

    print(numero_secreto)

    for rodada in range(1, total_de_tent + 1):
        print('Tentativa {} de {}'.format(rodada, total_de_tent))
        chute_str = input('Digite o seu número: ')
        print('Você chutou o número', chute_str, '.. . .')
        chute = int(chute_str)

        if(chute < 1 or chute > 100):
            print("Você deve digitar um número entre 1 e 100!")
            continue


        maior = numero_secreto < chute
        menor = numero_secreto > chute
        acertou = numero_secreto == chute

        if acertou:
            print("Você acertou e fez {} pontos!".format(pontos))
            break
        else:
            pontos_perdidos = round(abs(numero_secreto - chute) / 3)
            pontos = pontos - pontos_perdidos
            if maior:
                print('Vish seu chute foi maior que o número secreto')
                if (rodada == total_de_tent):
                    print("O número secreto era {}. Você fez {}".format(numero_secreto, pontos))
            elif menor:
                print('Opa seu chute foi menor que o número secreto!')
                if (rodada == total_de_tent):
                    print("O número secreto era {}. Você fez {}".format(numero_secreto, pontos))

    print('Fim de jogo!')
if(__name__ == "__main__"):
    jogar()

Desde já agradeço o auxílio, caso descubra uma forma de corrigir esse problema, irei responder o tópico como concluído e anexar a solução!

2 respostas

||EDIT 2 Descobri uma forma de resolver o problema por hora... utilizando o laço while! Juntamente com if, elif e else...

O Código ficou assim:

print("Níveis de dificuldade:")
    print("(1)Fácil, (2)Médio, (3)Difícil")
    nivel = int(input('Qual o nível desejado?'))

    while(nivel < 3 or nivel > 1):
        if (nivel == 1):
            total_de_tent = 20
            break
        elif (nivel == 2):
            total_de_tent = 10
            break
        elif (nivel == 3):
            total_de_tent = 5
            break
        else:
            print('****Número informado inválido!****')
            print("Níveis de dificuldade:")
            print("(1)Fácil, (2)Médio, (3)Difícil")
            nivel = int(input('Qual o nível desejado?'))

        [...]

Me digam o que acham e se conhecem uma forma melhor! Como não possuo domínio de funções achei melhor proceder com o laço mesmo... Não sei também se a melhor forma de abordar esse problema seria com uma função que retornasse, gostaria de saber um pouco mais sobre.

Olá Gabriel, tudo bem com você?

Meus parabéns pelas implementações realizadas no código. Essa dedicação indo além do que foi apresentado nas aulas é muito importante para o seu desenvolvimento.

No primeiro conjunto de código, a variável total_de_tent está mantendo o valor zero (0) pois, os valores atribuídos a ela na função retornar() não estão sendo retornados para ficarem disponíveis para uso fora da função retornar(). Assim, o jogo inicia com um total de zero tentativas.

Para realizar a correção, basta atribuir a chamada da função retornar() a variável total_de_tent assim, essa variável receberá os valores retornados pela função retornar() e dentro da função adicionar o retorno dos valores de tentativa para cada nível. Conforme apresentado abaixo.

    def retornar():
        print("Níveis de dificuldade: ")
        print("(1)Fácil, (2)Médio, (3)Difícil")
        nivel = int(input('Qual o nível desejado?'))
        if (nivel == 1):
            return 20
        elif (nivel == 2):
            return 10
        elif (nivel == 3):
            return 5
        else:
            print('Número informado inválido!')
            return retornar()

    total_de_tent = retornar()

Código completo com as mudanças aplicadas

import random


def jogar():
    print('===================================')
    print('Bem-Vindo ao jogo de Adivinhação!')
    print('===================================')

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

    def retornar():
        print("Níveis de dificuldade: ")
        print("(1)Fácil, (2)Médio, (3)Difícil")
        nivel = int(input('Qual o nível desejado?'))
        if (nivel == 1):
            return 20
        elif (nivel == 2):
            return 10
        elif (nivel == 3):
            return 5
        else:
            print('Número informado inválido!')
            return retornar()

    total_de_tent = retornar()

    print(numero_secreto)

    for rodada in range(1, total_de_tent + 1):
        print('Tentativa {} de {}'.format(rodada, total_de_tent))
        chute_str = input('Digite o seu número: ')
        print('Você chutou o número', chute_str, '.. . .')
        chute = int(chute_str)

        if (chute < 1 or chute > 100):
            print("Você deve digitar um número entre 1 e 100!")
            continue

        maior = numero_secreto < chute
        menor = numero_secreto > chute
        acertou = numero_secreto == chute

        if acertou:
            print("Você acertou e fez {} pontos!".format(pontos))
            break
        else:
            pontos_perdidos = round(abs(numero_secreto - chute) / 3)
            pontos = pontos - pontos_perdidos
            if maior:
                print('Vish seu chute foi maior que o número secreto')
                if (rodada == total_de_tent):
                    print("O número secreto era {}. Você fez {}".format(numero_secreto, pontos))
            elif menor:
                print('Opa seu chute foi menor que o número secreto!')
                if (rodada == total_de_tent):
                    print("O número secreto era {}. Você fez {}".format(numero_secreto, pontos))

    print('Fim de jogo!')


if (__name__ == "__main__"):
    jogar()

Após realizar as mudanças acima salve o arquivo antes de realizar uma nova execução do código.

A segunda proposta de código atende bem o objetivo de limitar a entrada dos usuários.

Não hesite em voltar ao fórum para continuar aprendendo e interagindo com a comunidade.

Em caso de dúvidas estou à disposição.

Abraços e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!