Stack Overflow em Português Asked by Augusto Casarin Rickes on February 13, 2021
Olá, pessoal. Estou com um problema no meu programa. Não estou conseguindo fazer ele ficar em looping até eu "encerrar" ele. Vou estar deixando o código dele, para ficar mais fácil de entenderem. Onde o operador selecionasse para jogar novamente, deveria vir para o ‘menu’ inicial (selecionar dificuldades e tal), ‘2’ deveria "encerrar" o programa. Só que não vai, ele volta pra dentro do FOR e fica ali, repetindo sempre
a=1
pontos=1000
import random
while a==1:
print('Bem vindo ao jogo de adivinhar. Em qual dificuldade gostaria de tentar?n')
b=int(input('1-Facil?(9 tentativas)n2-Medio?(6 tentativas)?n3-Dificil?(3 tentativas)nVoce comeca com 1000 pontos. Cada vez que errar, perde 50 pontos.n'))
while b==1:
valor=random.randrange(1,10)
for c in range(9):
d=int(input('Digite um numero entre 1 e 10n'))
if valor==d:
print('Parabens, acertou!n')
break
else:
print('Tente novamenten')
pontos=pontos-50
print('Saldo de pontos:n',pontos)
a=int(input('Gostaria de jogar novamente?n1-Simn2-Naon'))
while b==2:
valor=random.randrange(1,50)
pontos=1000
for c in range(6):
d=int(input('Digite um numero entre 1 e 50:n'))
if valor==d:
print('Parabens, acertou!n')
break
else:
print('Tente novamenten')
pontos=pontos-50
print('Saldo de pontos: ',pontos)
a=int(input('Gostaria de jogar novamente?n1-Simn2-Naon'))
while b==3:
valor=random.randrange(1,50)
pontos=1000
for c in range(3):
d=int(input('Digite um numero entre 1 e 100:n'))
if valor==d:
print('Parabens, acertou!n')
break
else:
print('Tente novamenten')
pontos=pontos-50
print('Salndo de pontos: ',pontos)
a=int(input('Gostaria de jogar novamente?n1-Simn2-Naon'))
print('Obrigado por jogar!')
Tem vários problemas aí. Um deles, por exemplo, é esse while
:
b = int(input(...))
while b==1: etc...
Se for digitado 1
, ele entra no while
. Mas dentro do while
você não muda o valor de b
em nenhum momento, então ele entra em loop infinito, veja.
Na verdade você está complicando à toa, não tem porque fazer um while
para a dificuldade, e também não tem porque repetir o mesmo código para cada nível de dificuldade, sendo que o que muda são apenas a quantidade de tentativas e o intervalo dos números. Uma forma mais simples seria:
def ler_numero(mensagem, valores_validos):
while True:
try:
valor = int(input(mensagem))
if valor in valores_validos:
return valor
else:
print(f'Valor deve ser: {", ".join(map(str, valores_validos))}')
except ValueError:
print('Você não digitou um número, tente novamente')
import random
pontos = 1000
while True:
print('Bem vindo ao jogo de adivinhar. Em qual dificuldade gostaria de tentar?n')
dificuldade = ler_numero(
'1-Facil?(9 tentativas)n2-Medio?(6 tentativas)?n3-Dificil?(3 tentativas)nVoce comeca com 1000 pontos. Cada vez que errar, perde 50 pontos.n',
(1, 2, 3))
if dificuldade == 1:
tentativas = 9
valor_maximo = 10
elif dificuldade == 2:
tentativas = 6
valor_maximo = 50
else: # a função ler_numero já me garante que a dificuldade é 1, 2 ou 3
tentativas = 3
valor_maximo = 100
valor = random.randint(1, valor_maximo)
for i in range(tentativas):
palpite = ler_numero(f'Digite um número entre 1 e {valor_maximo}: ', range(1, valor_maximo + 1))
if palpite == valor:
print('Parabéns, acertou!')
break
else:
pontos -= 50
if i != tentativas - 1: # se não é a última tentativa
print('Tente novamente')
else:
print(f'Você não acertou, o número era {valor}')
print(f'Você fez {pontos} pontos')
if 2 == ler_numero('Gostaria de jogar novamente?n1-Simn2-Naon', (1, 2)):
break # sai do while True
print('Obrigado por jogar!')
Criei a função ler_numero
, que valida não só se o valor é válido (se está entre um valor mínimo e máximo, por exemplo), como também verifica se foi de fato digitado um número (capturando o ValueError
, que ocorre se o usuário digitar algo que não seja um número).
Depois eu crio um loop com while True
(que se repete indefinidamente, até encontrar um break
). Não há porque criar uma variável artificial (a
) só para controlar o loop.
Quando a dificuldade é escolhida, eu arrumo os valores que vão mudar: a quantidade de tentativas e o valor máximo a ser escolhido por randint
(eu mudei randrange
para randint
, pois randrange(1, 10)
escolhe um número entre 1 e 9, enquanto randint(1, 10)
escolhe um número entre 1 e 10 - veja a documentação - e me parece que o que você precisa é randint
).
Depois, basta fazer um for
para ir lendo os palpites. Se acertar, interrompe o loop, senão continua até a quantidade de tentativas.
No final eu leio a opção de continuar ou não.
Um detalhe é que a pontuação nunca é reiniciada, não sei se era a intenção: quando o usuário escolhe jogar novamente, a pontuação não volta a ser 1000. Se a ideia era voltar para 1000, coloque pontuacao = 1000
dentro do while
, logo antes de imprimir a mensagem de escolha de dificuldade.
Outro ponto é que dei nomes melhores para as variáveis (dificuldade
é mais claro do que b
, por exemplo, pois deixa claro o que aquele valor representa). Pode parecer um detalhe besta, mas nomes melhores ajudam na hora de progamar.
Answered by hkotsubo on February 13, 2021
Adicione um break
imediatamente após o usuário informar se deseja continuar jogando. Isso forçará a saída do 2º loop, retornando para a validação do 1º loop.
a = int(input('Gostaria de jogar novamente?n1-Simn2-Naon'))
break
O problema ocorre pois a forma como está escrito a validação do segundo while sempre será true
. Após o usuário informar o código 2 (sair) no final, ele continua no loop atual uma vez que não houve alteração no valor da variável b
.
Por isso, também daria certo se você alterasse o valor da variável b
para qualquer outro valor que não seja 1,2 ou 3 (opções da primeira pergunta).
a = int(input('Gostaria de jogar novamente?n1-Simn2-Naon'))
b = 0
Porém, eu acho que o código fica mais fácil de ler com o break.
Answered by phduarte on February 13, 2021
Get help from others!
Recent Questions
Recent Answers
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP