Jogo da forca em Python

Publicado por Artur Rabelo (última atualização em 03/07/2020)

[ Hits: 6.469 ]

Homepage: https://github.com/artrabelo

Download hangman.py




Minha implementação do famoso jogo da forca ("hangman") como exercício na linguagem Python.  O jogo escolhe a palavra secreta de um arquivo "wordlist.txt" contendo palavras em cada linha.

  



Esconder código-fonte

#!/usr/bin/python3

from random import choice
import os

#  Color dictionary for aesthetic use
colors = {'red': '\033[1;31m',
          'green': '\033[1;32m',
          'blue': '\033[1;36m',
          'gray': '\033[1;90m',
          'reset': '\033[m'}


def get_wordlist():

    #  Choose secret word from a wordlist file in the same directory as the script.
    #  If a wordlist file is not provided, the game exits. 
    try:
        with open(os.path.join(os.path.dirname(__file__), 'wordlist.txt')) as w:
            lines = w.readlines()
            words = [line.strip().upper() for line in lines]
            secret = choice(words)
            return secret
    except IOError:
        return 'ERRO: Nenhum dicionário foi encontrado.'


def hide(word, masked, hack=False):
    #  Print blanks and guessed letters
    for position, letter in enumerate(word):
        if masked[position] == letter:
            print(f'{colors["green"]}{letter}{colors["reset"]}', end=' ')
        elif word[position] == ' ':         #  This is a quick workaround (pt-BR: "gambiarra")
            masked[position] = letter       #  for open compound words.
            print('', end='')
        else:
            print('_', end=' ')
    print('', end='')
    print()

    #  Game will print the secret if hack mode is on
    if hack:
        for letter in word:
            print(f'{colors["gray"]}{letter.lower()}{colors["reset"]}', end=' ')
        print()


def play(secret):

    #  Set initial variables
    hidden = ['_' for letter in secret]
    guessed_letters = []
    turns = 6

    #  Game begins
    while turns > 0:

        hide(secret, hidden)

        #  Player wins if words match
        if ''.join(secret) == ''.join(hidden):
            print('Parabéns, você acertou!')
            break

        print()
        guess = input('Tente adivinhar qual é a palavra secreta. Digite uma letra: ').strip().upper()

        if guess.isalpha() and len(guess) == 1:

            if guess in guessed_letters:
                print('Você já jogou esta letra.')

            else:
                if guess in secret:
                    for position, letter in enumerate(secret):
                        if guess == letter:
                            hidden[position] = letter
                else:
                    turns -= 1
                    print(f'Errado! {colors["red"]}{guess.upper()}{colors["reset"]} não está na palavra.')

                guessed_letters.append(guess)

            if turns > 0:
                print(f'Letras jogadas: {colors["blue"]}{" - ".join(guessed_letters)}{colors["reset"]}')
                print(f'Você tem {colors["red"]}{turns}{colors["reset"]} chance(s) restantes.')

        else:
            print('Você deve digitar uma letra.')

        print()

    else:
        print(f'Você perdeu! A resposta correta era {colors["red"]}{secret}{colors["reset"]}')


def main():
    word = get_wordlist()
    play(word)


if __name__ == '__main__':
    main()

Scripts recomendados

Usando for no shell do python =)

Insertion Sort em Python

Par ou Impar em Python

Formatando número de telefone celular (usando .format)

Um programa simples para gerar uma tabuada em python com menu utilizando laco for while try except e


  

Comentários
[1] Comentário enviado por fabio em 03/07/2020 - 07:24h

Muito bem feito o código! Gostei. Vou jogar com minha filha aqui :)

[2] Comentário enviado por arturkiraa em 03/07/2020 - 13:05h

Valeu! Só tem um erro numa linha, onde era pra ser " masked[position] = letter" tem um sinal de igual a mais. Só fui ver depois que já tinha mandado e não tinha como mudar.

[3] Comentário enviado por fabio em 03/07/2020 - 13:59h


[2] Comentário enviado por arturkiraa em 03/07/2020 - 13:05h

Valeu! Só tem um erro numa linha, onde era pra ser " masked[position] = letter" tem um sinal de igual a mais. Só fui ver depois que já tinha mandado e não tinha como mudar.


Mas está correto. Se mudar para atribuição do jeito que você sugeriu dá inclusive erro de execução, nem roda o jogo.

[4] Comentário enviado por arturkiraa em 03/07/2020 - 14:16h

Sim, correto. Eu tinha feito uma pequena mudança na função hide() para que se pudesse reconhecer palavras compostas, mas que não foi pro código (pensei que tinha ido):
elif masked[position] == ' ':
masked[position] = letter

[5] Comentário enviado por maurixnovatrento em 04/07/2020 - 16:09h


vou testar. deve ter ficado bom.

___________________________________
Conhecimento não se Leva para o Túmulo.

[6] Comentário enviado por arturkiraa em 05/07/2020 - 13:38h

Esqueci de incluir o link da wordlist que eu uso, aqui está: https://github.com/akira095/hangman-py/blob/master/wordlist.txt.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts