2
respostas

Dúvida de um possível erro

# forca.py

def jogar():

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

    palavra_secreta = "banana".upper()
    letras_acertadas = ["_", "_", "_", "_", "_", "_"]
    enforcou = False
    acertou = False
    erros = 0

    print(letras_acertadas)

    while (not acertou and not enforcou):

        chute = input("Que letra?")     
        chute = chute.strip().upper()

        if (chute in palavra_secreta):
            index = 0
            for letra in palavra_secreta:
                if (chute == letra):
                    print("Encontrei a letra {} na posição {}".format(letra, index))
                    letras_acertadas[index] = letra
                index += 1
        else:
            erros = erros +1

        enforcou = (erros == len(palavra_secreta))
        acertou = "_" not in letras_acertadas
        print("Você errou {} de {} letras".format(erros, len(palavra_secreta)))

        print(letras_acertadas)

    if (acertou == True):
        print("Parabèns!\nVocè acertou. A palavra era: {}".format(palavra_secreta))
    elif (enforcou == True):
        print("Você foi enforcado!\nA palavra era {}".format(palavra_secreta))
    else:
        print("Ops, erro!")

    print("Fim do jogo")

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

Caso o jogador digite mais de um caractere como fazer para restringir isso?

Como fazer para que o jogador só possa digitar letras?

Adicionei uma indicação por escrito de quanto erros e total de letras o usuário digitou para facilitar na compreensão do jogo.

2 respostas

Olá Douglas, tudo bem com você?

Podemos colocar uma nova validação do valor informado pelo usuário.

Nessa validação usaremos o método len() para conferir a quantidade de dígitos informados, e para segunda validação usaremos o método .isnumeric(), para verificar se o usuário informou um número, ficando conforme abaixo:


# Início do código

        if len(chute) == 1 and not chute.isnumeric():

            # Código antigo com a lógica de funcionamento

        else:
            print("Informe um valor válido")
            continue

# Final do código
  • Para que o teste funcione, é necessário que ele esteja dentro do laço while.

  • Deixo abaixo o código completo para a comparação, as novas linhas são: 22, 38, 39 e 40.

  • As linhas de 23 a 37 sofreram mudanças de indentação, estão dentro no novo if.

Código completo

# forca.py

def jogar():

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

    palavra_secreta = "banana".upper()
    letras_acertadas = ["_", "_", "_", "_", "_", "_"]
    enforcou = False
    acertou = False
    erros = 0

    print(letras_acertadas)

    while (not acertou and not enforcou):

        chute = input("Que letra? ")
        chute = chute.strip().upper()

        if len(chute) == 1 and not chute.isnumeric():
            if (chute in palavra_secreta):
                index = 0
                for letra in palavra_secreta:
                    if (chute == letra):
                        print("Encontrei a letra {} na posição {}".format(letra, index))
                        letras_acertadas[index] = letra
                    index += 1
            else:
                erros = erros +1

            enforcou = (erros == len(palavra_secreta))
            acertou = "_" not in letras_acertadas
            print("Você errou {} de {} letras".format(erros, len(palavra_secreta)))

            print(letras_acertadas)
        else:
            print("Informe um valor válido")
            continue
    if (acertou == True):
        print("Parabèns!\nVocè acertou. A palavra era: {}".format(palavra_secreta))
    elif (enforcou == True):
        print("Você foi enforcado!\nA palavra era {}".format(palavra_secreta))
    else:
        print("Ops, erro!")

    print("Fim do jogo")

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

Coloco-me à disposição em caso de dúvidas.

Abraços e bons estudos.

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!

Douglas,

Uma das possíveis soluções é envolver o input do usuário 'chute' em um mais um loop que verifica se o input está correto. Segue a minha solução:

    while (not acertou and not enforcou):

    # Código alterado a partir daqui
        input_correto = False
        chute = ''
        while input_correto is False:
            chute = input("Que letra?")
            chute = chute.strip().upper()
            qtd_letras = len(chute)
            if qtd_letras > 1:
                print('Você digitou mais de uma letra :( tente novamente')
                continue
            if chute.isnumeric():
                print('Você não digitou uma letra :( tente novamente')
                continue
            if qtd_letras == 1 & ~chute.isnumeric():
                input_correto = True
    # Fim do código alterado

        if (chute in palavra_secreta):

PS: Enquanto eu estava escrevendo o tópico, o Felippe escreveu uma resposta melhor acima. Edit: Roubado parte do código do Felippe pra melhorar a resposta