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

Problemas com criação de funções

Estou na parte de criação de funções para melhorar a visibilidade do código, porém não consigo utilizar o método.

import random

titulo_forca()

while (True):
    add = str(input('Deseja adicionar novas palavras ao jogo? (Y/N) ')).upper().strip()
    if (add == 'Y'):
        arquivo = open('palavras.txt', 'a')
        palavra_nova = (str(input('Digite uma palavra: '))) + '\n'
        arquivo.write(palavra_nova)
    else:
        print('Tchau...')
        break
    arquivo.close()

arquivo = open('palavras.txt', 'r')
lista_palavras = []
for linha in (arquivo):
    lista_palavras.append(linha)
arquivo.close()

index = random.randrange(0,len(lista_palavras))
palavra_secreta = lista_palavras[index].upper().strip()
palavra_forca = ['_'] * len(palavra_secreta) #palavra_forca = ['_' for letra in palavra_secreta]
tentativa = 0

print(palavra_forca)

while(True):
    chute = str(input('Digite uma letra: ')).upper().strip()
    if(chute in palavra_secreta):
        i = 0
        for letra in (palavra_secreta):
            if(letra == chute):
                palavra_forca[i] = letra
            i += 1
        print(palavra_forca)
    else:
        tentativa += 1
        print('Não existe a letra "{}" na palavra, você ainda tem {} tentativas.'.format(chute,(len(palavra_secreta) - tentativa)))

    if('_' not in palavra_forca):
        break
    elif(tentativa == len(palavra_secreta)):
        break

if('_' not in palavra_forca):
    print('Você ganhou!!')
else:
    print('Game Over!')

def titulo_forca():
    print('*' * 19)
    print('** JOGO DA FORCA **')
    print('*' * 19)

dando o seguinte erro: NameError: name 'titulo_forca' is not defined

3 respostas

O erro está acontecendo pq a definição da função está escrita depois da execução dela.

A def titulo_forca(): está la embaixo do código enquanto a execução está na primeira linha. Por isso o erro.

Só funcionaria se a função titulo_forca fosse executada dentro de outra função lá em cima, aí essa inversão não teria problemas, pois os níveis de execução seriam diferentes.

solução!

Por exemplo, se essa parte do código fizer parte de uma função chamada jogar:

def jogar(): #não esqueça de dar tab em todas as linhas para ela se adequar a função

while (True):
    add = str(input('Deseja adicionar novas palavras ao jogo? (Y/N) ')).upper().strip()
    if (add == 'Y'):
        arquivo = open('palavras.txt', 'a')
        palavra_nova = (str(input('Digite uma palavra: '))) + '\n'
        arquivo.write(palavra_nova)
    else:
        print('Tchau...')
        break
    arquivo.close()

arquivo = open('palavras.txt', 'r')
lista_palavras = []
for linha in (arquivo):
    lista_palavras.append(linha)
arquivo.close()

index = random.randrange(0,len(lista_palavras))
palavra_secreta = lista_palavras[index].upper().strip()
palavra_forca = ['_'] * len(palavra_secreta) #palavra_forca = ['_' for letra in palavra_secreta]
tentativa = 0

print(palavra_forca)

while(True):
    chute = str(input('Digite uma letra: ')).upper().strip()
    if(chute in palavra_secreta):
        i = 0
        for letra in (palavra_secreta):
            if(letra == chute):
                palavra_forca[i] = letra
            i += 1
        print(palavra_forca)
    else:
        tentativa += 1
        print('Não existe a letra "{}" na palavra, você ainda tem {} tentativas.'.format(chute,(len(palavra_secreta) - tentativa)))

    if('_' not in palavra_forca):
        break
    elif(tentativa == len(palavra_secreta)):
        break

if('_' not in palavra_forca):
    print('Você ganhou!!')
else:
    print('Game Over!')

E você antes do while, pedir para ela executar a titulo_forca(), aí vai dar certinho. Você pode deixar a def titulo_forca lá embaixo sem mexer nela. Testa lá, espero que tenha ajudado!

Entendi!

Muito obrigado, não havia notado essa lógica por detrás das funções!