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

Positional arguments

Fala povo!

Lá eu novamente e sempre com mais dúvidas.

No meu código aqui deu um erro q não faço a menor ideia do que se trata e transcrevo abaixo:

TypeError: inicializa_letras_acertadas() takes 0 positional arguments but 1 was given

O trecho do código que está dando erro é esse:

def jogar():

imprime_mensagem_abertura()
palavra_secreta=carrega_palavra_secreta()    
letras_acertadas=inicializa_letras_acertadas(palavra_secreta) #O problema é nessa linha
print(letras_acertadas)

O print do erro:

Insira aqui a descrição dessa imagem para ajudar na acessibilidadeSe for o caso, eu coloco o código inteiro aqui.

Agradeço imensamente quem puder ajudar

Abraços

7 respostas

Oi Nicholas,

Pela mensagem de erro, acredito que a sua função

def inicializa_letras_acertadas():
    # código da função

não está esperando nenhum parâmetro, ou seja, não há nenhuma variável dentro dos parênteses. Porém , quando você chamou essa função

letras_acertadas=inicializa_letras_acertadas(palavra_secreta) #O problema é nessa linha

a variável 'palavra_secreta' foi colocada como parâmetro e por isso está gerando o erro.

Se não for esse o problema, coloca o teu código aqui para vermos

Oi Cristiane!

Muitíssimo agradecido pela sua resposta.

De fato o erro foi onde você apontou. Deu certo, mas agora surgiu outro problema: o jogo inicia, existe uma palavra secreta, mas não importa quais letras eu tente no chute, não aparece nenhuma e depois dá a mensagem de fim de jogo. Mas não diz se acertei/troféu ou enforquei/caveira.

Posto aqui o código inteiro tal como eu digitei para não ter dúvidas:

imprime_mensagem_abertura()
palavra_secreta=carrega_palavra_secreta()    
letras_acertadas=inicializa_letras_acertadas
print(letras_acertadas)

letras_acertadas=["_" for letra in palavra_secreta]

enforcou = False
acertou = False
erros=0
print(letras_acertadas)


while(not enforcou and not acertou):
    chute = pede_chute()

    if(chute in palavra_secreta):
        marca_chute_correto
    else:        
        erros=erros+1

    enforcou=erros==7
    acertou="_" not in letras_acertadas

    print(letras_acertadas)
    print ("Continue jogando...")

if (acertou):
    mensagem_vitoria()
else:
    mensagem_derrota


print ("Fim de jogo")

def mensagem_vitoria(): print ("Parabéns, você acertou a palavra secreta!") def mensagem_derrota(): print("Você perdeu e foi pra forca!")

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

def imprime_mensagem_abertura():

print ("**********************************")
print ("Bem-vindo ao jogo de 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(): lista=["" for letra in palavrasecreta] return lista

def marca_chute_correto(): index=0 for letra in palavra_secreta: if (chute==letra): letras_acertadas[index] = letra print("Encontrei a letra {} na posição {}". format(letra,index)) index= index+1

def mensagem_perdedora(): print("Puxa, você foi enforcado!") print("A palavra era {}".format(palavra_secreta)) print(" ___ ") print(" / \ ") print(" / \ ") print("// /\ ") print("| XXXX XXXX | / ") print(" | XXXX XXXX |/ ") print(" | XXX XXX | ") print(" | | ") print(" __ XXX / ") print(" |\ XXX /| ") print(" | | | | ") print(" | I I I I I I I | ") print(" | I I I I I I | ") print(" _ / ") print(" \ / ") print(" ____/ ")

def imprime_mensagem_vencedor(): print("Parabéns, você ganhou!") print(" ___ ") print(" '.=====_.' ") print(" .-\: /-. ") print(" | (|:. |) | ") print(" '-|:. |-' ") print(" \::. / ") print(" '::. .' ") print(" ) ( ") print(" _.' '. ") print(" '-------' ")

def desenha_forca(erros): print(" ___ ") print(" |/ | ")

if(erros == 1):
    print(" |      (_)   ")
    print(" |            ")
    print(" |            ")
    print(" |            ")

if(erros == 2):
    print(" |      (_)   ")
    print(" |      \     ")
    print(" |            ")
    print(" |            ")

if(erros == 3):
    print(" |      (_)   ")
    print(" |      \|    ")
    print(" |            ")
    print(" |            ")

if(erros == 4):
    print(" |      (_)   ")
    print(" |      \|/   ")
    print(" |            ")
    print(" |            ")

if(erros == 5):
    print(" |      (_)   ")
    print(" |      \|/   ")
    print(" |       |    ")
    print(" |            ")

if(erros == 6):
    print(" |      (_)   ")
    print(" |      \|/   ")
    print(" |       |    ")
    print(" |      /     ")

if (erros == 7):
    print(" |      (_)   ")
    print(" |      \|/   ")
    print(" |       |    ")
    print(" |      / \   ")

print(" |            ")
print("_|___         ")
print()

if (name == "main"): jogar()

Oi Nicholas!

Agora o problema está na função "marca_chute_correto", neste trecho aqui:

if(chute in palavra_secreta):
        marca_chute_correto
        # resto do seu código

Quando você quer que uma função seja executada, ao chamá-la você deve adicionar os parênteses "()" depois de seu nome:

if(chute in palavra_secreta):
        marca_chute_correto()
        # resto do seu código

Porém isso não resolve todo o problema. A função "marca_chute_correto()" tem como objetivo verificar se o "chute" está dentro da "palavra_secreta". Sendo assim, a função deve se preparar para receber as variáveis que possuem os dados que precisam ser processados. Além disso, as variáveis com os dados devem ser informadas quando a função é chamada, isso deve acontecer dentro dos parênteses.

Com base no código que você forneceu, poderíamos estar corrigindo o problema da seguinte forma:

  • Preparando a função para que ela receba as variáveis:
    def marca_chute_correto(palavra_secreta, chute, letras_acertadas): 
      index=0 
      for letra in palavra_secreta: 
          if (chute==letra): 
              letras_acertadas[index] = letra 
              print("Encontrei a letra {} na posição {}". format(letra,index)) 
          index= index+1
  • Informando as variáveis quando a função é camada:

    if(chute in palavra_secreta):
          marca_chute_correto(palavra_secreta, chute, letras_acertadas)
    
          # resto do seu código

Espero que isso lhe ajude a prosseguir com o desenvolvimento do seu jogo! Bons estudos!

Oi Cristiane!

Grato pela sua resposta minuciosa e criteriosa.

Consegui e fiz as mudanças apontadas por você. E dessa vez resolveu meu problema anterior, mas apareceu outro agora que coloco no print abaixo:

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

Há um tipo de erro que sobrepõe a própria letra que teoricamente já acertei e pior: nesse print há duas letras "A" consecutivas.

Repostarei o código no próximo post para uma melhor análise, mas percebo que quando cheogu ao nível do comendo "def" e definir funções, já bagunçou tudo meu pensamento.

O código reescrito e agradeço as valiosas ajudas

import random

def jogar():

imprime_mensagem_abertura()
palavra_secreta=carrega_palavra_secreta()    
letras_acertadas=inicializa_letras_acertadas
print(letras_acertadas)

letras_acertadas=["_" for letra in palavra_secreta]

enforcou = False
acertou = False
erros=0
print(letras_acertadas)


while(not enforcou and not acertou):
    chute = pede_chute()

    if(chute in palavra_secreta):
        marca_chute_correto(palavra_secreta,chute,letras_acertadas)
    else:        
        erros=erros+1

    enforcou=erros==7
    acertou="_" not in letras_acertadas

    print(letras_acertadas)
    print ("Continue jogando...")

if (acertou):
    mensagem_vitoria()
else:
    mensagem_derrota


print ("Fim de jogo")

def mensagem_vitoria(): print ("Parabéns, você acertou a palavra secreta!") def mensagem_derrota(): print("Você perdeu e foi pra forca!")

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

def imprime_mensagem_abertura():

print ("**********************************")
print ("Bem-vindo ao jogo de 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(): lista=["" for letra in palavrasecreta] return lista

def marca_chute_correto(palavra_secreta, chute, letras_acertadas): index=0 for letra in palavra_secreta: if (chute==letra): letras_acertadas[index] = letra print("Encontrei a letra {} na posição {}". format(letra,index)) index= index+1

def mensagem_perdedora(): print("Puxa, você foi enforcado!") print("A palavra era {}".format(palavra_secreta)) print(" ___ ") print(" / \ ") print(" / \ ") print("// /\ ") print("| XXXX XXXX | / ") print(" | XXXX XXXX |/ ") print(" | XXX XXX | ") print(" | | ") print(" __ XXX / ") print(" |\ XXX /| ") print(" | | | | ") print(" | I I I I I I I | ") print(" | I I I I I I | ") print(" _ / ") print(" \ / ") print(" ____/ ")

def imprime_mensagem_vencedor(): print("Parabéns, você ganhou!") print(" ___ ") print(" '.=====_.' ") print(" .-\: /-. ") print(" | (|:. |) | ") print(" '-|:. |-' ") print(" \::. / ") print(" '::. .' ") print(" ) ( ") print(" _.' '. ") print(" '-------' ")

def desenha_forca(erros): print(" ___ ") print(" |/ | ")

if(erros == 1):
    print(" |      (_)   ")
    print(" |            ")
    print(" |            ")
    print(" |            ")

if(erros == 2):
    print(" |      (_)   ")
    print(" |      \     ")
    print(" |            ")
    print(" |            ")

if(erros == 3):
    print(" |      (_)   ")
    print(" |      \|    ")
    print(" |            ")
    print(" |            ")

if(erros == 4):
    print(" |      (_)   ")
    print(" |      \|/   ")
    print(" |            ")
    print(" |            ")

if(erros == 5):
    print(" |      (_)   ")
    print(" |      \|/   ")
    print(" |       |    ")
    print(" |            ")

if(erros == 6):
    print(" |      (_)   ")
    print(" |      \|/   ")
    print(" |       |    ")
    print(" |      /     ")

if (erros == 7):
    print(" |      (_)   ")
    print(" |      \|/   ")
    print(" |       |    ")
    print(" |      / \   ")

print(" |            ")
print("_|___         ")
print()

if (name == "main"): jogar()

solução!

Vamos lá Nicholas!

Que bom que aquela outra parte funcionou!

Mas veja, é bem importante ir isolando o local no código que está tendo o problema. E pelo resultado que você mostrou, se as variáveis palavra_secreta, chute e letras_acertadas estão com os valores corretos, ou seja, se os valores de entrada estão conforme o esperado, o problema está na saída, da função marca_chute_correto, ou, mais precisamente, o problema está no processamento dos dados que faz com que aquilo que retorna da função não é o que você espera.

Na função que você construiu, o seu objetivo é descobrir se a letra que está na variável chute está dentro da palavra_secreta. Se a letra está nessa palavra, é preciso colocar essa letra na posição correspondente.

O quem indica a posição da letra na palavra, é a variável index. É importante que a variável index seja incrementada em todas as interações do for.

No código que você colocou aqui, não está aparecendo formatado essa parte da função, sendo assim, não consigo ver como está a indentação do seu código. Lembra que no Python a indentação é extremante importante. tenta verificar se o incremento da variável index ("index= index+1") está acontecendo no local correto, ou seja, dentro do for, mas fora do if.

Acho que isso vai resolver esse problema específico.

Oi Cirsitane

Muito obrigado pela paciência e dedicação ao me isntruir. Não sei porque, mas pra mim comandos um uma iteração só já bastam (como é o caso do index).

Vou acertar e, depois disso, reescreverei o código para poder assimilar melhor até mesmo as correções

Atenciosamente