Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

UPDATE 08/07! - Tratamento de Erros- Jogo da Forca

Olá pessoal, estou tentando fazer o tratamento de erros no jogo da forca, porém ele não está executando da forma como deveria.

Consegui implementar um Try/Catch para impedir o usuário de digitar uma string e também, ao mesmo tempo forçá-lo a selecionar uma das categorias apresentadas.

Se a seleção da categoria é feita de imediato, o código roda e o jogo executa normalmente. Pelo trycatch também, se o usuário digita alguma str e depois seleciona uma categoria correta, o jogo inicia normalmente e executa ok.

Porém se o usuário insere um número fora do range da categoria, ao inserir um número correto, o código da erro e não executa.

Podem me ajudar em como posso resolver esse erro?

Segue meu código

import random


def jogar_forca():
    banner_inicial()
    banner_temas()
    index_temas = selecionar_tema()
    tema = analise_categoria(index_temas)
    jogo(tema)


def banner_inicial():
    print("########################################")
    print("########################################")
    print("###### BEM VINDO AO JOGO DE FORCA ######")
    print("########################################")
    print("########################################")
    print("\n")


def banner_temas():
    print("(1) Frutas || (2) Países || (3) Celebridades || (4) Objetos")


def selecionar_tema():
    temas = (1, 2, 3, 4)
    global numero_tema
    try:
        numero_tema = int(input("Selecione um Tema: "))
    except ValueError as err:
        print("Tente com Números!")
        banner_temas()
        selecionar_tema()

    if numero_tema not in temas:
        print("Digite o número correspondente aos temas apresentados")
        banner_temas()
        selecionar_tema()
    else:
        index_tema = numero_tema
        return index_tema


def analise_categoria(indice):
    global abrir_arquivo
    if indice == 1:
        abrir_arquivo = "frutas"
    elif indice == 2:
        abrir_arquivo = "paises"
    elif indice == 3:
        abrir_arquivo = "celebridades"
    elif indice == 4:
        abrir_arquivo = "objeto"

    return abrir_arquivo


def jogo(categoria):
    ler_arquivo = open(categoria + ".txt", "r", encoding="utf-8")
    palavras_no_arquivo = []

    for linha in ler_arquivo:
        linha = linha.strip()
        palavras_no_arquivo.append(linha)
    ler_arquivo.close()

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

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

    print("O Tema é: {}".format(categoria.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 restart():
    print("(S) SIM || (N) NÃO")
    replay = input("Quer Jogar novamente? ").upper()

    if replay == "S":
        jogar_forca()
    elif replay == "N":
        print("Até Mais!")
        exit()
    else:
        print("Digite S para SIM ou N para NÃO!!")
        restart()


if __name__ == "__main__":
    jogar_forca()

2 respostas
solução!

Oi Alan, tudo bem?

Peço desculpas pela demora em obter um retorno.

Para a validação dentro da função “selecionar_tema”, ao invés de try/except, uma saída é aliar um loop while, juntamente a função isnumeric que valida se o valor digitado é ou não um número, evitando assim o tratamento de uma exceção de ValueError. Sendo assim, o código dessa função pode ser aprimorado para:

def selecionar_tema():
    temas = (1, 2, 3, 4)

    numero_tema = input("Selecione um Tema: ")
    while True:
        if numero_tema.isnumeric() and int(numero_tema) in temas:
             return int(numero_tema)
        else:
            numero_tema = input("Selecione um Tema válido: ")

Na condição if, asseguramos que caso o valor digitado seja um número e esteja presente dentro a tupla de temas (1,2,3,4), retornaremos aquele valor. Mas, caso contrário, será pedido para o usuário digitar um tema válido.

Outra melhoria que pode ser implementada no código, é transformar o encadeamento de if/elif usado na função analise_categoria, em apenas um dicionário que retorna o tipo da categoria de acordo com o índice selecionado:

def analise_categoria(indice):

    dicionario_de_escolhas = {
        1: "frutas",
        2: "paises",
        3: "celebridades",
        4: "objeto"
    }


    return dicionario_de_escolhas[indice]

Através dessas mudanças o código funcionará como esperado. Abaixo uma demonstração prática:

Gif com fundo preto e letras brancas. A primeira mensagem é “Bem vindo ao jogo da forca”, após isso, é pedido para selecionar a categoria que deseja jogar: (1) frutas, (2) países, (3) celebridades, (4) objetos. Na primeira tentativa a pessoa digita 6 e é pedido para selecionar um número válido. A pessoa digita 5, novamente é pedido um número válido. A pessoa digita “f” e a mesma mensagem aparece. A pessoa digita uma sequência de espaços e novamente, é pedido um número válido. A pessoa digita 2 e o jogo começa. É uma palavra de 9 letras, da categoria de país. A pessoa digita G e uma letra é acertada, a pessoa digita E e acerta mais uma letra, a pessoa digita A e acerta duas letras da palavra. O gif termina.

Em caso de dúvidas fico à disposição.

Abraços e bons estudos!

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

Excelente Felippe, muito obrigado pelo retorno.