Eu aperfeiçoei o jogo da forca e está dando erro None

Eu aperfeiçoei o jogo da forca colocando algumas opções a mais só que ao fazer isso apareceu 2 problemas todos relacionados ao jogo em si: 1 - Fica aparecendo None no console, 2 - Quando acerto a frase a frase da erro nas linhas 381, 216

Alguém poderia me ajudar?

  import random


        def jogo_forca():
            # função com mensagem de abertura
            abertura()
            opcao = int(input(print("(1) Jogar (2) Palavras Existentes (3) Adicionar Palavras")))

        if (opcao == 1):

            palavra_secreta = carrega_palavra_secreta()

            # mostrando a palavra na forma de de "_ _ _ _ _"
            letras_acertadas = inicializa_letras_acertadas(palavra_secreta)
            print(letras_acertadas)

            enforcou = False
            acertou = False
            erros = 0

            # enquanto não for (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 += 1
                    desenha_forca(erros)

                enforcou = erros == 7
                # quando não tiver "_" dentro de letras_acertadas ele acertou
                acertou = "_" not in letras_acertadas
                print(letras_acertadas)

            if (acertou):
                ganhou(palavra_secreta)
            else:
                perdeu(palavra_secreta)

        elif (opcao == 2):
            palavras_existentes()
        elif (opcao == 3):
            adicionando_palavras()
        else:
            print("Opção inválida")


    def adicionando_palavras():
        print("Cadastre a palavra nova")
        # salva a palavra em letras minúscula
        palavra = input("Palavra: ").lower()

        # insere dados sem substituir os já existentes
        arquivo = open("palavras.txt", "a", encoding="utf8")
        # quebra de linha para o próximo dado
        arquivo.write("\n")
        # escreve no arquivo
        arquivo.write(palavra)

        arquivo.close()



    def palavras_existentes():
        arquivo = open("palavras.txt", "r", encoding="utf8")
        palavras = []

        for linha in arquivo:
            linha = linha.strip()
            palavras.append(linha)
        arquivo.close()

        for linha in palavras:
            print(linha)


    def marca_chute_correto(chute, letras_acertadas, palavra_secreta):
        # index vai receber as letras acertadas
        index = 0
        for letra in palavra_secreta:
            if (chute == letra):
                # cada letra irá assume uma posição no index
                letras_acertadas[index] = letra
            index += 1


    def pede_chute():
        chute = input("Qual letra? ")
        # tira os espaços do chute e deixando tudo maiúsculo
        chute = chute.strip().upper()
        return chute

O código que você colocou tem menos de 100 linhas, então como saberemos quais as linhas 381 e 216? :man_shrugging:

De qualquer forma, fica aparecendo None por causa do print dentro do input.

O print imprime a mensagem na tela, e seu retorno é None. Então ao fazer input(print('etc')), você está passando o retorno de print (ou seja, o None) para input, e ele imprime o None na tela.

Para evitar isso, passe somente a mensagem para o input, assim:

opcao = int(input("(1) Jogar (2) Palavras Existentes (3) Adicionar Palavras"))

O próprio input se encarrega de imprimir a mensagem, não precisa de um print dentro dele.


Outra melhoria é usar with para abrir os arquivos, pois isso garante que ele é fechado ao final (mesmo se der erro), assim não precisa chamar close() explicitamente:

def adicionando_palavras():
    palavra = input("Cadastre a palavra nova\nPalavra: ").lower()
    with open("palavras.txt", "a", encoding="utf8") as arquivo:
        arquivo.write(f"\n{palavra}")

def palavras_existentes():
    with open("palavras.txt", "r", encoding="utf8") as arquivo:
        for linha in arquivo:
            print(linha, end='')

E repare que para escrever, usei f-string (disponível a partir do Python 3.6).

E para ler as linhas do arquivo eu posso imprimir diretamente no for que itera por ele: não precisa criar uma lista com as linhas para depois imprimi-las - além de redundante, pois você percorre todas as linhas 2 vezes, ainda gasta mais memória, pois precisa guardar todas as linhas em uma lista (iterando diretamente pelo arquivo, você percorre uma linha por vez, gastando menos memória). E repare que no print eu usei o parâmetro end, passando uma string vazia, para que o print não imprima a quebra de linha ao final (assim eu não preciso usar strip() nas linhas).

1 curtida