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

Dúvidas e mais dúvidas

Pessoas!

Bom dia, tarde ou noite.

Então, escrevi meu código e deixei as minhas dúvidas nas gradinhas(hasthags) e em caixa alta (não tô gritando não, só quis dar destaque das dúvidas em relação ao código do programa)

Quem me ajuda aí? eu agradeço a atenção e que a vida lhe pague em dobro, porque eu to duro rsrsrsrsrsrsrs

Segue o código com as dúvidas:

def jogar():

    print ("**********************************")
    print ("Bem-vindo ao jogo de Forca! ")
    print ("**********************************")

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

    enforcou = False
    acertou = False
    erros=0
    print(letras_acertadas)



    palavras = []
    palavras.append("rodízio")
    palavras.append("comilança")
    palavras.append("picanha")    


    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 #de onde veio esse string "letras_acertadas"? quando foi definido? não pode ser uma função build-in, né?
                    print("Encontrei a letra {} na posição {}". format(letra,index))
                index= index+1
        else:        
            erros=erros+1

        enforcou=erros==6
        acertou="_" not in letras_acertadas #COMO ISSO QUER DIZER QUE O JOGO ACABA? POR QUE NÃO USAR O TERMO "BREAK" COMO NO JOGO ADVINHAÇÃO?


        print(letras_acertadas)
        print ("Continue jogando...")
        if (acertou): #AQUI NÃO ESTÁ EM "False?" E SE SIM, COMO PODE TER ACERTADO, SE ESTÁ EN NEGAÇÃO EM TERMOS BOOLEANOS?
            print("Parabéns! Você descobriu a palavra!")
        else:
            print("PERDEU: VOCÊ FOI ENFORCADO")


    print ("Fim de jogo")

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


#NO MÓDULO 06.ESCRITA E LEITURA, AULA 05, NIKO ESCREVE UMA LINHA DE PROGRAMAÇÃO TAL COMO SEGUE:
#LINHA.STRIP E ENTÃO SÓ APARECE MAÇÃ. NÃO ENTENDI PORQUE NÃO APARECE O RESTO DA LISTA (SIM, SEI QUE FOI PRA LIMPAR AS LINHAS EM BRANCO, MAS NÃO TODAS AS OUTRAS LINHAS)
#A EXECUÇÃO DO PROGRAMA DÁ UM ERRO QUE MOSTRA O AVISO DE QUE O JOGADOR ERROU E FOI ENFORCADO, MAS O JOGO NÃO TERMINA E, ACERTANDO A PALAVRA SECRETA, DIZ QUE GANHOU E DÁ FIM DE JOGO. O QUE HÁ DE ERRADO?
3 respostas
solução!

Olá Nicholas, tudo bem com você?

Na resposta abaixo irei seguir a mesma sequência em que os seus comentários são apresentados no código, deixando partes do comentário como título do tópico.

De onde veio esse string "letras_acertadas"?

A variável letras_acertadas é uma lista que contém os underscore (_) correspondente ao número de letras da palavra secreta, e que durante o jogo ela irá receber as letras que o usuário acerta. Essa lista foi declarada na sétima linha do código: (letras_acertadas = ["_" for letra in palavra_secreta]).

Considerando o seguinte exemplo, temos a palavra secreta "banana" que possui 6 letras, assim a lista letras_acertadas receberá o seguinte conteúdo: ['_', '_', '_', '_', '_', '_'].

Como isso quer dizer que o jogo acaba?

Foi definido que o usuário terá acertado a palavra secreta, quando na lista letras_acertadas não possuir underscore (_). Transformando esse texto em linhas de código temos a declaração abaixo.

acertou = "_" not in letras_acertadas

A variável acertou recebe o valor True quando não (not) for encontrado o underscore (_) na (in) lista letras_acertadas. O resultado dessa validação será utilizado na estrutura condicional if (acertou):.

Aqui não está em "False?"

A estrutura condicional if (acertou): inicialmente recebe o valor False, mudando para True apenas quando o usuário acerta todas as letras.

Nessa linha onde temos a estrutura condicional if (acertou):, temos um erro de indentação (espaços), que está fazendo com que a lógica de funcionamento do código fique errada. Peço que siga os passos abaixo para realizar a correção.

  • Selecione da linha if (acertou): até a linha print("PERDEU: VOCÊ FOI ENFORCADO")
  • Pressione + uma vez

A correção acima é necessária para que essas linhas de código sejam executadas apenas ao final do laço de repetição while. Da forma que estava a mensagem "PERDEU: VOCÊ FOI ENFORCADO" está sendo apresentada a cada interação do usuário. Abaixo o código com a mudança aplicada.

    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
                    print("Encontrei a letra {} na posição {}".format(letra, index))
                index = index + 1
        else:
            erros = erros + 1

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

        print(letras_acertadas)
        print("Continue jogando...")
    if (acertou):
        print("Parabéns! Você descobriu a palavra!")
    else:
        print("PERDEU: VOCÊ FOI ENFORCADO")

    print("Fim de jogo")

linha.strip() e então só aparece maçã. Não entendi porque não aparece o resto da lista

Quando o Nico faz o uso do comando linha.strip() após o for linha in arquivo:, a variável linha permanece com o valor referente a última linha do arquivo, assim, apenas a última linha é apresentada no terminal.

Espero ter ajudado, e que a vida me pague em dia hahahaha

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!

A lógica de verificação de "acerto" está correta, no entanto, a verificação de "enforcamento" não funciona corretamente, pois a mensagem "PERDEU: VOCÊ FOI ENFORCADO" é impressa independentemente do resultado. A correção seria incluir um "if (enforcou):" antes da impressão da mensagem de enforcamento. Além disso, a impressão do "Fim de jogo" deve ser feita após a verificação de enforcamento e acerto, para que seja feita apenas uma vez. Ex:

if (acertou):
    print("Parabéns! Você descobriu a palavra!")
    break
else:
    if(enforcou):
        print("PERDEU: VOCÊ FOI ENFORCADO")
        break

Felippe Rafael.

Grato pela resposta! Muito esclarecedora e bem pontual.

Meus sinceros agradecimentos a você e também ao Adriano Rocha pela atenção dispendida.