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

[Dúvida] 05 Opcional: quantas tentativas faltam?

Diferente do instrutor, uilizei o codigo abaixo:

while(not enforcou and not acertou):

        chute = input("Qual 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_restantes = int(len(palavra_secreta) - int(erros))

        enforcou = erros == 6
        acertou = "_" not in letras_acertadas
        print(letras_acertadas)
        print("Você ainda tem ", tentativas_restantes, "tentativas restantes!")

apesar de mais longa que o código sugerido:

else:
    erros += 1
    print("Ops, você errou! Faltam {} tentativas.".format(6-erros))

pareceu acertada. Está correto?

2 respostas
solução!

Olá Eduardo, tudo bem com você?

Peço desculpas pela demora em lhe responder.

Meus parabéns pelo empenho e dedicação na resolução da atividade. Fico feliz que tenha compartilhado sua resolução no fórum Alura.

Vi que foi além do proposto na atividade e adicionou uma nova lógica de funcionamento do jogo, onde o número de tentativas máxima disponível para o usuário será definida pelo comprimento da palavra secreta (tentativas_restantes = int(len(palavra_secreta) - int(erros))).

Com essa mudança na definição do número máximo de tentativas, será necessário modificar a atribuição da variável enforcou, pois, ela está recebendo um valor máximo de tentativas fixo, neste caso, 6 tentativas (enforcou = erros == 6). Da forma que está, caso a palavra secreta possua menos de 6 letras, será impresso para o usuário que possui um número negativo de tentativas restantes (Ex: "Você ainda tem -3 tentativas restantes!").

  • Recomendo duas mudanças no código, a primeira mudança será no momento em que é feito o uso da função len(), não será necessário converter seu resultado para int, essa função já retorna um valor do tipo int. O mesmo acontece na conversão da variável erros, o número salvo nela é um número do tipo int. Assim, a declaração da variável tentativas_restantes ficará da seguinte forma.

      tentativas_restantes = len(palavra_secreta) - erros
  • O segundo ponto de mudança, será na declaração da variável enforcou, onde no lugar de um número fixo de erros (6) usaremos o comprimento da palavra secreta como número máximo de erros. Ficando como apresentado abaixo.

      enforcou = erros == len(palavra_secreta)
  • Após as mudanças salve o arquivo antes de executá-lo

  • Com essas mudanças, não será impresso um número negativo de tentativas para o usuário e o número máximo de tentativas será baseado no número de letras da palavra secreta.

Código completo com as mudanças aplicadas

    while (not enforcou and not acertou):

        chute = input("Qual 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_restantes = len(palavra_secreta) - erros

        enforcou = erros == len(palavra_secreta)
        acertou = "_" not in letras_acertadas
        print(letras_acertadas)
        print("Você ainda tem ", tentativas_restantes, "tentativas restantes!")

Espero ter ajudado. Em caso de dúvidas estou à disposição.

Não hesite em voltar ao fórum para continuar aprendendo e interagindo com a comunidade.

Abraços e bons estudos!

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

Felippe, boa tarde

A percepção de que traria um valor negativo é verdadeira e merece atenção e correção, entretanto a natureza do jogo de forca pede sete tentativas para completar o "enforcamento" (animação).

A solução que apresentei foi um exercício e agora prova-se ineficiente.

Grato pela atenção, a propósito a versão final do instrutor se interessar:

import random


def jogar():
    imprime_mensagem_abertura()
    palavra_secreta = carrega_palavra_secreta()

    letras_acertadas = inicializa_letras_acertadas(palavra_secreta)
    print(letras_acertadas)

    enforcou = False
    acertou = False
    erros = 0

    while(not enforcou and not acertou):

        pede_chute()

        if(chute in palavra_secreta):
           marca_chute_correto(chute, letras_acertadas, palavra_secreta)
        else:
            erros += 1
            desenha_forca(erros)

        enforcou = erros == 7
        acertou = "_" not in letras_acertadas
        print(letras_acertadas)

    if(acertou):
        imprime_mensagem_vencedor()
    else:
        imprime_mensagem_perdedor(palavra_secreta)



def desenha_forca(erros):
    print("  _______     ")
    print(" |/      |    ")

    if(erros == 1):
        print(" |      (_)   ")
        print(" |            ")
        print(" |            ")
        print(" |            ")

    if(erros == 2):
        print(" |      (_)   ")
        print(" |      \     ")
        print(" |            ")
        print(" |            ")

    if(erros == 3):
        print(" |      (_)   ")
        print(" |      \|    ")
        print(" |            ")
        print(" |            ")

    if(erros == 4):
        print(" |      (_)   ")
        print(" |      \|/   ")
        print(" |            ")
        print(" |            ")

    if(erros == 5):
        print(" |      (_)   ")
        print(" |      \|/   ")
        print(" |       |    ")
        print(" |            ")

    if(erros == 6):
        print(" |      (_)   ")
        print(" |      \|/   ")
        print(" |       |    ")
        print(" |      /     ")

    if (erros == 7):
        print(" |      (_)   ")
        print(" |      \|/   ")
        print(" |       |    ")
        print(" |      / \   ")

    print(" |            ")
    print("_|___         ")
    print()

def imprime_mensagem_vencedor():
    print("Parabéns, você ganhou!")
    print("       ___________      ")
    print("      '._==_==_=_.'     ")
    print("      .-\\:      /-.    ")
    print("     | (|:.     |) |    ")
    print("      '-|:.     |-'     ")
    print("        \\::.    /      ")
    print("         '::. .'        ")
    print("           ) (          ")
    print("         _.' '._        ")
    print("        '-------'       ")

def imprime_mensagem_perdedor(palavra_secreta):
    print("Puxa, você foi enforcado!")
    print("A palavra era {}".format(palavra_secreta))
    print("    _______________         ")
    print("   /               \       ")
    print("  /                 \      ")
    print("//                   \/\  ")
    print("\|   XXXX     XXXX   | /   ")
    print(" |   XXXX     XXXX   |/     ")
    print(" |   XXX       XXX   |      ")
    print(" |                   |      ")
    print(" \__      XXX      __/     ")
    print("   |\     XXX     /|       ")
    print("   | |           | |        ")
    print("   | I I I I I I I |        ")
    print("   |  I I I I I I  |        ")
    print("   \_             _/       ")
    print("     \_         _/         ")
    print("       \_______/           ")

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

def pede_chute():
    chute = input("Qual letra? ")
    chute = chute.strip().upper()
    return chute

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

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

def carrega_palavra_secreta():
    arquivo = open("palavras.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


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