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

Não reconhecendo variável booleana dentro de uma função

Boa tarde a todos! Estou com uma dúvida em como fazer uma função reconhecer variáveis booleanas. No meu jogo implementei os níveis de dificuldade (conforme código abaixo), só que no else não consigo fazer com que ele reconheça a variável "enforcou" para que o jogo finalize caso o usuário digite um nível invalido. Havia feito essa condição antes de definir a função "dificuldade()" e estava funcionando perfeitamente colocando apenas enforcou = True. Por conta dessa dúvida acabei não conseguindo fazer o jogo funcionar caso eu criasse funções para chutes certos e chutes errados também..

import random

def jogar():
    #variaveis
    enforcou = False
    acertou = False
    tentativas = 1

    def bem_vindo():
        print("---------------------------------")
        print("***Bem vindo ao jogo de Forca!***")
        print("---------------------------------")

    def pede_chute():
        chute = input("Chute uma letra? ")
        chute = chute.strip().upper()
        return chute

    def func_palavra_secreta():
        palavras = []

        with open("frutas.txt", "r", encoding="utf-8") as arquivo:
            for linha in arquivo:
                linha = linha.strip()
                palavras.append(linha)

        numero = random.randrange(0, len(palavras))
        palavra_secreta = palavras[numero].upper()
        return palavra_secreta

    def func_letras_certas(palavra_secreta):
        return ['_' for letra in palavra_secreta]

    def dificuldade():
        print("1 - Fácil | 2 - Médio | 3 - Difícil ")
        dificuldade = int(input("Digite um número de 1 a 3 para selecionar o nível de dificuldade: "))

        if (dificuldade == 1):
            print("Dica: é uma fruta")
            total_tentativas = 20
            return total_tentativas
        elif (dificuldade == 2):
            print("Dica: é uma fruta")
            total_tentativas = 12
            return total_tentativas
        elif (dificuldade == 3):
            total_tentativas = 8
            return total_tentativas
        else:
            enforcou = True
            total_tentativas = 0
            return total_tentativas

    #main
    bem_vindo()

    palavra_secreta = func_palavra_secreta()

    letras_certas = func_letras_certas(palavra_secreta)

    total_tentativas = dificuldade()

    print("Você tem {} tentativas...".format(total_tentativas))
    print(letras_certas)

    while (not enforcou and not acertou):
            chute = input("Qual a letra? ")
            chute = chute.strip().upper()

            if (chute in palavra_secreta):
                posicao = 0
                for letra in palavra_secreta:
                    if (chute == letra):
                        letras_certas[posicao] = letra
                    posicao += 1
                print("Acertou a letra! Você tem mais {} tentativa(s)...".format(total_tentativas - tentativas))
                tentativas += 1

            elif(total_tentativas >= 0):
                print("Você errou e tem mais {} tentativa(s)...".format(total_tentativas - tentativas))
                tentativas += 1
            else:
                tentativas += 1
            enforcou = tentativas > total_tentativas
            acertou = '_' not in letras_certas
            print(letras_certas)

    if (acertou):
        print("Parabéns!! Você ganhou!!!")
    else:
        print("Você perdeu!!!A palavra secreta era {} !".format(palavra_secreta))

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

Desde já agradeço! Att,Guilherme.

1 resposta
solução!

Olá Guilherme, tudo bem? Espero que sim!

O que está acontecendo é que a variável enforcou dentro da função dificuldade() é uma variável local, e mesmo que tenha o mesmo nome da variável global fora dela, não irá modificar a variável do lado de fora, que é o seu intuito. Ela é uma variável que foi criada dentro da função e vai funcionar dentro do escopo daquela função. Só poderá ser conhecida fora dela com o uso do return.

Então quando você faz total_tentativas = dificuldade(), o seu código main terá conhecimento do total de tentativas, mas não da variável enforcou que foi criada dentro da função.

Vou deixar um link que explica sobre esse conceito:

Variáveis locais e globais

Você pode tirar essa parte do enforcou dentro da função e checar no while se a quantidade de tentativas for diferente de 0.

while (not enforcou and not acertou and total_tentativas != 0 )

Outra coisa que notei foi que a sua função pede_chute() foi criada mas nunca foi utilizada no código.

Espero que tenha tirado sua dúvida.

Estou à disposição. Bons estudos!