5
respostas

Jogo da forca

Resolvi entrar na brincadeira e fiz dessa forma para ser a mais simples possível. Espero que esteja bom.


import os
from random import randint

def jogo_da_forca( ):
        title = "JOGO DA FORCA"
        stuff = "*" * (len(title) + 1)
        os.system("cls" if os.name == 'nt' else 'clear')
        print(f"{stuff} \n{title} \n{stuff} \n")
        trying = 0
        forca = [ ]
        escolhidas = [ ]
        vencer = False
        hang = ["==================",
                "               | |    \n               | |    \n               | |    \n               | |    ",
                "           /\/\/\/\/\/\n           |   @  @   |\n          C           D\n           |     L    |\n           \     _    /\n            \________/",
                "        _______|  |_______\n       /                  \ \n      /   /|          |\   \ \n     /   / |          | \   \ \n    /   /  |          |  \   \ \n   /   /   |          |   \   \ ",
                "   |   |   |          |   |   | \n   |   |   |          |   |   | \n   |   |   |          |   |   | \n   |___|   |          |   |___| \n   |   |   |__________|   |   | \n   (   )   |          |   (   ) \n   |||||   |          |   ||||| ",
                "           |          |        \n           |    ||    |        \n           |    ||    |        \n           |    ||    |        \n           |    ||    |        \n           |    ||    |        \n           |    ||    |        ",
                "     ______|    ||    |______  \n    /           ||           \  \n   |____________||____________|  "]

        secretas = ["AMARELO", "INIMAGINAVEL", "SUSTENTABILIDADE", "PNEUMOULTRAMICROSCOPICOSSILICOVULCANOCONIOTICO", "ZIGOMATICO", "MORFOLOGICAMENTE", "PLUMA", "TRABALHO", "PROGRAMACAO"]
        num = randint(0, len(secretas) - 1)
        sec = [x for x in secretas[num]]
        vazio = ["_" for x in sec]
        print(f"\n\n{' '.join(vazio)}")

        while not vencer:
            letra = input("\nLETRA: ").strip( ).upper( )
            if letra in escolhidas:
                print(f"\nVOCÊ JÁ ESCOLHEU A LETRA {letra}. TENTE OUTRA...")
                continue
            else:
                escolhidas.append(letra)

            if letra not in sec:
                forca.append(hang[trying])
                trying += 1
            for x in range(len(sec)):
                if letra == sec[x]:
                    vazio[x] = sec[x]

            for x in forca:
                print(x)

            print(f"\n\n{' '.join(vazio)}")

            if (trying == len(hang)) and ("_" in vazio):
                print("\nINFELIZMENTE VOCÊ PERDEU. NA PRÓXIMA VOCÊ CONSEGUE...")
                break
            if (trying < len(hang)) and (not "_" in vazio):
                print("\nPARABéNS. VOCÊ GANHOU.")
                vencer = True

jogo_da_forca( )

Eu não cheguei a fazer muitos testes. Se encontrarem algum erro ou tiverem sugestões para melhoria, podem avisar, serão bem vindos.

5 respostas

Olá Adriano, tudo belezinha?

Obrigado por compartilhar seu código conosco! Está sendo muito bacana acompanhar sua dedicação e evolução. :)

Sobre sua pergunta, eu testei o código e ele parece estar funcionando bem. Desse modo, caso você tenha interesse em aprimorar ainda mais esse projeto, deixo como sugestão algumas possibilidades:

  • Adicionar um limite de tentativas para o jogador, para que ele não possa tentar infinitamente até acertar a palavra.
  • Permitir que o jogador escolha a categoria da palavra que ele quer adivinhar (por exemplo, animais, frutas, países, etc.).
  • Adicionar um sistema de pontuação para que o jogador possa ganhar pontos com base no número de tentativas que ele levou para adivinhar a palavra.

Espero ter ajudado. Qualquer dúvida me coloco a disposição.

Grande abraço. Bons estudos!

Grande Gabrielle. Tudo tranquilo? Agradeço pelo feedback e gostei das dicas e confesso que ainda não tinha pensado nessas possibilidades de desafio do jogo. Gostaria apenas de destacar que quanto a primeira dica, ela já está implementada no código, pois o número de erros que o jogador pode ter, é igual a 7 e que corresponde ao número de itens da lista hang onde tem cada parte de um bonequinho na forca (apesar de parecer um monte de caracteres sem sentido) que é impresso na tela a cada erro do jogador. Nesse caso o programa verifica se o número de tentativas (trying) for igual ao tamanho da lista hang e se ainda há algum "_" na lista vazio o jogo encerra com a mensagem "INFELIZMENTE VOCÊ PERDEU. NA PRÓXIMA VOCÊ CONSEGUE...". Mas ainda assim, valeu pelas dicas.

Opa, Adriano. Peço desculpas pela minha falta de atenção.

Caso você implemente as outras duas sugestões, não esquece de compartilhar aqui com a gente.

Abraços. Bons estudos!

Imagino que seria assim a forma como gostaria que fosse feito:

import os
from random import randint, choice

def header( ):
    title = "JOGO DA FORCA"
    stuff = "*" * (len(title) + 1)
    os.system("cls" if os.name == 'nt' else 'clear')
    print(f"{stuff} \n{title} \n{stuff}")

def escolhas( ):
    header( )
    esc = ""
    opcoes = {'animais': ['CACHORRO','CROCODILO', 'ORNINTORRINCO', 'DROMEDARIO', 'RAPOSA', 'URSO-POLAR', 'ANTILOPE'],
              'paises': ['MARROCOS', 'FILIPINAS', 'AUSTRALIA', 'TURCOMENIQUISTAO', 'VIETNA', 'BANGLADESH', 'NICARAGUA'],
              'frutas': ['FRAMBOESA', 'ABACAXI', 'FRUTA-PAO', 'JABUTICABA', 'MANGA', 'LARANJA', 'MELANCIA'],
              'cidades': ['PINDAMONHANGABA', 'ANANINDEUA', 'MOSSORO', 'CACHOEIRINHA', 'ALVARENGA', 'CARAPICUIBA', 'FLEXEIRAS'],
              'carros': ['MITSUBISHI', 'FERRARI', 'LAMBORGHINI', 'CHEVROLET', 'MASERATI', 'HYUNDAI', 'RENAULT'],
              'outros': ["AMARELO", "INIMAGINAVEL", "SUSTENTABILIDADE", "PNEUMOULTRAMICROSCOPICOSSILICOVULCANOCONIOTICO", "ZIGOMATICO", "MORFOLOGICAMENTE", "PLUMA", "TRABALHO", "PROGRAMACAO"]}

    while esc not in ('0', '1', '2'):
        cat = ""
        sec = [ ]
        header( )
        esc = input("\nESCOLHA UMA OPÇÂO QUE DESEJA JOGAR: \n1 - CATEGORIAS \n2 - ALEATÓRIA \n0 - SAIR \n> ")
        if esc not in ('0', '1', '2'):
           header( )
            err = input(f"\n'{esc}' não corresponde a uma opção válida. \nDigite apenas '0', '1' ou '2' para selecionar uma ação. \nPressione a tecla ENTER para voltar ao jogo.")
        if esc == '1':
            while cat not in ('0', '1', '2', '3', '4', '5', '6'):
                header( )
                cat = input("\nSELECIONE A CATEGORIA DE PALAVRAS QUE DESEJA USAR NO JOGO: \n1 - ANIMAIS \n2 - PAÍSES \n3 - FRUTAS \n4 - CIDADES \n5 - CARROS \n6 - OUTROS \n0 - VOLTAR \n> ")
                if cat not in ('0', '1', '2', '3', '4', '5', '6'):
                    header( )
                    err = input(f"\n'{cat}' não corresponde a uma categoria válida. \nDigite apenas '0', '1', '2', '3', '4', '5' ou '6' para selecionar uma ação.  \nPressione a tecla ENTER para voltar ao jogo.")
                if cat == '1':
                    sec = [x for x in opcoes['animais'][randint(0, len(opcoes['animais']) - 1)]]
                if cat == '2':
                    sec = [x for x in opcoes['paises'][randint(0, len(opcoes['paises']) - 1)]]
                if cat == '3':
                    sec = [x for x in opcoes['frutas'][randint(0, len(opcoes['frutas']) - 1)]]
                if cat == '4':
                    sec = [x for x in opcoes['cidades'][randint(0, len(opcoes['cidades']) - 1)]]
                if cat == '5':
                    sec = [x for x in opcoes['carros'][randint(0, len(opcoes['carros']) - 1)]]
                if cat == '6':
                    sec = [x for x in opcoes['outros'][randint(0, len(opcoes['outros']) - 1)]
                if cat == '0':
                    sec = ['0']
                return sec
        if esc == '2':
            header( )
            chave = choice([x for x in opcoes.keys( )])
            sec = [x for x in opcoes[chave][randint(0, len(opcoes[chave]) - 1)]]
            return sec
        if esc == '0':

            print("\nJOGO ENCERRADO.\n")
            exit(0)

def jogo_da_forca( ):
        trying, pts = 0, 700
        forca, escolhidas = [ ], [ ]
        sec = escolhas( )
        hang = ["==================",
                "               | |    \n               | |    \n               | |    \n               | |    ",
                "           /\/\/\/\/\/\n           |   @  @   |\n          C           D\n           |     L    |\n           \     _    /\n            \________/",
                "        _______|  |_______\n       /                  \ \n      /   /|          |\   \ \n     /   / |          | \   \ \n    /   /  |          |  \   \ \n   /   /   |          |   \   \ ",
                "   |   |   |          |   |   | \n   |   |   |          |   |   | \n   |   |   |          |   |   | \n   |___|   |          |   |___| \n   |   |   |__________|   |   | \n   (   )   |          |   (   ) \n   |||||   |          |   ||||| ",
                "           |          |        \n           |    ||    |        \n           |    ||    |        \n           |    ||    |        \n           |    ||    |        \n           |    ||    |        \n           |    ||    |        ",
                "     ______|    ||    |______  \n    /           ||           \  \n   |____________||____________|  "]

        while sec[0] == '0':
            jogo_da_forca( )
        else:
            header( )
            vazio = ["_" for x in sec]
            print(f"\n\n{' '.join(vazio)}")

            while True:
                letra = input("\nLETRA: ").strip( ).upper( )
                if letra in escolhidas:
                    print(f"\nVOCÊ JÁ ESCOLHEU A LETRA {letra}. TENTE OUTRA...")
                    continue
                else:
                    escolhidas.append(letra)

                if letra not in sec:
                    forca.append(hang[trying])
                    trying += 1
                    pts -= 100
                for x in range(len(sec)):
                    if letra == sec[x]:
                        vazio[x] = sec[x]
                header( )
                for x in forca:
                    print(x)

                print(f"\nPONTUAçÃO: {pts}\n\n{' '.join(vazio)}")

                if (trying == len(hang)) and ("_" in vazio):
                    resp = input("\nINFELIZMENTE VOCÊ PERDEU. NA PRÓXIMA VOCÊ CONSEGUE... \nPRESSIONE A TECLA ENTER PARA VOLTAR AO MENU PRINCIPAL.")
                    jogo_da_forca( )
                if (trying < len(hang)) and (not "_" in vazio):
                    resp = input(f"\nPARABéNS. VOCÊ GANHOU. VOCÊ MARCOU {pts} PONTOS. \nPRESSIONE A TECLA ENTER PARA VOLTAR AO MENU PRINCIPAL.")
                    jogo_da_forca( )

jogo_da_forca( )

Eu preferi fazer a pontuação do jogo de forma decrescente, começando em 700 e, a cada erro, o jogador perde 100 pontos para poder acompanhar a lógica do jogo. Qualquer erro, é só avisar e as sugestões ainda continuam sendo bem vindas.