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

[Dúvida] Meu jogo da Forca

Boa noite, implementei meu jogo com a intenção de desenhar o personagem a cada erro, "foi muito dificil kkkkkk", minha duvida é: Tem como fazer isso em menos linha de codigo sem ser pelo modo que eu fiz com ?

print("_"*30)
print("{:^30}".format("Bem vindo ao jogo da Forca!"))
print("_"*30, '\n')

print(" ------")
print("      -")
print("-    ( )")
print("-   --I--")
print("-    / \\")
print("-   /   \\")
print("-         ")
print("---")


def separator():
    return print("_"*30)

def corda():
    print('" ------"')

def laco():
    print('"       -')

def cabeca():
    print('"      ( )')

def tronco_e_braco():
    print("      --I--")

def perna1():
    print('"      / \\')

def perna2():
    print('"     /   \\')

def jogar():
    secret_word = "banana".upper()
    letras_utilizadas = []

    letras_acertadas = ["_" for letras in secret_word]
    print(letras_acertadas)

    tentativas = 6
    erros = 0

    # condicional do while
    acertou, enforcou = False, False

    while (not enforcou and not acertou):
        chute = input("\nQUAL LETRA ?: ")
        separator()
        chute = chute.strip().upper()  # remove espaços e passa a maiuscula
        if(chute in secret_word):
            index = 0  # contador
            letras_utilizadas.append(chute)
            print('LETRAS UTILIZADAS:', letras_utilizadas)
            separator()
            for letra in secret_word:
                if (chute == letra):
                    letras_acertadas[index] = letra
                index += 1

        else:
            letras_utilizadas.append(chute)
            if (erros == 0):
                corda()
            elif (erros == 1):
                corda()
                laco()
            elif (erros == 2):
                corda()
                laco()
                cabeca()
            elif (erros == 3):
                corda()
                laco()
                cabeca()
                tronco_e_braco()
            elif (erros == 4):
                corda()
                laco()
                cabeca()
                tronco_e_braco()
                perna1()
            else:
                corda()
                laco()
                cabeca()
                tronco_e_braco()
                perna1()
                perna2()
            erros += 1
            print('TENTATIVAS RESTANTES:', (6 - erros))
            separator()
            print('LETRAS UTILIZADAS:', letras_utilizadas)
            separator()

        enforcou = erros == 6
        acertou = "_" not in letras_acertadas
        print("PALAVRA SECRETA:\t", letras_acertadas)
        print("*"*30)

    if(enforcou):
        print("VOCÊ PERDEU, INICIE OUTRA PARTIDA.")

    else:
        print("PARABÉNS VOCÊ VENCEU!")


if(__name__ == "__main__"):
    jogar()
5 respostas
solução!

Bom dia, Juliano! Tem sim! Uma forma é utilizar uma lista e for:

def desenha_forca(erros):
    corpo = [" ------",
            "      -",
            "-    ( )",
            "-   --I--",
            "-    / \\",
            "-   /   \\"]

    for linha in range(0, erros):
        print(corpo[linha])
  • Chamar a função lá no final (depois de somar +1 no erros)
        desenha_forca(erros)
        enforcou = erros == 6
        acertou = "_" not in letras_acertadas
        print("PALAVRA SECRETA:\t", letras_acertadas)
        print("*"*30)

Espero ter ajudado/acrescentado de alguma forma. Valeu!

Eu fiquei um bom tempo tentando imprimir uma parte do desenho embaixo do outro, como você conseguiu? utilizei \n .poderia me explicar?

Mas o seu codigo funcionou certinho. Obrigado

Sem problemas. Bom, é que na verdade a lista do corpo está assim:

corpo = [" ------", "      -", "-    ( )", "-   --I--", "-    / \\", "-   /   \\"]

Eu apenas deixei ela mais "visivelmente legível". Então o for vai imprimir cada item dessa lista conforme o intervalo de acordo com o número de erros:

for item in range(0, erros):
    print(corpo[item])
  • se erro = 0
    for item in range(0, *erros=0*):
      print(corpo[*item=none*])
    # não mostra nada, pois não há intervalo
  • se erro = 1
    for item in range(0, *erros=1*):
      print(corpo[*item=0*])
    # mostra apenas o primeiro item da lista
  • se erro = 2
    for item in range(0, *erros=2*):
      print(corpo[*item=0*])
    # mostra o primeiro item da lista. E então volta para o começo e mostra o segundo item:
      print(corpo[*item=1*])
  • se erro = 3
    for item in range(0, *erros=3*):
      print(corpo[*item=0*])
    # mostra o primeiro e volta para o começo:
      print(corpo[*item=1*])
    # mostra o segundo e volta para o começo:
      print(corpo[*item=2*])
    Então o for já vai deixando um print embaixo do outro:
    print(corpo[*item=0*])
    print(corpo[*item=1*])
    print(corpo[*item=2*])
    print(corpo[*item=3*])
    Por isso não precisa do \n. Espero que tenha entendido haha Valeu!

Entendi, muito obrigado, foi de muita valia esse conteudo. Eu nunca pensaria assim. kkk Obrigado mesmo.

Que bom que entendeu! Por nada!! Suba e nunca pare!

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