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

porque não sai do loop quando acerta a palavra

def jogar():
    print("*********************")
    print("****jogo da forca****")
    print("*********************")

    palavra_secreta = "banana".upper()
    letras_acertadas = ["_" for letra in palavra_secreta]

    print(f"A palavra tem {len(palavra_secreta)} Letras")
    print(letras_acertadas)


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

    while (not acertou and not enforcou):
        print(f"você tem direito à {tentativas} tentativas")
        chute = input("Qual a sua sugestão de letra ? ")
        chute = chute.strip().upper()

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

            print(letras_acertadas)

        else:

            erros += 1
            tentativas -= 1
            enforcou = erros == tentativas
            acertou = "_" not in letras_acertadas

            print(letras_acertadas)
            print(f"vocë já errou {erros} vezes")



    if acertou:
        print("você ganhou")

    else:
        print("você perdeu")



    print("Fim do Jogo!!!")


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

Emerson, achei o erro aqui:

acertou = "_" not in letras_acertadas

Esta linha só é executada no caso de erro, por causa do seu if:else:, olha só:

if (chute in palavra_secreta):
  # varios comandos
else:
  # varios comandos
  acertou = "_" not in letras_acertadas
  # outros comandos

Portanto o jogo só pode terminar se, depois que você acertar a palavra inteira, errar uma vez! Jogue essa atribuição pra fora do if:else: e seu problema deve estar resolvido. Eu colocaria como sendo a última linha do seu loop while():.

Bons estudos!

solução!

Olá Emerson,

o Python3 identifica o que pertence ao grupo do else pelo nível de indentação. Deste modo, você está dizendo que se o chute não está na palavra secreta, então deve ser executado esse bloco:

erros += 1
tentativas -= 1
enforcou = erros == tentativas
acertou = "_" not in letras_acertadas
print(letras_acertadas)
print(f"vocë já errou {erros} vezes")

Mas veja que as únicas linhas que devem ser executadas caso o chute tenha sido errado são as duas primeiras, que aumenta o número de erros e diminui as tentativas restantes. Ou seja, as 4 últimas linhas do que eu colei acima devem ter um recuo no nível de indentação, para acontecer independente do if/else.

Além disso, veja que você imprime o estado atual da forca independente da pessoa acertar ou não. Isso significa que a linha de código que faz isso deve estar fora do if/else, e não presente nos dois.

Outro erro no código: você diz que enforcou se o número de tentativas é igual ao número de erros. Mas o número de tentativas diminui a cada rodada. Você deveria comparar com o tamanho da palavra, que nunca muda.

O código final ficaria assim:

def jogar():
    print("*********************")
    print("****jogo da forca****")
    print("*********************")

    palavra_secreta = "banana".upper()
    letras_acertadas = ["_" for letra in palavra_secreta]

    print(f"A palavra tem {len(palavra_secreta)} Letras")
    print(letras_acertadas)


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

    while (not acertou and not enforcou):
        print(f"você tem direito à {tentativas} tentativas")
        chute = input("Qual a sua sugestão de letra ? ")
        chute = chute.strip().upper()

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

        else:
            erros += 1
            tentativas -= 1

         enforcou = erros == len(palavra_secreta)
         acertou = "_" not in letras_acertadas
         print(letras_acertadas)
         print(f"vocë já errou {erros} vezes")

    if acertou:
        print("você ganhou")

    else:
        print("você perdeu")

    print("Fim do Jogo!!!")


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

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