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

[Dúvida] Tentei Incrementar o código

Além das funções postas nas vídeo-aulas eu queria que, caso o chute fosse repetido, aparecesse uma mensagem dizendo "chute repetido, tente de novo" e não somasse o erro.

import random

def exibe_titulo():
    print("*********************************")
    print("Bem vindo ao jogo de Forca!")
    print("*********************************")

def carrega_palavra_secreta():
    arquivo = open('palavras.txt', 'r', encoding='utf-8')
    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(palavra):
    return ['_' for letra in palavra]

def input_chute():
    chute = input('Qual Letra: ')
    chute = chute.strip().upper()
    return chute

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

def jogar():
    
    exibe_titulo()

    carrega_palavra_secreta()

    palavra_secreta = carrega_palavra_secreta()

    letras_acertadas = inicializa_letras_acertadas(palavra_secreta)
        
    enforcou = False
    acertou = False
    erros = 0
    letra_errada = []
    todas_letras = []
    print('Você será enforcado quando tiver 6 erros')
    print(letras_acertadas)
    #print(todas_letras)    

    while(not enforcou and not acertou):
            
        chute = input_chute() 
        
        if chute in palavra_secreta:    
            marca_chute_correto(chute, letras_acertadas, palavra_secreta, todas_letras)
        elif chute in todas_letras:
            print('Palpite repetido, tente de novo')
        else:
            erros += 1
            letra_errada.append(chute)
            todas_letras.append(letra_errada)
            print(f'Você errou {erros} vezes\n')
            print(f'Letras erradas: {letra_errada}')

                 
        enforcou = erros == 6
        acertou = '_' not in letras_acertadas
        print(letras_acertadas)
   
    
    if acertou:
        print("Parabéns, você ganhou!")
    else:
        print('Ótima tentativa, mais sorte da próxima vez')
        print(f'A palavra é {palavra_secreta}')        

    print("Fim de Jogo!")

if(__name__ == "__main__"):
    jogar()

testei a lista que fiz e os valores estão sendo empurrados para ambas as listas (letra_errada e todas_letras), mas a mensagem do elif não funciona Alguém consegue me ajudar?

2 respostas
solução!

Na função marca_chute_correto, você está adicionando cada chute (letra) à lista todas_letras dentro do loop que verifica se a letra está na palavra. Isso pode resultar em várias adições da mesma letra à lista. É melhor adicionar o chute à lista todas_letras fora desse loop.

Ao verificar se um chute já foi dado, você deve comparar o chute com as letras em todas_letras, não com letra_errada.

Quando uma letra errada é adicionada, você está adicionando a lista letra_errada inteira à lista todas_letras, quando deveria adicionar apenas a letra errada.

import random

def exibe_titulo():
    print("*********************************")
    print("Bem vindo ao jogo de Forca!")
    print("*********************************")

def carrega_palavra_secreta():
    arquivo = open('palavras.txt', 'r', encoding='utf-8')
    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(palavra):
    return ['_' for letra in palavra]

def input_chute():
    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 == letra):
            letras_acertadas[index] = letra
        index += 1

def jogar():
    
    exibe_titulo()

    palavra_secreta = carrega_palavra_secreta()

    letras_acertadas = inicializa_letras_acertadas(palavra_secreta)

    enforcou = False
    acertou = False
    erros = 0
    letra_errada = []
    todas_letras = []
    print('Você será enforcado quando tiver 6 erros')
    print(letras_acertadas)

    while(not enforcou and not acertou):

        chute = input_chute()

        if chute in todas_letras:
            print('Palpite repetido, tente de novo')
            continue

        todas_letras.append(chute)

        if chute in palavra_secreta:
            marca_chute_correto(chute, letras_acertadas, palavra_secreta)
        else:
            erros += 1
            letra_errada.append(chute)
            print(f'Você errou {erros} vezes\n')
            print(f'Letras erradas: {letra_errada}')

        enforcou = erros == 6
        acertou = '_' not in letras_acertadas
        print(letras_acertadas)

    if acertou:
        print("Parabéns, você ganhou!")
    else:
        print('Ótima tentativa, mais sorte da próxima vez')
        print(f'A palavra era {palavra_secreta}')

    print("Fim de Jogo!")

if __name__ == "__main__":
    jogar()

Marquei como solucionado, mas não reparei que o contador de erro continuava acrescendo :/

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