5
respostas

Forca - Modulo jogar() e NameError: name 'imprime_mensagem_abertura' is not defined

import random

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

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

...
def imprime_mensagem_abertura():
    print('**********************************')
    print('***Bem vindo no jogo de Forca*****')
    print('**********************************')

**Detalhes dos meus instrumentos: pynthon 3.9.5, Pycharm 2021.1.1 (Community edition) e MacBook Pro 2015, Catalina default shel Zsh

Pfv onde esta o problema? Programa nao executa - pois recebo as seguintes mensagens de erro apesar de ter copiado o código completo: **

Traceback (most recent call last): File "/Users/aldirmedeirosfilho/PycharmProjects/jogos/forca.py", line 46, in jogar() File "/Users/aldirmedeirosfilho/PycharmProjects/jogos/forca.py", line 4, in jogar imprime_mensagem_abertura() NameError: name 'imprime_mensagem_abertura' is not defined

Process finished with exit code 1

5 respostas

Boa noite Aldir, tudo bem?

Creio que o problema seja apenas pois a função imprime_mensagem_abertura está sendo definida após a execução da função jogar. Ou seja, em tempo de execução, ao ser executada a função jogar dentro da condicional if, a função imprime_mensagem_abertura ainda não existe.

Se você alterar a ordem para conforme abaixo não ocorrerá o problema. Porém, já saliento que o mesmo problema pode ocorrer com a função carrega_palavra_secreta

import random

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

def imprime_mensagem_abertura():
    print('**********************************')
    print('***Bem vindo no jogo de Forca*****')
    print('**********************************')

if __name__ == '__main__':
    jogar()

Espero ter colaborado para a resolução da sua dúvida.

Atenciosamente,

Bom dia Breno, obrigado pelo rápido retorno. Testei a tua proposta mas as mensagens de erro foram as mesmas de antes. Dei uma olhada no 'debug' dos erros, mas confesso q não entendi bolufas. Mas enquanto testando sua sugestão me dei conta de algo que talvez possa estar contribuindo para este problema. Os settings do meu computador e todos instrumentos (python3, Pycharm e terminal) estão todos em ingles. Notei varias 'alertas' em relação a palavra "secreta" que querem mudar para 'secret". Vou deixar este problema assim por enquanto, para usar como study-case, e avançar para o proximo curso. Talvez mais tarde aprenda algo q me de uma luz. De toda maneira, mais uma vez obrigado por tua atenção. Um bom fim de semana..

Uma dúvida, como está o código do menu para chamar a função forca.jogar()?

Boa tarde Cauhe, nao tenho certeza si entendi bem tua questão. Tentei tua sugestão de tentar "forca.jogar()" mas não deu certo. Mas aqui vai a linhas de código em torno do "jogar()" assim como as mensagens de erro. Obrigado

import random


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

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

___

/Users/aldirmedeirosfilho/PycharmProjects/jogos/venv/bin/python /Users/aldirmedeirosfilho/PycharmProjects/jogos/forca.py
Traceback (most recent call last):
  File "/Users/aldirmedeirosfilho/PycharmProjects/jogos/forca.py", line 45, in <module>
    jogar()
  File "/Users/aldirmedeirosfilho/PycharmProjects/jogos/forca.py", line 5, in jogar
    palavra_secreta = carrega_palavra_secreta()
NameError: name 'carrega_palavra_secreta' is not defined

Process finished with exit code 1


Igual a isso:

import adivinhacao_for
import adivinhacao_while
import forca
from time import sleep

while(True):
    escolha = int(input('Menu de JOGOS:'
                        '\n[1] Adivinhação com For.'
                        '\n[2] Adivinhação com While.'
                        '\n[3] Forca.'
                        '\nEscolha ===> '))

    if(escolha == 1):
        print('Carregando . . . . ')
        sleep(2)
        adivinhacao_for.play()
    elif(escolha == 2):
        print('Carregando . . . . ')
        sleep(2)
        adivinhacao_while.play()
    elif(escolha == 3):
        print('Carregando . . . . ')
        sleep(2)
        forca.play()
    elif (escolha != 1 and escolha != 2 and escolha != 3):
        print('Opção inválida')
        continue

Só que no meu caso eu chamo o play():

from random import randint

def play():
    numero_secreto = randint(1, 100)
    pontos = 10.0

    titulo_adv_for()
    tentativas, menospontos = nivel_de_dificuldade()
    chute, pontos = tentativa_e_erro(tentativas, menospontos, numero_secreto, pontos)
    errou_tudo(chute, pontos, numero_secreto)
    game_over(pontos)

def titulo_adv_for():
    print('-' * 38)
    print('-- Bem vindo ao jogo de Adivinhação --')
    print('-' * 38)

def nivel_de_dificuldade():
    nivel = int(input('Escolha o nível de dificuldade:'
                      '\n[1] Fácil'
                      '\n[2] Médio'
                      '\n[3] Difícil'
                      '\n---> '))

    if (nivel == 1):
        tentativas = 15
        menospontos = 1.5
    elif (nivel == 2):
        tentativas = 10
        menospontos = 1.0
    else:
        tentativas = 5
        menospontos = 0.5
    return tentativas, menospontos

def tentativa_e_erro(tentativas, menospontos, numero_secreto, pontos):
    for rodada in range(tentativas):
        chute = int(input(f'Tentativa {rodada + 1} de {tentativas}.'
                          '\nDigite um número entre 1 e 100: '))
        acerto = chute == numero_secreto
        maior = chute > numero_secreto
        menor = chute < numero_secreto

        if (chute < 1 or chute > 100):
            print('Você deve digitar um número entre 1 e 100!'
                  '\nTentativa desperdiçada.')
            continue

        if (acerto):
            print('Parabéns! Você acertou o número!')
            break
        else:
            if (maior):
                print(f'Você errou, o número {chute} é maior que o número secreto.'
                      '\nTente novamente.')
            elif (menor):
                print(f'Você errou, o número {chute} é menor que o número secreto.'
                      '\nTente novamente.')
            pontos -= menospontos
    return chute, pontos

def errou_tudo(chute, pontos, numero_secreto):
    if (chute != numero_secreto or pontos < 0):
        pontos = 0
    return pontos

def game_over(pontos):
    print(f'Você fez {pontos} pontos!'
          '\nGame Over!')

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