How to insert a counter of attempts within a Python 3 exception (except ValueError)

1

Hello. I am a beginner in programming and I have been trying to develop programs that I have learned in programming book exercises on my own. I did 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 in the trial counter. The counter I placed (5x) only covers in case the user hits by entering only numbers, or miss the 5 attempts. However, there is an input validator. If the user types a letter, the validator goes into a loop and only exits if it 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 retries?

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()
    
asked by anonymous 24.07.2018 / 20:11

1 answer

2

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

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

For the wrong inputs of the user to count as attempts, I have added the variable maxTentativas that will become true upon reaching the maximum number of allowed attempts and will prevent the code from entering the test portion of the number after while . I removed its x variable and left only the t , so there is no longer a need for the first one.

The variable is initialized before the first while :

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

And also when the new iteration enters the game. Here your variable x has been 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 attempt count is added to except , and after you increment it, there is a test to see if you have reached the maximum number of attempts. True case it updates the variable maxTentativas exits while . Then, if the player has made the most attempts, there is no need to test whether he has hit the number or not. Thus% w /% after% w /% prevents these tests from being performed.

# 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
    
25.07.2018 / 02:37