Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Erro na contagem de rodadas, como resolver?

Ocorreu um erro no código, no caso, quando é inserido um número maior ou menor do que a condição(menor que 1 e maior que 100) as rodadas continuam sendo contadas, oque eu estou errando na lógica?

Tentei setar rodada como 0 ou fazer ela -1 dentro do bloco if(condicao): e mesmo assim não funcionou, ele seta a variavel rodada como 0 mas quando sobe para o for a rodada continua levando em consideração a rodada que não devia valer.

PS: esse código é exatamente o código dessa ultima aula, já copiei e colei no Pycharm e não deu diferença .

Segue o código:

import random

print("*********************************")
print("Bem vindo ao jogo de Adivinhação!")
print("*********************************")

numero_secreto = random.randrange(1,101)
total_de_tentativas = 0
pontos = 1000

print("Qual o nível de dificuldade?")
print("(1) Fácil (2) Médio (3) Difícil")

nivel = int(input("Defina o nível: "))

if(nivel == 1):
    total_de_tentativas = 20
elif(nivel == 2):
    total_de_tentativas = 10
else:
    total_de_tentativas = 5

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

    acertou = chute == numero_secreto
    maior   = chute > numero_secreto
    menor   = chute < numero_secreto

    if(acertou):
        print("Você acertou e fez {} pontos!".format(pontos))
        break
    else:
        if(maior):
            print("Você errou! O seu chute foi maior do que o número secreto.")
        elif(menor):
            print("Você errou! O seu chute foi menor do que o número secreto.")
        pontos_perdidos = abs(numero_secreto - chute)
        pontos = pontos - pontos_perdidos

print("Fim do jogo")
1 resposta
solução!

Na verdade não existe bem um "erro" nesse código. Pois depende muito da maneira como você interpreta a lógica do jogo.

Porque se o usuário possui, por exemplo, 5 tentativas no nível difícil e ele tem que digitar um número de 1 a 100.

Se ele digita 150, ele realmente tem que perde essa tentativa. Se ele não perdesse, ele poderia digitar infinitamente números menores que 1 ou maiores que 100, que ele nunca vai ter somente 5 tentativas.

Para tentar contextualizar de uma maneira melhor e um tanto quanto "grosseira", imagina que você tem 5 tentativas para acertar uma cesta de basquete que está a sua frente.

Em uma dessas 5 tentativas, você ao invés de jogar a bola para frente tentando acertar a cesta. Você simplesmente joga a bola para trás.

Nada te impende de você jogar a bola para trás, porém o desafio é acertar a cesta que está a sua frente. Então você perde uma da suas tentativas, caso contrario você poderia ficar ali, o resto da vida jogando a bola pra trás que o desafio nunca vai acabar.

A lógica do jogo segue mais ou menos esse mesmo "padrão". Você fala pro usuário que ele tem 5 tentativas para acertar um numero 1 a 100, nada impede ele de dizer 150. Porém será azar dele, pois acaba de desperdiçar uma das tentativas.

Mas enfim, chega de tentar explicar a lógica.

Referente ao código, com loop "for" você não vai conseguir ter esse controle.

Porque o loop "for" serve para você interar um lista, tupla e etc... Ou seja, o "for" irá percorrer todos os elementos da sua lista, tupla ou o que você tiver passado para interar, sem se preocupar em checar uma determinada condição.

Para saber mais sobre o loop "for" de uma olhada nessa documentação: https://wiki.python.org/moin/ForLoop

Nesse seu caso, se você quer realmente ter o controle sobre esse número de tentativas, você terá que alterar seu código para utilizar o loop "while".

Pois ao contrário de "for", o "while" verifica uma determinada condição antes de continuar.

import random

print("*********************************")
print("Bem vindo ao jogo de Adivinhação!")
print("*********************************")

numero_secreto = random.randrange(1,101)
total_de_tentativas = 0
pontos = 1000

print("Qual o nível de dificuldade?")
print("(1) Fácil (2) Médio (3) Difícil")

nivel = int(input("Defina o nível: "))

if(nivel == 1):
    total_de_tentativas = 20
elif(nivel == 2):
    total_de_tentativas = 10
else:
    total_de_tentativas = 5

rodada = 1 # Inicia a variável rodada com o valor inicial 1

# faz a verificação se rodada continua sendo menor ou igual ao número de tentativas
while (rodada <= total_de_tentativas): 
    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

    acertou = chute == numero_secreto
    maior   = chute > numero_secreto
    menor   = chute < numero_secreto

    if(acertou):
        print("Você acertou e fez {} pontos!".format(pontos))
        break
    else:
        rodada += 1 # Só aumenta o número da rodada, caso o usuário tiver errado
        if(maior):
            print("Você errou! O seu chute foi maior do que o número secreto.")
        elif(menor):
            print("Você errou! O seu chute foi menor do que o número secreto.")
        pontos_perdidos = abs(numero_secreto - chute)
        pontos = pontos - pontos_perdidos

print("Fim do jogo")