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

Duvida sobre funcoes, metodo e argumentos

    palavra_secreta = carrega_palavra_secreta()
    letras_acertadas = inicializa_letras_acertadas(palavra_secreta)

Como fazer para saber quando ou nao chamar a funcao dessa forma sem quebrar o codigo? como sei que a variavel está fora?

6 respostas

from random import randint

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

    enforcou = False
    acertou = False
    erros = 0

    # Enquanto True e True
    while not enforcou and not acertou:

        chute = pede_chute()

        if chute in palavra_secreta:
            marca_chute_correto(chute, letras_acertadas,palavra_secreta)
        else:
            erros = erros + 1
        enforcou = erros == 6
        acertou = "_" not in letras_acertadas
        print(letras_acertadas)

    if acertou:
        imprime_mensagem_vencedor()
    else:
        imprime_mensagem_perdedor()


# Funções


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


def carrega_palavra_secreta():
    x = open("forca.txt", "r")
    lista = (x.readlines())
    escolhe_r = randint(1, len(lista))
    x.close()
    palavra_secreta = lista[escolhe_r].upper().strip()
    return palavra_secreta


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

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

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

def imprime_mensagem_vencedor():
    print("Você ganhou!")

def imprime_mensagem_perdedor():
    print("Você perdeu!")

if __name__ == "__main__":
    jogar_forca()

`

Qual o erro? Meu codigo aparentemente nao esta funcionando a parte do chute, ele so pede qual a letra infinitamente, alguem poderia me ajudar onde errei ?

Acho que o problema está que no seu código a função pede_chute() está chamando outra função pede_chute() dentro dela mesmo, gerando um loop infinito de "pedir chute". Tente alterar ela para isso aqui, removendo o "chute = pede_chute()" depois do input:

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

Não testei aqui, mas acho que é isso. Espero ter ajudado.

Oi agora quebrou acho que na funcao da palavra secreta pelo erro que deu.. olha:


from random import randint

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

    enforcou = False
    acertou = False
    erros = 0

    # Enquanto True e True
    while not enforcou and not acertou:

        chute = pede_chute()

        if chute in palavra_secreta:
            marca_chute_correto(chute, letras_acertadas,palavra_secreta)
        else:
            erros = erros + 1
        enforcou = erros == 6
        acertou = "_" not in letras_acertadas
        print(letras_acertadas)

    if acertou:
        imprime_mensagem_vencedor()
    else:
        imprime_mensagem_perdedor()


# Funções


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


def carrega_palavra_secreta():
    x = open("forca.txt", "r")
    lista = (x.readlines())
    escolhe_r = randint(1, len(lista))
    x.close()
    palavra_secreta = lista[escolhe_r].upper().strip()
    return palavra_secreta


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

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

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

def imprime_mensagem_vencedor():
    print("Você ganhou!")

def imprime_mensagem_perdedor():
    print("Você perdeu!")

if __name__ == "__main__":
    jogar_forca()

Aguardo seu retorno, obrigado.

segue erro quando eu digito qualquer letra:


Traceback (most recent call last):
  File "/Users/gfmolon/estudos/Python3_Introducao_Parte1/jogos/forca.py", line 72, in <module>
    jogar_forca()
  File "/Users/gfmolon/estudos/Python3_Introducao_Parte1/jogos/forca.py", line 15, in jogar_forca
    chute = pede_chute()
  File "/Users/gfmolon/estudos/Python3_Introducao_Parte1/jogos/forca.py", line 55, in pede_chute
    chute = chute.strip().upper()
UnboundLocalError: local variable 'chute' referenced before assignment
solução!

Olá Guilherme,

Depois do que o Abner falou, falta só você salvar o valor de input("Qual letra?") em chute:

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

O erro atual acontece porque você chama chute.strip().upper() mas chute ainda não tinha sido criado.

Espero ter ajudado, qualquer coisa é só falar!

Deu certo!!! Obrigado, ainda to cru nessa parte de funções es, mas aos poucos vamos pegando, obrigado!

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