Witch’s Potion: A Spooky Halloween Mini-Game Built with Python OOP

Hey there, fellow coders and Halloween lovers! 👻 As the nights get longer and the air gets crisp, I always feel the itch to build something fun, seasonal, and just a little bit spooky. Last night, while sipping pumpkin-spiced coffee and listening to a crackling fire sound effect on YouTube, I sat down and coded Witch’s Potion, a tiny text-based guessing game that captures the essence of Halloween in under 100 lines of clean, educational Python.

This isn’t just another “Hello World” project. It’s a real mini-game with OOP structure, dramatic timing, randomized secrets, and player interaction, all wrapped in a cauldron of Halloween atmosphere. And yes, I recorded a full demo video so you can see it in action before even running the code!

 

The Game: Your Mission as the Apprentice

You are the witch’s apprentice. The old hag has stepped out to terrorize the village, leaving behind her bubbling cauldron and a single instruction:

“Brew my secret potion using exactly three ingredients. Match my combination… or the cauldron will explode in your face!

Your Ingredients (Choose 3!):

  1. Eye of Newt 👁️
  2. Frog Leg 🐸
  3. Pumpkin Seed 🎃
  4. Bat Wing 🦇
  5. Ghost Dust 👻

You type your guess like: 1, 3, 5

Then… the magic happens.

The cauldron hisses.

Bubbles rise.

The air thickens with tension…

And then?

  • Success:

    You made the PERFECT potion! The witch is impressed!

    Confetti (in your imagination) explodes. You’re promoted to Head Apprentice!

  • Failure:

    The potion EXPLODES! Wrong mix!

    The secret was: Bat Wing, Ghost Dust, Frog Leg

    The witch returns… and turns you into a frog! 🐸

Every game is different, the witch’s combo is randomly generated each time.


The Code: A Deep Dive into the Magic (With OOP!)

I designed the game using three clean classes, each with a single responsibility. This is real-world OOP, not just theory.

1. Potion Class – The Brain Behind the Cauldron

class Potion:
    def __init__(self, ingredients):
        self.ingredients = ingredients
        self.secret_combo = random.sample(ingredients, 3)  # Pure randomness!
  • Stores all possible ingredients
  • Picks 3 unique items as the secret combo using random.sample()
  • No duplicates, no mercy

2. Apprentice Class – That’s You

class Apprentice:
    def choose_ingredients(self, ingredients):
        # Show numbered menu
        for i, item in enumerate(ingredients, 1):
            print(f"  {i}. {item}")

        choice = input("\nYour choice: ").split(",")

        try:
            return [ingredients[int(i.strip()) - 1] for i in choice]
        except:
            print("Invalid! The spirits choose for you...")
            return random.sample(ingredients, 3)
  • Handles player input
  • Validates choices (with try/except)
  • If you mess up? The game doesn’t crash, it picks for you! (Beginner-friendly UX)

3. Game Class – The Director of the Show

def slow_print(self, text, delay=0.05):
    for char in text:
        print(char, end='', flush=True)
        time.sleep(delay)
    print()
  • Slow-printing for suspense ("B...u...b...b...l...i...n...g...")
  • ASCII art banners
  • Timing with time.sleep()
  • Final explosion or victory message

Watch the Full Gameplay Demo! 🎥

I recorded a complete playthrough so you can see the drama unfold in real time. Watch how the tension builds, how the input works, and what happens when you guess wrong (or right!).

Pro move: Run the game yourself after watching, try to beat it on the first try!


What You’ll Learn by Building (or Modding) This

This isn’t just a game, it’s a mini OOP masterclass:

Concept How It’s Used
Classes & Objects Potion, Apprentice, Game — each does one thing
Methods choose_ingredients(), slow_print()
Error Handling try/except prevents crashes
Randomness random.sample() for replayability
User Experience Slow text, pauses, feedback
Code Structure Clean, readable, extensible

Final Thoughts: Why Mini-Games Matter

Witch’s Potion isn’t going to win Game of the Year… but it won my night.

It reminded me why I code:

  • To create
  • To laugh
  • To learn in public

And the best part? You can build this too. In fact, I dare you to fork it, change the theme (Christmas Elf? Space Brew?), and share it.


Built with Python 3, love, and a little midnight magic.

Play it. Break it. Remix it.


Watch the DemoYouTube

Follow for more spooky code@Shahrouzlogs on Twitter

GitHub RepositoryWitch Potion

更多