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

Erro Traceback

Olá pessoal, estou tentando fazer o tratamento de erros no jogo da forca, porém ele não está executando da forma como deveria. Quero impedir do usuário digitar uma str e forçá-lo a digitar um int e também selecionar uma das categorias da forca, porém o código executa apenas uma vez da forma correta.

Fiz o teste digitando uma str primeiro e depois um int corretamente, o código apresenta o seguinte erro: E se eu fizer o teste digitando um int fora da minha list de categorias, apresenta o mesmo erro abaixo:

PS: A falha está no método selecao_tema

Traceback (most recent call last):
  File "/home/alan/PycharmProjects/Jogos/forca.py", line 114, in <module>
    jogar()
  File "/home/alan/PycharmProjects/Jogos/forca.py", line 6, in jogar
    tema = selecao_tema()
  File "/home/alan/PycharmProjects/Jogos/forca.py", line 85, in selecao_tema
    while selecione_o_tema not in temas:
UnboundLocalError: local variable 'selecione_o_tema' referenced before assignment

Meu Código está assim:

import random

def jogar():

    banner_abertura()
    tema = selecao_tema()

    ler_arquivo = open(tema + ".txt", "r", encoding="utf-8")
    palavra = []

    for linha in ler_arquivo:
        linha = linha.strip()
        palavra.append(linha)

    ler_arquivo.close()

    indice_palavra = random.randrange(0, len(palavra))
    palavra_secreta = palavra[indice_palavra].upper()

    letras_acertadas = ["_" for _ in palavra_secreta]
    letras_erradas = []

    print("O Tema é: {}".format(tema.upper()))

    print("A Palavra Secreta têm {} letras!".format(len(palavra_secreta)))
    print("Dica: Pode ser um nome composto, então '-' entra como caractere!")

    enforcou = False
    acertou = False
    erros = 6

    print(letras_acertadas)

    while not acertou and not enforcou:

        chute = input("Digite uma letra: ")
        chute = chute.strip().upper()

        if chute in palavra_secreta:
            index = 0
            for letra in palavra_secreta:
                if chute == letra:
                    letras_acertadas[index] = chute
                index += 1

        else:
            letras_erradas.append(chute)
            print("Letras Erradas que você já Chutou: {}".format(letras_erradas))
            erros -= 1
            print("Você tem Mais {} chances...".format(erros))
        enforcou = erros == 0
        acertou = "_" not in letras_acertadas

        print(letras_acertadas)

    if acertou:
        print("Você Acertou a Palavra Secreta! Parabéns!")
        print("A Palavra Secreta Era: {}".format(palavra_secreta))
    else:
        print("Você Não Acertou a Palavra Secreta... Tente Novamente")
        print("A Palavra Secreta era: {}".format(palavra_secreta))


    print("Fim do jogo")
    print("\n")

    restart()

def banner_abertura():
    print('*****************************************')
    print('****** Bem-vindo ao jogo da Forca *******')
    print('*****************************************')
    print("\n")

def selecao_tema():
    print("(1) Frutas || (2) Países || (3) Celebridades || (4) Objetos")
    temas = [1,2,3,4]

    try:
        selecione_o_tema = int(input("Selecione um Tema: "))
    except ValueError:
        print("Isto não é um Número ¬¬")
        selecao_tema()

    while selecione_o_tema not in temas:
        print("Selecione uma das Categorias!")
        break

    if selecione_o_tema == 1:
        abrir_arquivo = "frutas"
    elif selecione_o_tema == 2:
        abrir_arquivo = "paises"
    elif selecione_o_tema == 3:
        abrir_arquivo = "celebridades"
    elif selecione_o_tema == 4:
        abrir_arquivo = "objeto"
    else:
        print("Selecione um dos Temas Apresentados!")
        selecao_tema()

    return abrir_arquivo

def restart():
    print("(S) SIM || (N) NÃO")
    replay = input("Quer Jogar novamente? ").upper()
    print("\n")
    while replay != "S":
        print("Digite S para Sim ou N para Não")
        print("Quer Jogar novamente? ")
        replay = input().upper()
    jogar()

if __name__ == '__main__':
    jogar()
1 resposta
solução!

Olá, Alan. Tudo bem?

Peço perdão pela demora em dar um retorno.

O erro 'UnboundLocalError: local variable 'selecione_o_tema' referenced before assignment', normalmente acontece quando temos um problema de escopo de variável. O escopo de uma variável corresponde ao bloco de código aonde ela existe e pode ser utilizada.

No caso do seu código a variável 'selecione_o_tema' é criada dentro do bloco de código de tratamento de erros. Portanto, ela só existe dentro desse trecho:

    try:
        selecione_o_tema = int(input("Selecione um Tema: "))

Quando saímos desse bloco de 'try' essa variável deixa de existir e não pode ser utilizada em outros blocos do seu código.

Então, quando o código tentar utilizar o valor armazenado nela no trecho a seguir, ocorre um erro, pois a variável não existe mais.

    while selecione_o_tema not in temas:
        print("Selecione uma das Categorias!")
        break

Para solucionar o erro, crie a variável 'selecione_o_tema' antes do bloco de 'try' e atribua algum valor a ela como, por exemplo, o valor 1. Da seguinte maneira:

    selecione_o_tema = 1
    try:
        selecione_o_tema = int(input("Selecione um Tema: "))
    except ValueError:
        print("Isto não é um Número ¬¬")
        selecao_tema()

Assim, essa variável fará parte do escopo que engloba o seu laço de repetição 'while'. E erro deixará de acontecer.

Espero que tenha solucionado sua dúvida. Qualquer outra questão estou a disposição.

Abraços. Bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software