3
respostas

forca

Como o algoritmo saberá que a palavra esta completa se o 'not enforcou' e o 'not acabou' não virar True e sair do laço?

3 respostas

Por isso ele fica no laço while, o laço faz a contagem dos acertos e erros e deduz o resultado. Abaixo o exemplo de código:

def jogar():
    print("*********************************")
    print("***Bem vindo ao jogo da Forca!***")
    print("*********************************")

    palavra_secreta = "banana"
    letras_acertadas = ["_", "_", "_", "_", "_", "_"]

    enforcou = False
    acertou = False

    print(letras_acertadas)

    while(not enforcou and not acertou):

        chute = input("Qual letra? ")
        chute = chute.strip()

        index = 0
        for letra in palavra_secreta:
            if(chute.upper() == letra.upper()):
                letras_acertadas[index] = letra
            index = index + 1

        print(letras_acertadas)

    print("Fim do jogo")

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

Olha o laço, a estrutura dele? Vê se vc consegue entender cada parte!

Da forma que o amigos escreveu aí em cims fica em um loop infinito. Você tem que reatribuir valores para acertou e enforcou ou então um condicional de break.

# coding=UTF-8
import random
import unicodedata

def enforcado(erro):
    print ("Você já teve {} erros!".format(erro))
    print ("     +--------+")
    print ("     |        |")
    if (erro > 0):
        print("     O        |")
    else:
        print("              |")
    if (erro == 2):
        print("     |        |")
    elif (erro == 3):
        print("    /|        |")
    elif (erro > 3):
        print("    /|\       |")
    else:
        print("              |")
    if (erro > 5):
        print ("     |        |")
    else:
        print("              |")
    if (erro == 6):
        print ("    /         |")
    elif (erro == 7):
        print("    / \       |")
    else:
        print("              |")
    print ("              |")
    print (" ________________")
    print (" ________________", end="\n\n")

def pega_chute():
    while(True):
        print("Digite seu chute:")
        chute_dado = ((input("->  ").split())[0]).upper()
        try:
            chute_dado = int(chute_dado)
            print("Digite apenas LETRAS!", end="\n\n")
            continue
        except:
            if (len(chute_dado) > 1):
                print("Digite apenas UMA letra!", end="\n\n")
                continue
            else:
                break
    return chute_dado

def checar_palavra(chute, palavra_secreta):
    posicao = 0
    lista_de_posicao = []
    for letra in palavra_secreta:
        if (chute == ''.join((c for c in unicodedata.normalize('NFD', letra) if unicodedata.category(c) != 'Mn'))):
            lista_de_posicao.append(posicao)
        posicao += 1
    if (len(lista_de_posicao) != 0):
        return [True, lista_de_posicao]
    else:
        return [False, lista_de_posicao]

def imprimir_palavra(n_letras, letras_encontradas):
    index = 0
    for caracter in n_letras:
        if index in list(letras_encontradas.keys()):
            print(" {} " .format(letras_encontradas[index]), end="")
        else:
            print(" _ ", end="")
        index += 1
    print("", end='\n\n')

def julgamento(acertos, total, jogadas, jogadas_max):
    if (acertos - total == 0):
        acertou = True
    else:
        acertou = False
    if (jogadas == jogadas_max):
        enforcou = True
    else:
        enforcou = False
    return [acertou, enforcou]

def encerramento(acertou, enforcou, palavra_secreta, jogadas_max, erro):
    if (acertou):
        print("Parabéns, você ganhou!")
    if (enforcou):
        enforcado(erro)
        print ("Você perdeu! Usou todas as suas {} chances." .format(jogadas_max))
        print("A palavra secreta era {}!". format(palavra_secreta))

def decide_jogadas(nivel, tamanho_da_palavra):
    if (nivel == 1):
        return 20
    elif (nivel == 2):
        return 15
    elif (nivel == 3):
        return 10
    else:
        return 7

def pegar_palavra(dificuldade):
    lista_de_palavras = []
    with open("palavras.txt", encoding="utf-8") as my_file:
        for linha in my_file:
            lista_de_palavras.append(linha.strip())
    palavra_escolhida = random.randrange(0, len(lista_de_palavras))
    palavra_secreta = (lista_de_palavras[palavra_escolhida]).upper()
    return [palavra_secreta.upper(), len(palavra_secreta)]

def forca(nivel):
    letras_encontradas = {}
    palavra_secreta = pegar_palavra(nivel)
    enforcou = False
    acertou = False
    jogadas = 0
    erro = 0
    jogadas_max = decide_jogadas(nivel, palavra_secreta[1])
    while(not enforcou and not acertou):
        jogadas += 1
        imprimir_palavra(palavra_secreta[0], letras_encontradas)
        chute = pega_chute()
        posicoes = checar_palavra(chute, palavra_secreta[0])
        if(posicoes[0]):
            for posicao_a_ser_impressa in posicoes[1]:
                letras_encontradas.update({posicao_a_ser_impressa:palavra_secreta[0][posicao_a_ser_impressa]})
        else:
            erro += 1
        controle = julgamento(len(letras_encontradas), palavra_secreta[1], jogadas, jogadas_max)
        enforcado(erro)
        acertou = controle[0]
        enforcou = controle[1]

    imprimir_palavra(palavra_secreta[0], letras_encontradas)
    encerramento(acertou, enforcou, palavra_secreta[0], jogadas_max, erro)

Eu fiz com uma função chamada julgamento().

Voce cria uma condição adicionando +1 nos erros, que quando chegar no erros ==5 o jogo acaba E tambem cria uma condição em que quando nao houverem mais espaços em branco ("_" == 0 ) o jogo acaba. Portanto vc cria essas condições que quando atingidas, as variaveis se tornam verdadeiras