# Hangman Game using Python

## Introduction

According to Wikipedia,

> Hangman is a paper and pencil guessing game for two or more players. One player thinks of a word, phrase or sentence and the other tries to guess it by suggesting letters within a certain number of guesses.

If you haven't played the game, you can play it [here](https://hangmanwordgame.com/).

In this blog, we're going to build the Hangman game using Python. This is a beginner-friendly project and can help beginners boost their programming skills and logic.

## Demo

%[https://www.youtube.com/watch?v=YGRwF1MxOfk]

If the video doesn't work properly, watch it [here](https://www.youtube.com/watch?v=YGRwF1MxOfk).

**How It Works**

*   First of all, a word is selected randomly from a secret list of words. For this, we'll be using Python's in-built **random** module.
*   The player gets a limited number of chances(in our case, 6) to guess the word correctly. The chances left are represented in the form of a hanging man.
*   When a letter of the word is guessed correctly, the letter position is made visible.

## Let's Code It

To give visual appeal to the players, we'll create figures of the hanging man for each stage, i.e., whenever a life is lost, the figure will change.

Create a `hangman_art.py` file and add the following content there:

```python

stages = ['''
  +---+
  | |
  O |
 /|\ |
 / \ |
      |
=========
''', '''
  +---+
  | |
  O |
 /|\ |
 / |
      |
=========
''', '''
  +---+
  | |
  O |
 /|\ |
      |
      |
=========
''', '''
  +---+
  | |
  O |
 /| |
      |
      |
=========''', '''
  +---+
  | |
  O |
  | |
      |
      |
=========
''', '''
  +---+
  | |
  O |
      |
      |
      |
=========
''', '''
  +---+
  | |
      |
      |
      |
      |
=========
''']

logo = '''
 _
| |
| | ____ _ _ ____ _ _ _____  ___ ___
| '_ \ / _` | '_ \ / _` | '_ ` _ \ / _` | '_ \
| | | | (_| | | | | (_| | | | | | | (_| | | | |
|_| |_|\ __,_|_| |_|\__ , |_| |_| |_|\__,_|_| |_|
                    __/ |
                   |___/ '''

```

We've created a list called `stages` where we have put each figure. Apart from that, we have a Hangman logo too, that we'll show when the game starts.

Next, we'll create our secret list of words from where our program will select words randomly. Create a hangman\_words.py file and the following content there:

```python

word_list = [
    'abruptly',
    'absurd',
    'abyss',
    'affix',
    'askew',
    'avenue',
    'awkward',
    'axiom',
    'azure',
    'bagpipes',
    'bandwagon',
    'banjo',
    'bayou',
    'beekeeper',
    'bikini',
    'blitz',
    'blizzard',
    'boggle',
    'bookworm',
    'boxcar',
    'boxful',
    'buckaroo',
    'buffalo',
    'buffoon',
    'buxom',
    'buzzard',
    'buzzing',
    'buzzwords',
    'caliph',
    'cobweb',
    'cockiness',
    'croquet',
    'crypt',
    'curacao',
    'cycle',
    'daiquiri',
    'dirndl',
    'disavow',
    'dizzying',
    'duplex',
    'dwarves',
    'embezzle',
    'equip',
    'espionage',
    'euouae',
    'exodus',
    'faking',
    'fishhook',
    'fixable',
    'fjord',
    'flapjack',
    'flopping',
    'fluffiness',
    'flyby',
    'foxglove',
    'frazzled',
    'frizzled',
    'fuchsia',
    'funny',
    'gabby',
    'galaxy',
    'galvanize',
    'gazebo',
    'giaour',
    'gizmo',
    'glowworm',
    'glyph',
    'gnarly',
    'gnostic',
    'gossip',
    'grogginess',
    'haiku',
    'haphazard',
    'hyphen',
    'iatrogenic',
    'icebox',
    'injury',
    'ivory',
    'ivy',
    'jackpot',
    'jaundice',
    'jawbreaker',
    'jaywalk',
    'jazziest',
    'jazzy',
    'jelly',
    'jigsaw',
    'jinx',
    'jiujitsu',
    'jockey',
    'jogging',
    'joking',
    'jovial',
    'joyful',
    'juicy',
    'jukebox',
    'jumbo',
    'kayak',
    'kazoo',
    'keyhole',
    'khaki',
    'kilobyte',
    'kiosk',
    'kitsch',
    'kiwifruit',
    'klutz',
    'knapsack',
    'larynx',
    'lengths',
    'lucky',
    'luxury',
    'lymph',
    'marquis',
    'matrix',
    'megahertz',
    'microwave',
    'mnemonic',
    'mystify',
    'naphtha',
    'nightclub',
    'nowadays',
    'numbskull',
    'nymph',
    'onyx',
    'ovary',
    'oxidize',
    'oxygen',
    'pajama',
    'peekaboo',
    'phlegm',
    'pixel',
    'pizazz',
    'pneumonia',
    'polka',
    'pshaw',
    'psyche',
    'puppy',
    'puzzling',
    'quartz',
    'queue',
    'quips',
    'quixotic',
    'quiz',
    'quizzes',
    'quorum',
    'razzmatazz',
    'rhubarb',
    'rhythm',
    'rickshaw',
    'schnapps',
    'scratch',
    'shiv',
    'snazzy',
    'sphinx',
    'spritz',
    'squawk',
    'staff',
    'strength',
    'strengths',
    'stretch',
    'stronghold',
    'stymied',
    'subway',
    'swivel',
    'syndrome',
    'thriftless',
    'thumbscrew',
    'topaz',
    'transcript',
    'transgress',
    'transplant',
    'triphthong',
    'twelfth',
    'twelfths',
    'unknown',
    'unworthy',
    'unzip',
    'uptown',
    'vaporize',
    'vixen',
    'vodka',
    'voodoo',
    'vortex',
    'voyeurism',
    'walkway',
    'waltz',
    'wave',
    'wavy',
    'waxy',
    'wellspring',
    'wheezy',
    'whiskey',
    'whizzing',
    'whomever',
    'wimpy',
    'witchcraft',
    'wizard',
    'woozy',
    'wristwatch',
    'wyvern',
    'xylophone',
    'yachtsman',
    'yippee',
    'yoked',
    'youthful',
    'yummy',
    'zephyr',
    'zigzag',
    'zigzagging',
    'zilch',
    'zipper',
    'zodiac',
    'zombie',
]

```

We have created a Python list called `words_list` in the above code.

Now we have the main task left, i.e. writing the logic for the Hangman game. Create a `hangman.py` file and add the following code to it.

```python
import random
from hangman_art import stages, logo
from hangman_words import word_list

def hangman_game(chosen_word):
    end_of_game = False

    lives = len(stages) - 1

    guessed_letters = []
    for _ in range(len(chosen_word)):
        guessed_letters += "_"

    while not end_of_game:
        guess = input("Guess a letter: ").lower()

        if guess in guessed_letters:
            print(f"You've already guessed {guess}")

        for position in range(len(chosen_word)):
            letter = chosen_word[position]
            if letter == guess:
                guessed_letters[position] = letter
        print(f"{' '.join(guessed_letters)}")

        if guess not in chosen_word:
            print(f"You guessed {guess}, that's not in the word. You lose a life.")
            lives -= 1
            if lives == 0:
                end_of_game = True
                print("You lose.")
                print(f"The word was {chosen_word}.")

        if not "_" in guessed_letters:
            end_of_game = True
            print("You win.")

        print(stages[lives])

if __name__ == " __main__":
    print(logo)
    chosen_word = random.choice(word_list)
    print(f"It is a {len(chosen_word)}-letters word.")
    hangman_game(chosen_word)

```

At first, we have imported the **random** library from Python which will be required to select random words. Also, we have imported `stages` and `logo` from the `hangman_art.py` file and `words_list` from the `hangman_words.py` file respectively.

Let's look at the `hangman_game()` function now. This function accepts an argument `chosen_word`, i.e., the randomly selected word. Inside the function, we have a variable `end_of_game`that determines whether the game should continue or not. Next, we have a `lives` variable which has a value of`len(stages)-1`, i.e., 6. In the beginning, we show the users blanks(*) according to the length of the word chosen. We have a list called `guessed_letters` to store the letters guessed **correctly** by the user. Initially, it contains underscores(*) equal to the number of letters in the word. Gradually, these underscores will be replaced with the correct letters guessed by the player.

After that, we start a while loop till the `end_of_game`, and ask the user to make a guess. If the guess is already in the `guessed_letters` list, we do not reduce the life and ask the user to guess again. We run a for loop over the chosen word to see if the user has guessed a correct letter, we would make it visible and add it to the `guessed_letters` list on its correct index/indices. If the guessed letter is not in the chosen word, we reduce the `lives` variable by 1. At this instance, we also check if the `lives` is equal to 0, we set the `end_of_game` variable to True so that the game doesn't continue anymore. The user has lost the game and we tell the user the correct word. Also if no underscores(\_), i.e., blank spaces are left in the guessed\_letters, we set the `end_of_game` variable to True, but this time, the user has won the game. After each guess, we print the figure of our hangman.

In the main method, we first print the Hangman logo as we mentioned earlier. Next, we select a random word. We then tell the user the number of letters in the word that needs to be guessed. After that, we run the `hangman_game()` function and the game starts.

## Wrapping Up

In this blog, we've built the Hangman game using Python. Hope you found the tutorial helpful.
