3
respostas

Aula 6 módulo 3. Chute retornando sequência indevida

Saudações, amigos. tudo bem?

Estou na aula 6 do 3º módulo do curso de Python 3 parte 2.

Nessa aula, estamos tentando deixar a estrutura com um pouco mais cara de forca (seguindo as lacunas por "_").

Basicamente a ideia é que o programa substitua a str _ pelo chute do usuário.

Porém, quando eu chuto alguma letra da palavra, ao invés de me devolver a letra na posição certa, ele me devolve algo como: ['n', 'n', 'a', '', '', '_']

Este é o meu código:

def jogar():
    print("************************************")
    print("***Bem vindo(a) ao jogo da Forca!***")
    print("************************************")

    palavra_secreta = "banana"
    letras_acertadas = ['_','_','_','_','_','_']

    enforcou = False
    acertou = False


    while (not enforcou and not acertou):

        chute = input("Qual seu chute?\n")
        chute = chute.strip()

        index = 0
        for letra in palavra_secreta:
            if (chute.upper() == letra.upper()):
                letras_acertadas[index] = letra
                index = index + 1

        print(letras_acertadas)

print("fim de jogo")

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

Caso meu chute seja n, ele me retorna isso: ['n', 'n', 'a', '', '', '_']

Quando chuto a, ele me retorna: ['a', 'a', 'a', '', '', '_'].

O que estou fazendo de errado?

Desde já, gratidão! <3

3 respostas

Coloque o incremento do INDEX fora da condição IF, caso contrário ele sempre vai manter o INDEX de LETRAS_ACERTADAS no mesmo valor até que você acerte um chute, enquanto o que você quer é que a cada letra que ele percorre na palavra, ele mude também o INDEX da posição dos _ , assim se você chutar a letra O da balavra BOA, no primeiro loop (index 0 e loop 0) ele vai comparar B e O, vai dar errado, ele incrementa o INDEX (index 1 agora) para ir para a próxima casa e recomeça o loop (loop 1 agora), compara O com O, que retorna verdadeiro, entra dentro do IF e troca o segundo _ (index 1) pelo O (loop 1)

index = 0
        for letra in palavra_secreta:
            if (chute.upper() == letra.upper()):
                letras_acertadas[index] = letra
            index += 1 #fora do if
        print(letras_acertadas)

Muito obrigado, Thiago!

Confesso que tô com um pouco de dificuldade para entender como essa parte do index funciona.

Acho que preciso revisitar os conceitos de for e lista. De qualuqer modo, muito obrigado :)

Larissa, eu fiz essa imagem abaixo para ilustrar o que o algorítimo deve fazer ao chutar a letra A** na palavra secreta **BATATA, quero que você se atente aos números acima das caixas, que são de 0 a 5, esse número é o INDEX, ou no português, é a POSIÇÃO da letra em relação à palavra.

No loop FOR, fazemos ele a cada loop, comparar letra a letra da palavra com a letra que você chutou, até chegar no final da palavra, como está no código:

for letra in palavra_secreta:

Se a letra que foi chutata for igual a letra da palavra que ele está examinando, então ele entra no if:

if (chute.upper() == letra.upper()):

Dentro do IF ele troca o _ da POSIÇÃO INDEX pela letra:

letras_acertadas[index] = letra

Mas o que diaxo é esse index? Olhe agora a imagem abaixo, os números circulados na segunda coluna, representam o valor de INDEX Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Quando você incrementa o INDEX fora do if, no mesmo escopo do FOR, ele sempre vai ter o mesmo INDEX que o FOR está trabalhando (olhe os números circulados), assim sempre vamos trocar o underscore pela letra chutada na mesma posição da letra na palavra original. Do jeito que estava o código antes, a segunda coluna só iria "mudar de casa", quando a comparação das letras desse certo, e no final ficaria:

[A, A, A , _, _, _]

Consegui deixar mais claro assim? Realmente é um pouco difícil fazer entender por texto, rs.