How to insert a try counter within an exception (except Valueerror) of Python 3

Asked

Viewed 974 times

1

Hello. I am a beginner in programming and have been trying to develop on my own programs that I learned in programming book exercises. I made my version of the classic "Guess the number", where the user has (n) attempts to hit a number randomly generated by the program. My problem is the trial counter. The counter I put (5x) only covers in case the user hits only by typing numbers, or misses the 5 attempts. However, there is an entry validator. If the user types a letter, the validator enters a loop and only leaves if he enters a number, and within that loop I could not insert a counter. My question is: How can I count invalid characters as number of attempts?

Variáveis usadas:
x = contador de tentativas
t = número de tentativas final
n = número digitado pelo usuário
r = número aleatório gerado pelo módulo random

Program code:

    #!/usr/bin/python3
    #coding=utf-8
    #Filename=num.py

    # Importa os módulos necessários
    import random
    import time

    # Define uma linha vazia
    def vazio():
        print()

    # Define uma linha pontilhada
    def linhas():
        print('----------------------------------------------')

    # Define três pontinhos
    def pontinhos():
        print('.')
        time.sleep(0.3)
        print('.')
        time.sleep(0.3)
        print('.')
        time.sleep(0.3)

    # Define o título    
    def title():
        print('##############################################')
        time.sleep(0.5)
        print('#################### NUM #####################')
        time.sleep(0.5)
        print('##############################################')
        time.sleep(1.5)
        pontinhos()

    # Define a introdução
    def intro():
        nome = input('\nQual é o seu nome? ')
        vazio()
        linhas()
        time.sleep(1)
        print('\nOlá %s!\n' % nome)
        linhas()
        time.sleep(1)
        print('\nEu estou pensando em um número...\n')
        linhas()
        time.sleep(1)
        print('\nEntre 1 e 100...\n')
        linhas()
        time.sleep(1)
        print('\nAdivinhe qual...\n')
        linhas()
        time.sleep(2)

    # Define o main loop 
    def main():
    """ Adivinhe o número aleatório de 1 a 100  com no máximo 5 tentativas """

        title()
        intro()
        x = 0
        n = 0
        t = 0
        r = random.randint(1,100)
        while True:
            # Se errar ou acertar...tente novamente ou saia do jogo...
            if x == 5 or n == r:
                # Se errar
                if x == 5 and n != r:
                    print('\n5 tentativas não foram suficientes! :(\n')
                    linhas()
                # Errando ou acertando...
                x = 0
                t = 0
                r = random.randint(1,100)
                s = input('\n[S] para sair: ')
                linhas()
                vazio()
                if s == 'S' or s == 's':
                    pontinhos()
                    print('Agradeço por jogar NUM!')
                    break
                else:
                    title()
            # Verifica se números são digitados ao invés de letras...
            while True:    
                try:
                    n = int(input('\nDigite um valor: '))
                    vazio()
                    pontinhos()
                    linhas()
                    break
                except ValueError:  # Se digitar letra ao invés de n....
                    linhas()
                    print('\nIsso não é um número!\n')
                    linhas()
            # Se acertar        
            if n == r:   
                print('\nVocê acertou em %d tentativas! :)\n' % t)
                linhas()
                time.sleep(1)
            # Se o número digitado for menor que a resposta...
            elif n > r:
                print('\nO número é menor que isso!\n')
                linhas()
                time.sleep(1)
            # Se o número digitado for maior que a resposta...
            elif n < r:
                print('\nO número é maior que isso!\n')
                linhas()
                time.sleep(1)
            x = x + 1
            t = t + 1

    # Chama o main loop
    main()

1 answer

2

Hello, congratulations on your programming initiative. Your version of the code is well organized and commented on. This is good programming practice.

As you are starting out and are creating your own version of the problem, I changed your code minimally. Over time you will see where you can best and optimize your programs.

In order for the wrong user inputs to count as attempts, I added the variable maxTentativas which will become true by reaching the maximum number of attempts allowed and will prevent the code from entering the part testing the number after the while. I removed your variable x and left only the t, then there is no need for the first.

The variable is initialized before the first while:

n = 0
t = 0
maxTentativas = False
r = random.randint(1,100)

And also when new iteration enters the game. Here its variable x was replaced by t.

if t >= 5 or n == r:
    # Se errar
    if t >= 5 and n != r:
        print('\n5 tentativas não foram suficientes! :(\n')
        linhas()
# Errando ou acertando...
t = 0
maxTentativas = False
r = random.randint(1,100)
s = input('\n[S] para sair: ')

Your trial counter is added to except and, just after incrementing it, there is a test to see if it has reached the maximum of attempts. True case it updates the variable maxTentativas comes out of while. Then, if the player has reached the maximum of attempts, there is no need to test whether he has hit the number or not. Thus, the if after the while prevents such tests from being carried out.

# Verifica se números são digitados ao invés de letras...
while True:
    try:
        n = int(input('\nDigite um valor: '))
        vazio()
        pontinhos()
        linhas()
        break
    except ValueError:  # Se digitar letra ao invés de n....
        linhas()
        print('\nIsso não é um número!\n')
        linhas()
        t = t + 1
        if t >= 5:
            maxTentativas = True
            break

if not maxTentativas:
    # Se acertar
    if n == r:
        print('\nVocê acertou em %d tentativas! :)\n' % t)
        linhas()
        time.sleep(1)
    # Se o número digitado for menor que a resposta...
    elif n > r:
        print('\nO número é menor que isso!\n')
        linhas()
        time.sleep(1)
    # Se o número digitado for maior que a resposta...
    elif n < r:
        print('\nO número é maior que isso!\n')
        linhas()
        time.sleep(1)
    t = t + 1

Browser other questions tagged

You are not signed in. Login or sign up in order to post.