3
respostas

Jogo da Forca: não retorna todas as frutas em palavras.txt

Nesta altura do jogo, o código deveria retornar todas as frutas, mas só está retornando "banana".

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

def jogar():
    print('*********************************')
    print('Bem vindo ao jogo de Forca!')
    print('*********************************')


    arquivo = open("palavras.txt", "r")
    palavras = []

    for linha in arquivo:
        linha = linha.strip()
        palavras.append(linha)

        arquivo.close()

        print(palavras)

    palavra_secreta = "maça".upper()
    letras_acertadas = ["_" for letra in palavra_secreta]

    enforcou = False
    acertou = False
    erros = 0

    print(letras_acertadas)

    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

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


    if(acertou):
        print("Você ganhou!!")
    else:
        print("Você perdeu!!")


    print("Fim do jogo")


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

![] )

3 respostas

Carlos, segue o código corrigido:

import random
def jogar():
    print('*********************************')
    print('Bem vindo ao jogo de Forca!')
    print('*********************************')


    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()
    letras_acertadas = ["_" for letra in palavra_secreta]

    enforcou = False
    acertou = False
    erros = 0

    print(letras_acertadas)

    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

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


    if(acertou):
        print("Você ganhou!!")
    else:
        print("Você perdeu!!")


    print("Fim do jogo")


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

Oioiii Carlos, tudo bem com você?

Quando trabalhamos com arquivos, precisamos abrir e fechar o arquivo que estamos utilizando. O que está acontecendo é que a função arquivo.close() que você está utilizando, foi colocada dentro da estrutura de repetição for, e no momento que o primeiro ciclo do laço é executado, o arquivo já é fechado, fazendo com que o código só consiga verificar a primeira linha do arquivo.

Dessa forma, podemos retirar uma indentação dessa função, assim como a função de print(palavras) que se encontra logo após ela, ficando dessa maneira:

arquivo = open("palavras.txt", "r")
palavras = []

for linha in arquivo:
    linha = linha.strip()
    palavras.append(linha)

arquivo.close()

print(palavras)

Resultado:

*********************************
Bem vindo ao jogo de Forca!
*********************************
['banana', 'melancia', 'morango', 'maca']
['_', '_', '_', '_']
Qual letra?

Dessa maneira, o arquivo fecha apenas quando o laço de repetição for encerra, e ele consegue ler as linhas do seu arquivo direitinho :)

Caso queira se aprofundar sobre arquivos em python, recomendo a leitura dos artigos Trabalhando com arquivos e diretórios no python e Lendo e escrevendo arquivos com o redirecionamento no Shell, e se você tiver interesse de conhecer ainda mais sobre a Linguagem Python, recomendo a formação Python e orientação a objetos na alura!

Em caso de dúvidas, me coloco à disposição.

Grande abraço e bons estudos!

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

Muito bom Laís, obrigado.