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

As funções def não funciona

Ja tentei inverter as variaveis antes e depois das funções e sempre dar erros. Não consegui entender esta logica de separar as responsabilidade por funções. Deu um nó aqui no cérebro! O que pertence a função def jogar():

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

def jogar():
    palavra_secreta = carrega_palavra_secreta()
    letras_acertadas = inicializa_letras_acertadas(palavra_secreta)

def carrega_palavra_secreta():
            arquivo = open("palavras.txt","r")
            palavras = []
            for linha in arquivo:
                linha = linha.strip()
                palavras.append(linha)
                numero = random.randrange(0, len(palavras))
                palavra_secreta = palavras[numero].upper()

                return palavra_secreta

def inicializa_letras_acertadas(palavra_secreta):
            return ["_" 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("Parabéns! Você acertou! A palavra secreta era {}".format(palavra_secreta))

            else:
                print("Você foi enforcado!")

            print("Fim do jogo")

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

Oi Leandro :)

Você poderia reassistir as aulas de funções caso não tenha ficado muito claro.

A questão das funções é que elas são ótimos recursos para organizar e reutilizar código. Quando você percebe que tem linhas de códigos repetidos/que tem a mesma função, uma função é perfeita para isso. Também é ótima para organizar código, quando está tudo muito embaralhado e você não consegue dizer de primeira o que está acontecendo no código, você faz funções com nomes explicativos para ficar mais claro, esse tipo de coisa.

Separar responsabilidade por função significa que é um bom hábito fazer funções que executam apenas uma tarefa. Não é obrigatório. Cada um define funções da forma que preferir, porém definir funções com mais de uma responsabilidade, ou seja, executa mais de uma tarefa ao mesmo tempo, meio que foge da noção de usar funções para organizar o código.

Já sobre seu código, acho que você embaralhou as coisas. A função inicializa_letras_acertadas está englobando todas as linhas do código do jogo, quando isso deveria ser jogar(). Exemplo:

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

def jogar():
            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("Parabéns! Você acertou! A palavra secreta era {}".format(palavra_secreta))

            else:
                print("Você foi enforcado!")

            print("Fim do jogo")

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

Lá em cima no seu código onde tem def imprima_mensagem_abertura(): você está definindo a função que imprime abertura e a chamando na mesma função. Isso não vai funcionar, porque o def apenas define a função, ele não a executa. Para que essa função execute alguma coisa, você tem que colocar ela em QUALQUER LUGAR, menos dentro dela mesma. Nesse caso, seria conveniente chamá-la dentro da função jogar() (corrigida, de preferência)

Desculpe pelo texto enorme. Espero ter ajudado pelo menos um pouco e desculpe mais uma vez se não tiver resolvido todos os erros.

solução!
A minha dúvida principal é o que ia ou não dentro da função def jogar().
Separei todas as funções da def jogar() e somente coloquei as variaveis e o restante do código do jogo.
Obrigado pela ideia.

import random
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


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

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

    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("Parabéns! Você acertou! A palavra secreta era {}".format(palavra_secreta))

    else:
        print("Você foi enforcado!")

    print("Fim do jogo")

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