TransWikia.com

Looping e Finalização? Em Python

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!')

2 Answers

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

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP