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

Loop infinito

Ao encapsular o código em funções, ele entrou em loop infinito e não entendo como resolver:

import jogos
import random

def iniciar_jogo():
    boas_vindas()
    palavra_secreta = gera_palavra_secreta()
    letras_acertadas = inicializa_palavra(palavra_secreta)
    chute = requisita_chute()


    erro = 0
    acertou = False
    enforcou = False

    while(not acertou and not enforcou):
        if(chute in palavra_secreta):
            verifica_posicao_do_chute(chute, palavra_secreta, letras_acertadas)
        else:
            print("A palavra secreta não possui esta letra")
            erro += 1

        enforcou = erro == 6
        acertou = "_" not in letras_acertadas

    if(acertou):
        ganhou()
    else:
        perdeu()

def boas_vindas():
    print("*******************************")
    print("* Bem vindo ao Jogo da Forca! *")
    print("*******************************")
    nome_do_jogador = input("Qual o seu nome?\n")
    print("Bem vindo {}, vamos começar?\n".format(nome_do_jogador))

def gera_palavra_secreta():
    lista_possiveis_palavras = []

    arquivo_de_palavras = open("possiveis_palavras.txt", "r")
    for linha in arquivo_de_palavras:
        lista_possiveis_palavras.append(linha.strip())
    arquivo_de_palavras.close()

    palavra_escolhida = random.randrange(0, len(lista_possiveis_palavras))
    palavra_secreta = lista_possiveis_palavras[palavra_escolhida].upper()

    return palavra_secreta

def inicializa_palavra(palavra_secreta):
    letras_acertadas = ["_" for letra in palavra_secreta]
    print(letras_acertadas, "\n")
    return letras_acertadas

def requisita_chute():
    chute = input("Qual a letra escolhida?\n").strip().upper()
    return chute

def verifica_posicao_do_chute(chute, palavra_secreta, letras_acertadas):
    posicao_da_letra = 0  #index que passa cada letra pelo for antes mesmo de ser testada pelo if e portanto, eh capaz de passar a posição de cada letra antes da verificação condicional de cada letra
    for letra in palavra_secreta:
        if (chute == letra):
            letras_acertadas[posicao_da_letra] = letra  #substitui os caracteres da lista pela letra acertada em sua respectiva posição
            print("        *")
            print("Letra * {} * encontrada na posição {}".format(letra, posicao_da_letra + 1))
            print("        *\n")
            print(letras_acertadas, "\n")
        posicao_da_letra += 1

def ganhou():
    print("Parabens, voce acertou a palavra secreta")

def perdeu():
    perdeu = input("Voce foi enforcado, deseja tentar novamente? sim/nao\n")
    if (perdeu == "sim"):
        iniciar_jogo()
    else:
        jogos.escolhe_jogo()

if(__name__ == "__main__"):
    iniciar_jogo()
1 resposta
solução!

Oi, Nícolas! Tudo bem? Isso é porque você está requisitando o chute do jogador fora do seu loop while principal, então o while vai ficar rodando sempre com a mesma primeira letra que você colocou. No caso, se a letra faz parte da palavra, o loop realmente repete pra sempre, porque ele testa isso com a mesma letra. Você pode até testar colocar uma letra que não tem na palavra e vai ver que, em vez de rodar pra sempre, o jogo vai acabar na hora:

Qual a letra escolhida?
k
A palavra secreta não possui esta letra
A palavra secreta não possui esta letra
A palavra secreta não possui esta letra
A palavra secreta não possui esta letra
A palavra secreta não possui esta letra
A palavra secreta não possui esta letra
Voce foi enforcado, deseja tentar novamente? sim/nao

A solução é pedir a letra para o jogador dentro do loop, para que a função requisita_chute seja chamada a cada volta do while, dessa forma:

while(not acertou and not enforcou):
        chute = requisita_chute()
        if(chute in palavra_secreta):
            verifica_posicao_do_chute(chute, palavra_secreta, letras_acertadas)
        else:
            print("A palavra secreta não possui esta letra")
            erro += 1

        enforcou = erro == 6
        acertou = "_" not in letras_acertadas

Deu pra entender mais ou menos qual era o problema? Espero ter ajudado! Abraços.