Here's a Python program for a text-based Hangman game:

Python
import random

# List of words to choose from
WORDS = ["python", "programming", "computer", "hangman", "challenge"]

# Hangman figure stages based on incorrect guesses
HANGMAN_PICS = [
  """
  +---+
  |   |
      |
      |
      |
      |
=========""",
  """
  +---+
  |   |
  O   |
      |
      |
      |
=========""",
  """
  +---+
  |   |
  O   |
  |   |
      |
      |
=========""",
  """
  +---+
  |   |
  O   |
 /|   |
      |
      |
=========""",
  """
  +---+
  |   |
  O   |
 /|\  |
      |
      |
=========""",
  """
  +---+
  |   |
  O   |
 /|\  |
  |   |
      |
=========""",
  """
  +---+
  |   |
  O   |
 /|\  |
  |   |
 /    |
========="""
]

def choose_word():
  """
  This function randomly chooses a word from the WORDS list.
  """
  return random.choice(WORDS).upper()

def display_board(guessed_letters, word):
  """
  This function displays the current game board with the guessed letters filled in and remaining placeholders.
  """
  # Create a display word with placeholders for unguessed letters
  display_word = []
  for letter in word:
    if letter in guessed_letters:
      display_word.append(letter)
    else:
      display_word.append("_")
  print(" ".join(display_word))

def get_guess(already_guessed):
  """
  This function prompts the user for a guess, validates it, and ensures it's not already guessed.
  """
  while True:
    guess = input("Guess a letter: ").upper()
    if len(guess) != 1 or not guess.isalpha():
      print("Invalid guess. Please enter a single letter.")
    elif guess in already_guessed:
      print("You already guessed that letter. Try again.")
    else:
      return guess

def play_game():
  """
  This function manages the main game loop.
  """
  # Choose a random word
  word = choose_word()

  # Initialize variables
  guessed_letters = set()
  wrong_guesses = 0

  print("Welcome to Hangman!")
  print(HANGMAN_PICS[0])

  # Game loop
  while True:
    display_board(guessed_letters, word)

    if len(set(word)) == len(guessed_letters):  # Check if all letters are guessed
      print("Congratulations! You guessed the word:", word)
      break
    elif wrong_guesses == len(HANGMAN_PICS) - 1:  # Check if hangman is complete
      print(HANGMAN_PICS[wrong_guesses])
      print("You ran out of guesses! The word was:", word)
      break

    # Get user guess
    guess = get_guess(guessed_letters)
    guessed_letters.add(guess)

    # Check if guess is correct
    if guess in word:
      pass  # Do nothing if the guess is correct (already handled in display)
    else:
      wrong_guesses += 1
      print(HANGMAN_PICS[wrong_guesses])

  # Play again prompt
  while True:
    play_again = input("Play again? (y/n): ").lower()
    if play_again in ("y", "n"):
      break
    else:
      print("Invalid choice. Please enter y or n.")
  if play_again == "y":
    play_game()

if __name__ == "__main__":
  play_game()