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.