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

Minha versão do jogo da Forca

Implementei com algumas diferenças em relação ao código exibido em aula. Tentei "ir um pouco além" e implementar algumas funcionalidades extras, tais como um validador da letra digitada pelo usuário (não aceitando "vazios" e espaços e considerando apenas a primeira letra caso o usuário digite duas ou mais), uma listagem das letras já digitadas pelo usuário - certas ou erradas - é exibida a cada rodada, também não permitindo que o usuário digite uma letra repetidamente. Além disso, ao acertar uma letra o jogo indica para o usuário a posição em que aquela letra encontra-se na palavra. Por fim, usei um sistema de "tentativas" diferente: uma variável "tentativas" começa com um determinado valor (dependente do tamanho da palavra secreta) e é decrementado a cada rodada, independente de acertar ou não alguma letra. Caso o número de tentativas chegue a zero e a palavra secreta não tenha sido descoberta, o jogador perde. Do contrário, ele vence.

`

import random

def jogar():

palavra_secreta = carrega_palavra_secreta()
letras_acertadas = inicializa_letras_acertadas(palavra_secreta)
letras_tentadas = []
letras_faltando=len(palavra_secreta)
total_tentativas = len(palavra_secreta) + 5
enforcou = False
acertou = False

imprime_mensagem_abertura()

print(letras_acertadas)

while(not enforcou and not acertou):

    chute = pede_chute(letras_tentadas)
    faz_iteracao(palavra_secreta, chute, letras_acertadas)
    letras_faltando = str(letras_acertadas.count('_'))
    total_tentativas-=1

    imprime_mensagem_rodada(letras_faltando, total_tentativas, letras_tentadas, letras_acertadas)

    if(total_tentativas==0):

        enforcou=True

    if ("_" not in letras_acertadas):
        enforcou=False
        acertou = True

imprime_mensagem_finalizacao(palavra_secreta, acertou, enforcou)

def imprime_mensagem_abertura(): print("*") print("Bem vindo ao jogo da Forca!") print("*") print("Início do jogo")

def carrega_palavra_secreta(nome_arquivo="Lista-de-Palavras.txt", primeira_linha=0): lista_palavras = [] # random.choice(arquivo) with open(nome_arquivo) as arquivo: for linha in arquivo: linha = linha.strip().upper() lista_palavras.append(linha)

palavra_secreta = lista_palavras[random.randrange(primeira_linha, len(lista_palavras))]
return palavra_secreta

def inicializa_letras_acertadas(palavra): lista = ["_" for letra in palavra] return lista

def pede_chute(letras_tentadas): while(True): chute = input("Qual letra? ") if (not chute): print("Digite uma letra!") continue chute = chute[0] while (chute[0] == " "): print("Digite uma letra!") chute = input("Qual letra? ")[0] chute = chute.strip() chute = chute.upper() if (chute in letras_tentadas): print("Letra já tentada!") continue letras_tentadas.append(chute) return chute

3 respostas

Segue o restante do código, que excedeu o número máximo de caracteres para apenas um "post":

def imprime_mensagem_finalizacao(palavra_secreta,acertou, enforcou):
    if (acertou == True):
        print("Parabéns! Você acertou a palavra: {}".format(palavra_secreta))
        print("       ___________      ")
        print("      '._==_==_=_.'     ")
        print("      .-\\:      /-.    ")
        print("     | (|:.     |) |    ")
        print("      '-|:.     |-'     ")
        print("        \\::.    /      ")
        print("         '::. .'        ")
        print("           ) (          ")
        print("         _.' '._        ")
        print("        '-------'       ")
        print("Fim do jogo")
    if (enforcou == True):
        print("Você foi enforcado! A palavra era '{}'".format(palavra_secreta))
        print("    _______________         ")
        print("   /               \        ")
        print("  /                 \       ")
        print("//                   \/\    ")
        print("\|   XXXX     XXXX   | /    ")
        print(" |   XXXX     XXXX   |/     ")
        print(" |   XXX       XXX   |      ")
        print(" |                   |      ")
        print(" \__      XXX      __/      ")
        print("   |\     XXX     /|        ")
        print("   | |           | |        ")
        print("   | I I I I I I I |        ")
        print("   |  I I I I I I  |        ")
        print("   \_             _/        ")
        print("     \_         _/          ")
        print("       \_______/            ")
        print("Fim do jogo")



def imprime_mensagem_rodada(letras_faltando, total_tentativas, letras_tentadas, letras_acertadas):
    print('Ainda faltam acertar {} letras'.format(letras_faltando))
    print("Tentativas restantes: {}".format(total_tentativas))
    print("Letras tentadas: {}".format(letras_tentadas))
    print(letras_acertadas)


def faz_iteracao(palavra_secreta, chute, letras_acertadas):
    index = 0

    for letra in palavra_secreta:

        if (chute == letra):
            letras_acertadas[index] = letra
            print("Encontrei a letra {} na posição {}".format(letra, index + 1))
            print(letras_acertadas)
        elif (chute not in palavra_secreta):
            print("A palavra secreta não contém a letra {}".format(chute))
            break

        index += 1


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

Olá, Bruno! Tudo bem?

Parabéns! Foi bem fácil de entender o funcionamento e seu código ficou bem organizado.

Além disso foi muito bacana acompanhar seu desenvolvimento durante o projeto!

Caso tenha ficado com alguma dúvida não deixe de compartilhar com a gente.

Continue mergulhando, bons estudos.

Até mais!

Muito obrigado pelo feedback, Caroline. No ensino remoto e assíncrono, é muito importante temos esse tipo de retorno para saber se estamos no "caminho certo".