4
respostas

Melhorando arquivo adivinhacao.py

Bom dia, tudo bem? Seguindo a linha de aprendizado desta sessão, decidi melhorar o código do jogo adivinhacao.py com os novos conhecimentos, entretanto, ocorreram alguns erros. Ao criar as funções para deixar o código mais limpo, as funções dentro do def jogar(): não estão reconhecendo algumas variáveis, como posso resolver isso? Segue o código abaixo:

import random

def jogar(): elementar() definindo_chutes() resultados()

#Funções def elementar(): print("***") print("** Bem vindo ao jogo de adivinhação! **") print("***") numero_secreto = random.randrange(1, 101) total_de_tentativas = 0 pontos = 1000 print("Qual nivel de dificuldade?") print("[1] Fácil [2] Médio [3] Difícil")

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

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

def definindo_chutes(): for rodada in range(1, total_de_tentativas + 1): print("Rodada {0} de {1}".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("Atenção: o número digitado deve ser entre 1 e 100!")
        continue  # Diferente do break, retorna o laço

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

def resultados(): if (acertou): print("Você acertou, parabéns! Sua pontuação foi {}".format(pontos))

    #break
else:
    if (maior):
        print("Você errou :( seu chute foi maior do que o número secreto")
    elif (menor):
        print("Você errou :( seu chute foi menor do que o número secreto")
    pontos_perdidos = abs(numero_secreto - chute)
    pontos = pontos - pontos_perdidos

print("Fim do jogo! O número secreto era {}.".format(numero_secreto))

if(name == "main"): jogar()

4 respostas

Olá Monique!

Perdão, ficou bem difícil de entender o seu código desta maneira.

Tente colocar ele inteiro dentro de apenas um bloco de código no formulário abaixo. Isso ajudará na leitura do que você escreveu. :)

Desculpe, algumas partes ficaram fora do bloco de código, segue novamente:

import random

def jogar():
    elementar()
    definindo_chutes()
    resultados()

def elementar():
    print("*******************************************")
    print("**** Bem vindo ao jogo de adivinhação! ****")
    print("*******************************************")
    numero_secreto = random.randrange(1, 101)
    total_de_tentativas = 0
    pontos = 1000
    print("Qual nivel de dificuldade?")
    print("[1] Fácil [2] Médio [3] Difícil")

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

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

def definindo_chutes():
    for rodada in range(1, total_de_tentativas + 1):
        print("Rodada {0} de {1}".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("Atenção: o número digitado deve ser entre 1 e 100!")
            continue

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


def resultados():
    if (acertou):
        print("Você acertou, parabéns! Sua pontuação foi {}".format(pontos))
        break
    else:
        if (maior):
            print("Você errou :( seu chute foi maior do que o número secreto")
        elif (menor):
            print("Você errou :( seu chute foi menor do que o número secreto")
        pontos_perdidos = abs(numero_secreto - chute)
        pontos = pontos - pontos_perdidos

    print("Fim do jogo! O número secreto era {}.".format(numero_secreto))


if(__name__ == "__main__"):
    jogar()

Vamos lá Monique...

Tinha alguns errinhos que estavam impedindo o seu código de funcionar.

O primeiro deles é na variável total_de_tentativas. Quando você cria uma variável dentro de uma função, ela só vai existir dentro daquela função. Para que você possa reutilizar aquela variável, você deve usar o comando return total_de_tentativas, e depois, informar a segunda função aquela variável.

Corrigindo o seu código na função elementar():

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

    return total_de_tentativas # você não estava retornando o total de tentativas

E depois lá em cima você precisa informar a variável:

def jogar():
    total_de_tentativas = elementar() #salvamos o retorno na variável
    definindo_chutes(total_de_tentativas) #passamos o retorno pra segunda função
    resultados()

A mesma coisa acontece com as variáveis pontos e numero_secreto. Elas existem dentro da função elementar, mas não são passadas as demais. Para facilitar, vamos criar essas duas variáveis no início do código, fora de todas as funções. Junto com elas, você criou a variável total_de_tentativas = 0. Não tem nenhuma necessidade disso, então podemos apagar.

import random

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

def jogar()
     ...

O próximo erro agora está com as variáveis acertou, maior e menor que estão com o mesmo problema das demais: existem apenas dentro de uma função.

O que eu fiz foi o seguinte:

    if chute == numero_secreto:
        resposta = "acertou"
    elif chute > numero_secreto:
        resposta = "maior"
    else:
        resposta = "menor"

    return resposta

Eliminei aquele código e criei uma variável única resposta. Ela irá receber um valor para cada caso, se o chute foi maior, menor ou acertado. Irei também retornar essa variável e salvá-la quando chamarmos a função. Também iremos passar a variável resposta para a função resultados().

def jogar():
    total_de_tentativas = elementar() #salvamos o retorno na variavel
    resposta = definindo_chutes(total_de_tentativas) #passamos o retorno pra função // salvamos retorno da variavel resposta
    resultados(resposta) # passamos o retorno pra função

Lá dentro da resultados() vamos também mudar a forma como ele informa se o chute foi correto ou não. Não esquecer de passar a resposta como parâmetro ao chamar a função resultados():

def resultados(resposta):
    if resposta == "acertou":
        print("Você acertou, parabéns! Sua pontuação foi {}".format(pontos))
    else:
        if (resposta == "maior"):
            print("Você errou :( seu chute foi maior do que o número secreto")
        elif (resposta == "menor"):
            print("Você errou :( seu chute foi menor do que o número secreto")

Você também tinha o seguinte código:

def resultados():
    if resposta == "acertou":
        print("Você acertou, parabéns! Sua pontuação foi {}".format(pontos))
        break

O break só é usado em loops. Não tem necessidade de usar dentro do if, uma vez que caso a condição do if seja verdadeira, o python vai executar aquilo e terminar a análise de forma automática. Ah não ser que você queira interromper um loop caso uma condição se concretize, aí sim dá pra usar o break dentro do if. Mas nesse caso ali, o if não está dentro de um loop, então o python gera um erro.

CONTINUA

Próximo erro é a parte dos pontos e essa está sendo a mais difícil para mim... Comecei informando a variável pontos para a função resultados():

    resultados(resposta, pontos) # passamos o retorno pra função // passamos a variavel pontos também

Mas aí percebi que há todo um problema estrutural no seu código. Você está usando um loop para receber os chutes. O que acontece é que o loop será totalmente executado enquanto tiver tentativas e somente depois ele vai chamar a função resultados(). Da forma que está aí ele só irá verificar se o chute está correto depois que todos os chutes sejam feitos.

Daí não teve jeito, tive que reformular toda a parte final e até algumas partes do início do seu código e a forma como eu chamava a função resultados().

Vou colocá-lo aqui e aí você dê uma boa lida e vai comparando com o antigo e tentando entender o que eu fiz. Caso permaneça alguma dúvida, você me manda aqui que tento explicar. :)

Código final:

import random

numero_secreto = random.randrange(1, 101)


def jogar():
    total_de_tentativas = elementar()  # salvamos o retorno na variavel
    definindo_chutes(total_de_tentativas)  # passamos o retorno pra função


def elementar():
    print("*******************************************")
    print("**** Bem vindo ao jogo de adivinhação! ****")
    print("*******************************************")
    print("Qual nivel de dificuldade?")
    print("[1] Fácil [2] Médio [3] Difícil")

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

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

    return total_de_tentativas  # você não estava retornando o total de tentativas


def definindo_chutes(total_de_tentativas):
    pontos = 1000
    for rodada in range(1, total_de_tentativas + 1):
        print("Rodada {0} de {1}".format(rodada, total_de_tentativas))
        chute_str = input("Digite um número entre 1 e 100: ")
        print("Você digitou:", chute_str)
        chute: int = int(chute_str)

        if (chute < 1 or chute > 100):
            print("Atenção: o número digitado deve ser entre 1 e 100!")
            continue

        if chute == numero_secreto:
            resposta = "acertou"
            resultados(resposta, pontos)
            break
        elif chute > numero_secreto:
            resposta = "maior"
            pontos = pontos - chute
            resultados(resposta, pontos)
        else:
            resposta = "menor"
            pontos = pontos - chute
            resultados(resposta, pontos)

    print("Fim do jogo! O número secreto era {}.".format(numero_secreto))

def resultados(resposta, pontos):
    if resposta == "acertou":
        print("Parabéns! Você acertou! Sua pontuação é: {}".format(pontos))
    elif resposta == "maior":
        print("Seu chute foi maior que o número secreto.")
    else:
        print("Seu chute foi menor que o número secreto.")


if (__name__ == "__main__"):
    jogar()