1
resposta

O index não funciona corretamente no jogo da forca

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

    palavra = 'BANANA'
    resposta = ["-" for letra in palavra]

    erros = 0
    index = 0




    enforcou = False
    acertou = False
    certo = False


    while resposta != palavra or erros < len(palavra):

        chute = input(f'Qual é a letra? {resposta} \n.').upper()
        chute = chute.strip()

        if chute in palavra:
            for letra in palavra:
                if chute == letra:
                    print(f'Encontrei a letra {letra} na posição {index}.')
                    resposta[index] = letra
                    index += 1
                    if "-" not in resposta:
                        print('Você venceu!')
                        break
        if chute not in palavra:
            erros += 1
            print(f'Você errou {erros} vezes! \n Restam {len(palavra) - erros} tentativas.')
            if erros == len(palavra):
                print('Você foi enforcado!')
                break



        print(f'{resposta}.')


    print('Fim do jogo!')


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

Acontece o seguinte: ao iterar a palavra pelo for, o chute realizado pelo usuário não é incluído na posição correta. Por exemplo, se a palavra for banana e o usuário arriscar o primeiro chute como "n":

N

Se arriscar segundo chute como a:

NA

E assim por diante. A saída da resposta é sempre uma palavra com as posições fora de ordem. Como corrigir, criando um index que seja dinâmico e consiga distribuir os chutes do usuário de acordo com a palavra escolhida para o jogo?

1 resposta

Oii Rafael, como você está?

Isso está acontecendo por causa da indentação (recuos) do código no seguinte trecho:

if chute in palavra:
            for letra in palavra:
                if chute == letra:
                    print(f'Encontrei a letra {letra} na posição {index}.')
                    resposta[index] = letra
                    index += 1
                    if "-" not in resposta:
                        print('Você venceu!')
                        break

Neste caso precisamos incrementar o índice fora da condição "if", pois, caso seja incrementado apenas dentro dessa estrutura, só será incrementado quando o "chute" for igual a "letra" e o que queremos é que o índice seja incrementado ao percorrer toda a palavra. Também é necessário zerar o contador do índice a cada novo chute para que se comece a contagem novamente. Veja como fica o trecho acima com as correções:

 if chute in palavra:
            index = 0
            for letra in palavra:
                if chute == letra:
                    print(f'Encontrei a letra {letra} na posição {index}.')
                    resposta[index] = letra
                if "-" not in resposta:
                    acertou = True
                    break
                index += 1

Observe que no código acima adicionei a variável acertou como valor verdadeiro para quando o usuário acertar a resposta completa, isso porque dessa forma, iremos conseguir parar a execução do programa através do break, uma vez que break do código acima irá sair do laço for, mas continuará na execução do laço while, então precisamos de alguma indicação para parar o laço while e isso será feito através da variável acertou.

Código completo com as modificações:

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

    palavra = 'BANANA'
    resposta = ["-" for letra in palavra]

    erros = 0
    index = 0

    enforcou = False
    acertou = False
    certo = False

    while resposta != palavra or erros < len(palavra):

        chute = input(f'Qual é a letra? {resposta} \n.').upper()
        chute = chute.strip()

        if chute in palavra:
            index = 0
            for letra in palavra:
                if chute == letra:
                    print(f'Encontrei a letra {letra} na posição {index}.')
                    resposta[index] = letra
                if "-" not in resposta:
                    acertou = True
                    break
                index += 1
        if chute not in palavra:
            erros += 1
            print(f'Você errou {erros} vezes! \n Restam {len(palavra) - erros} tentativas.')
            if erros == len(palavra):
                print('Você foi enforcado!')
                break
        if(acertou):
            print(f'{resposta}.')
            print('Você venceu!')
            break
        print(f'{resposta}.')


    print('Fim do jogo!')


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

Qualquer dúvida estou por aqui, tá bom?

Abraços e bons estudos!

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