1
resposta

Ajuda para melhorar o código do jogo da FORCA.

Estou querendo aprimorar o código do jogo da Forca.

Quero informar ao jogador, que quando faltar apenas 3 letras (ou menos) para completar a palavra secreta, ele terá que acertar a palavra completa e não mais, chutar cada letra.

Já pensei em várias tentativas, porém nenhuma deu certo.

import random


def jogar():
    mensagem_inicial()
    categoria = escolha_categoria()
    palavra_secreta = palavra_secreta_categorias(categoria)
    letras_acertadas = iniciar_letras_acertadas(palavra_secreta)
    print(f'A palavra secreta é {letras_acertadas}')

    enforcou = False
    acertou = False
    erros = 0

   #enquanto não enforcou e não acertou
    while(not enforcou and not acertou):

        chute = chute_jogador()

        if(chute in palavra_secreta):
            marcação_chute_correto(palavra_secreta, chute, letras_acertadas)
        else:
            desenha_forca(erros)
            erros += 1

        enforcou = erros == 8
        acertou = '_' not in letras_acertadas

        print(letras_acertadas)




    if(acertou):
        mensagem_ganhador()
    else:
        mensagem_perdedor(palavra_secreta)




########################################################


#funções

def mensagem_inicial():
    print('-' * 26)
    print('Bem vindo ao jogo da forca')
    print('-' * 26)

    print('===== Categorias =====')
    print('Frutas')
    print('Animes')
    print('Objetos')

def escolha_categoria():
    categoria = str(input('Escolha um tema para jogar: ')).lower()
    return categoria

def palavra_secreta_categorias(categoria):

    if categoria == 'frutas':

        arquivo = open('palavras2.txt', 'r')
        palavras = []

        for linha in arquivo:
            linha = linha.strip()
            palavras.append(linha)

        arquivo.close()

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


    elif categoria == 'objetos':
        arquivo = open('objetos.txt', 'r')
        palavras = []

        for linha in arquivo:
            linha = linha.strip()
            palavras.append(linha)

        arquivo.close()

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

def iniciar_letras_acertadas(palavra):
    return ["_" for letra in palavra]

def chute_jogador():
    chute = str(input('Escolha alguma letra: ')).upper().strip()
    return chute

def marcação_chute_correto(palavra_secreta, chute, letras_acertadas):
    index = 0
    for letra in palavra_secreta:
        if (chute == letra):
            letras_acertadas[index] = letra
        index += 1

def mensagem_ganhador():
    print("Parabéns, você ganhou!")

def mensagem_perdedor(palavra_secreta):
    print("Puxa, você foi enforcado!")
    print(f"A palavra era {palavra_secreta}")
1 resposta

Olá Erick, tudo bem com você?

Peço desculpas pela demora em lhe responder.

Um modo que podemos colocar essa implementação é contando quantas letras faltam para o usuário acertar, para fazermos isso vamos usar o método count() para contar quando underline (_) existe na palavra secreta, quando esse valor for igual ou menor que 3 o jogo pedirá o usuário que informe a palavra completa.

Essas mudanças foram realizadas na função jogar(), deixo abaixo o código com a implementação.


def jogar():
    mensagem_inicial()
    categoria = escolha_categoria()
    palavra_secreta = palavra_secreta_categorias(categoria)
    letras_acertadas = iniciar_letras_acertadas(palavra_secreta)
    print(f'A palavra secreta é {letras_acertadas}')

    enforcou = False
    acertou = False
    erros = 0
    quantidade_de_letras_faltantes = len(palavra_secreta)

    # enquanto não enforcou e não acertou
    while (not enforcou and not acertou):

        # se a quantidade de letras que falta para acertar for menor ou igual
        # a 3, o código irá pedir um input da palavra completa e comparar a palavra digitada
        # com a palavra secreta
        # Caso a pessoa acerte, a variável "acertou" receberá True e mostrará a mensagem de finalização do jogo
        if quantidade_de_letras_faltantes <= 3:
            palavra_completa = input("Digite a palavra completa: ")
            if palavra_completa == palavra_secreta.lower():
                acertou = True
        else:
            chute = chute_jogador()
            if (chute in palavra_secreta):
                marcação_chute_correto(palavra_secreta, chute,
                                       letras_acertadas)
            else:
                desenha_forca(erros)
                erros += 1
            enforcou = erros == 8
            acertou = '_' not in letras_acertadas
            # conta a quantidade de letras que ainda falta para acertar
            quantidade_de_letras_faltantes = letras_acertadas.count("_")

            print(letras_acertadas)

    if (acertou):
        mensagem_ganhador()
    else:
        mensagem_perdedor(palavra_secreta)


jogar()

Funcionamento

Imagem da tela do console Python com o fundo cinza, nessa imagem possui o funcionamento do código anterior, com a interação do usuário buscando a palavra papel e apresentando a modificação

Caso tenha mais dúvidas coloco-me à disposição.

Abraços e bons estudos.

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