w3resource

Python Project: Hangman Game - Solutions and Explanations


Hangman Game:

Build a hangman game where players guess a word by suggesting letters. The game continues until the player correctly guesses the word or runs out of attempts.

Input values:
Player suggests a letter to guess the word.

Output value:
Feedback on whether the guessed letter is correct or incorrect. With revealed letters, display the current state of the word.

Example:

Input values:
Guess a letter: A
Output value:
Incorrect! Current state: _
Input values:
Guess a letter: E
Output value:
Correct! Current state: E 
Input values:
Guess a letter: S
Output value:
Incorrect! Current state: E 
Input values:
Guess a letter: R
Output value:
Correct! Current state: E R _ 

Here are two different solutions for a "Hangman" game in Python. The game allows players to guess a word by suggesting letters. The game continues until the player either correctly guesses the word or runs out of attempts.

Solution 1: Basic Approach using Functions and Loops

Code:

# Solution 1: Basic Approach Using Functions and Loops

import random  # Import the random module to select a random word

# List of words for the Hangman game
word_list = ['python', 'hangman', 'programming', 'developer', 'algorithm']

def choose_word(word_list):
    """Randomly select a word from the word list."""
    return random.choice(word_list)

def display_current_state(word, guessed_letters):
    """Display the current state of the guessed word with correct letters revealed."""
    current_state = ''.join([letter if letter in guessed_letters else '_' for letter in word])
    return current_state

def hangman():
    """Main function to play the Hangman game."""
    # Choose a random word for the player to guess
    word_to_guess = choose_word(word_list)
    guessed_letters = set()  # Set to store guessed letters
    attempts_left = 6  # Number of attempts allowed

    print("Welcome to Hangman!")
    print("Try to guess the word!")

    # Game loop
    while attempts_left > 0:
        # Display the current state of the word
        current_state = display_current_state(word_to_guess, guessed_letters)
        print(f"Current state: {current_state}")
        
        # Check if the player has guessed the entire word
        if '_' not in current_state:
            print("Congratulations! You've guessed the word!")
            break

        # Get the player's guess
        guess = input("Guess a letter: ").lower()

        # Validate the player's guess
        if len(guess) != 1 or not guess.isalpha():
            print("Invalid input. Please enter a single letter.")
            continue

        # Check if the letter was already guessed
        if guess in guessed_letters:
            print("You've already guessed that letter. Try again.")
            continue

        # Add the guessed letter to the set of guessed letters
        guessed_letters.add(guess)

        # Check if the guessed letter is in the word
        if guess in word_to_guess:
            print("Correct!")
        else:
            print("Incorrect!")
            attempts_left -= 1
            print(f"Attempts left: {attempts_left}")

    # If the player runs out of attempts
    if attempts_left == 0:
        print(f"Sorry, you've run out of attempts. The word was '{word_to_guess}'.")

# Start the Hangman game
hangman()

Output:

Welcome to Hangman!
Try to guess the word!
Current state: _________
Guess a letter: D
Incorrect!
Attempts left: 5
Current state: _________
Guess a letter: E
Incorrect!
Attempts left: 4
Current state: _________
Guess a letter: P
Incorrect!
Attempts left: 3
Current state: _________
Guess a letter: Q
Incorrect!
Attempts left: 2
Current state: _________
Guess a letter: S
Incorrect!
Attempts left: 1
Current state: _________
Guess a letter: A
Correct!
Current state: a________
Guess a letter: C
Incorrect!
Attempts left: 0
Sorry, you've run out of attempts. The word was 'algorithm'.

Explanation:

  • This solution uses basic functions and loops to implement the Hangman game.
  • The 'choose_word()' function selects a random word from the list.
  • The 'display_current_state()' function shows the current state of the word, revealing the correct guessed letters.
  • The main 'hangman()' function handles the game logic, including user input, validation, checking for guessed letters, and updating attempts.
  • This approach is simple and effective but lacks structure for future expansions or enhancements.

Solution 2: Using a Class-Based approach for Organization and Reusability

Code:

# Solution 2: Using a Class-Based Approach for Organization and Reusability

import random  # Import the random module to select a random word

class HangmanGame:
    """Class to handle the Hangman game logic"""

    def __init__(self, word_list):
        """Initialize the game with a list of words and default values"""
        self.word_list = word_list
        self.word_to_guess = random.choice(word_list)
        self.guessed_letters = set()
        self.attempts_left = 6

    def display_current_state(self):
        """Display the current state of the guessed word with correct letters revealed"""
        return ''.join([letter if letter in self.guessed_letters else '_' for letter in self.word_to_guess])

    def make_guess(self, guess):
        """Process the player's guess and update game state"""
        # Add the guessed letter to the set of guessed letters
        self.guessed_letters.add(guess)

        # Check if the guessed letter is in the word
        if guess in self.word_to_guess:
            print("Correct!")
        else:
            print("Incorrect!")
            self.attempts_left -= 1
            print(f"Attempts left: {self.attempts_left}")

    def play(self):
        """Main function to play the Hangman game"""
        print("Welcome to Hangman!")
        print("Try to guess the word!")

        # Game loop
        while self.attempts_left > 0:
            # Display the current state of the word
            current_state = self.display_current_state()
            print(f"Current state: {current_state}")
            
            # Check if the player has guessed the entire word
            if '_' not in current_state:
                print("Congratulations! You've guessed the word!")
                break

            # Get the player's guess
            guess = input("Guess a letter: ").lower()

            # Validate the player's guess
            if len(guess) != 1 or not guess.isalpha():
                print("Invalid input. Please enter a single letter.")
                continue

            # Check if the letter was already guessed
            if guess in self.guessed_letters:
                print("You've already guessed that letter. Try again.")
                continue

            # Make the guess and update the game state
            self.make_guess(guess)

        # If the player runs out of attempts
        if self.attempts_left == 0:
            print(f"Sorry, you've run out of attempts. The word was '{self.word_to_guess}'.")

# List of words for the Hangman game
word_list = ['python', 'hangman', 'programming', 'developer', 'algorithm']

# Create an instance of the HangmanGame class
game = HangmanGame(word_list)

# Start the Hangman game
game.play()

Output:

Welcome to Hangman!
Try to guess the word!
Current state: ______
Guess a letter: p
Correct!
Current state: p_____
Guess a letter: y
Correct!
Current state: py____
Guess a letter: t
Correct!
Current state: pyt___
Guess a letter: h
Correct!
Current state: pyth__
Guess a letter: o
Correct!
Current state: pytho_
Guess a letter: n
Correct!
Current state: python
Congratulations! You've guessed the word!
Welcome to Hangman!
Try to guess the word!
Current state: _________
Guess a letter: v
Correct!
Current state: __v______
Guess a letter: d
Correct!
Current state: d_v______
Guess a letter: e
Correct!
Current state: deve___e_
Guess a letter: l
Correct!
Current state: devel__e_
Guess a letter: r
Correct!
Current state: devel__er
Guess a letter: o
Correct!
Current state: develo_er
Guess a letter: p
Correct!
Current state: developer
Congratulations! You've guessed the word!

Explanation:

  • This solution encapsulates all game logic within a 'HangmanGame' class, which is more organized and modular.
  • The '__init__' method initializes the game state (word to guess, guessed letters, attempts left).
  • The 'display_current_state()' method shows the current state of the word.
  • The 'make_guess()' method processes each guess and updates the game state.
  • The 'play()' method controls the game flow, taking user input and managing game progression.
  • This approach follows Object-Oriented Programming (OOP) principles, making the code easier to extend, maintain, and reuse.

Note:
Both solutions achieve the goal of implementing a basic Hangman game where players guess a word by suggesting letters, with Solution 1 using a straightforward function-based approach and Solution 2 utilizing a more organized, class-based design.



Follow us on Facebook and Twitter for latest update.