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

Meu código não está substituindo a letra, somente a primeira letra da palavra

Olá, Fiz o codigo igual do professor, porém ele só substitui a letra do primeiro "_" mesmo se eu acertar a letra da palavra.

No caso abaixo o exemplo, a palavra é melancia.

=================================
***Bem vindo ao jogo da forca!***
=================================
['_', '_', '_', '_', '_', '_', '_', '_']
Qual letra?M
['M', '_', '_', '_', '_', '_', '_', '_']
Qual letra?E
['M', '_', '_', '_', '_', '_', '_', '_']
Qual letra?L
['M', '_', '_', '_', '_', '_', '_', '_']
Qual letra?A
['M', '_', '_', '_', '_', '_', '_', '_']
Qual letra?N
['M', '_', '_', '_', '_', '_', '_', '_']
Qual letra?C
['M', '_', '_', '_', '_', '_', '_', '_']
Qual letra?I
['M', '_', '_', '_', '_', '_', '_', '_']
Qual letra?A
['M', '_', '_', '_', '_', '_', '_', '_']
2 respostas

Código:

import random

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

    letras_acertadas = inicializa_letras_acertadas(palavra_secreta)
    print(letras_acertadas)

    enforcou = False
    acertou = False
    erros = 0

    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

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

    if (acertou):
        imprime_mensagem_vencedor()
    else:
        imprime_mensagem_perdedor(palavra_secreta)


def imprime_mensagem_abertura():
    print("=================================")
    print("***Bem vindo ao jogo da forca!***")
    print("=================================")


def carrega_palavra_secreta():
    arquivo = open("palavras.txt", "r")
    palavras = []

    for linha in arquivo:
        linha = linha.strip().upper()
        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 pede_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
        return

def imprime_mensagem_vencedor():
    print("Parabéns, você ganhou!")


def imprime_mensagem_perdedor(palavra_secreta):
    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("       \_______/           ")
solução!

Na sua função

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
        return

o return está indentado dentro do for, logo ele só executa a primeira iteração do for, por isso ele só passa na primeira letra, o correto seria:

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
    return