🎮 Bagels – A Logic Game in Python

Hey everyone! Today, I’m sharing a fun little Python project: Bagels, a deductive logic game. 🧠💡

The goal? Guess a secret 3-digit number within 10 attempts.

But instead of getting direct hints, you receive clues to help you figure out the correct number:

🟢 Game Rules:

  • Fermi → A digit is correct and in the right place
  • Pico → A digit is correct but in the wrong place 🔄
  • Bagels → No correct digits ❌

Example:

If the secret number is "123" and you enter "132", you’ll see:

Fermi Pico Pico (1 is correct and in the right place, while 3 and 2 are correct but misplaced).


🚀 Source Code

Here’s the full implementation in Python:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
    Nom du fichier : bagels.py
    Description : Un jeu de déduction logique pour
    deviner un nombre secret à trois chiffres.
    Vous avez 10 chances pour deviner le nombre.
    - Pico -> Un chiffre correct, mauvaise position.
    - Fermi -> Un chiffre correct, bonne position.
    - Bagels -> Aucun chiffre correct.

    Auteur : ADEBI Ayedoun Châ-Fine [email protected]
    Date : 03/16/2025
"""

import random

# Constante
GUESSES = 10  # NOMBRE DE CHANCES
DIGIT_LEN = 3  # NOMBRE DE CHIFFRES DU NOMBRE
MENU = """
    Bagels, a deductive logic game.
    By ADEBI Ayedoun Châ-Fine [email protected]

    Je suis en train de penser à un nombre à 3 chiffres.
    Essais de deviner lequel.
    Voici quelques indices :
    Quand je dis:       Voici ce à quoi je pense:
        Pico            Un chiffre est correct mais à la mauvaise position
        Fermi           Un chiffre est correct et à la bonne position
        Bagels          Aucun des chiffres n'est correct
    Vous avez 10 essais :
"""


def generer_nombre_secret():
    """ Générer un nombre secret unique à trois chiffres
    sous forme de liste.
    """
    chiffres = list(range(1, 10))
    random.shuffle(chiffres)
    return [str(chiffres[i]) for i in range(DIGIT_LEN)]


def obtenir_indices(input_list, guess_number):
    """Comparer l'entrée utilisateur avec le nombre secret
    et retourne des indices.
    """
    result = []
    for i in range(len(input_list)):
        if input_list[i] == guess_number[i]:
            result.append("Fermi")
        elif input_list[i] in guess_number:
            result.append("Pico")
    return " ".join(result) if result else "Bagels"


def valide_saisie():
    """Gère l'entrée utilisateur, l'utilisateur doit entrer
    un nombre à trois chiffres"""
    while True:
        saisie = input("> ").strip()
        if len(saisie) == DIGIT_LEN and saisie.isdigit():
            return list(saisie)
        print("Entrée invalide, vous devez entrer un nombre à trois chiffres")


def main():
    """Boucle principale du jeu"""
    rejouer = ""
    while True:
        guess_number = generer_nombre_secret()
        for i in range(GUESSES):
            print("Devine #", i+1)
            input_nbre = valide_saisie()
            if input_nbre == guess_number:
                print("Vous l'avez trouvé")
                break
            else:
                print(obtenir_indices(input_nbre, guess_number))
        else:
            print("Game Over!")
        print("Voulez-vous encore jouer ?? (oui ou non)")
        while True:
            rejouer = input("> ").strip().lower()
            if rejouer in ["oui", "non"]:
                break
            else:
                print("Vous devez répondre par 'oui' ou 'non' ")
        if rejouer == "non":
            print("Merci d'avoir joué")
            break


if __name__ == "__main__":
    print(MENU)
    main()

🔍 Code Breakdown

  • The program generates a random 3-digit secret number.
  • The user enters a guess and receives a clue in return.
  • The game loops for up to 10 attempts or until the player finds the correct number.
  • At the end, the player can choose to replay or exit the game.

📌 How Can We Improve It?

I have a few ideas, but I’d love to hear your suggestions!

For example:

  • Add a hard mode where the secret number has no repeated digits.
  • Create a graphical version using Tkinter or Pygame.
  • Implement a multiplayer mode, where Player 1 sets a number and Player 2 tries to guess it.

What do you think? Any other improvements you'd suggest? 🚀

💬 Let me know in the comments if you tried the game or have any optimizations to propose!


📌 Follow me for more Python and development content!

👉 [Dev.to / GitHub / Twitter Profile]