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

Há um "Continue" que não conta na interação?

Durante o curso, na parte 5 Iterando de maneira diferente, nos é mostrado o seguinte código:

`for rodada in range(1, total_de_tentativas + 1):
print("Tentativa {} de {}".format(rodada, total_de_tentativas))
chute_str = input("Digite um número entre 1 e 100: ")
print("Você digitou: ", chute_str)
chute = int(chute_str)
if (chute < 1 or chute > 100):
    print("Você deve digitar um número entre 1 e 100!")
    continue
`

Com o continue, caso o jogador selecione um nº diferente do definido nessa range, ele perderá uma tentativa, caso eu deseje que o jogador não perca uma tentativa, o que seria necessário fazer para solucionar isso?

3 respostas

Você pode fazer um if antes, verificando se o chute do usuário contém naquela range:

se sua range vai de 1 a 100 por ex:

chute = 200 if(chute not in range(1,101)): aqui voce colocaria a logica para nao tirar os pontos do jogador

solução!

Passei algumas horas tentado achar a solução usando apenas o laço for e não tive sucesso.

Acontece que esse laço possui uma quantidade finita de repetições, ou seja, no caso de for rodada in range (1, total_de_tentativas + 1): será executando 3 vezes; a função range retornará uma sequência de numeros (1, 2, 3). Leia um pouco mais em Python For Loops

Independemente de uma condição, ou de um pass | continue, ele será executado 3 vezes. Isso apresenta algumas vantagens de desempenho em casos mais específicos e/ ou usando algumas funções a mais.

Nesse sentido, você pode mudar o laço para while e, por meio de um contador, incrementar somente se a entrada for válida.

rodada = 1    # Tambem o contador
tentativas = 3

while rodada <= tentativas:

    print("Tentativa {} de {}".format(rodada, tentativas))

    # Entrada e conversão de tipo
    chute = int (input("Digite um número entre 1 e 100: ")) 

    print("Você digitou: ", chute)

    # Se a entrada nao for válida, o usuario nao perde pontos
    if (chute < 1 or chute > 100):

        print("Você deve digitar um número entre 1 e 100!")

        continue

    else:   # Incrementar rodada somente se for válido

        rodada += 1     #Essa linha é o mesmo que rodada = rodada + 1

Uma outra alterativa é fazer o uso de funções e recursão, que é, a grosso modo, uma função que chama a si mesma. O ponto aqui é que esses assuntos serão estudados futuramente (o estudo de funçoes está presente em Python 3 parte 2: avançando na linguagem.

total_de_tentativas = 3

# Definicao da funcao
def adivinhar ():

    for rodada in range(1, total_de_tentativas + 1):

        print("Tentativa {} de {}".format(rodada, total_de_tentativas))

        chute_str = input("Digite um número entre 1 e 100: ")

        print("Você digitou: ", chute_str)

        chute = int (chute_str)

        if (chute < 1 or chute > 100):

            print("Você deve digitar um número entre 1 e 100!")

            # Recursao: se a entrada for invalida, execute a funcao avidinhar () novamente
            adivinhar ()

            break

# Chamada da funcao
adivinhar ()

Esse código faz o mesmo que o anterior, usando while, mas, a princípio, parece desnecessáriamente complicado.

é eu tinha pensado que com o while deveria ser + simples, obrigado pela ajuda :D