Comment créer une interface graphique simple pour mon jeu

AO._17 Messages postés 4 Statut Membre -  
AO._17 Messages postés 4 Statut Membre -

Bonjour,

En gros j'ai besoin de faire une petite interface graphique simple et efficace pour mon jeu "Bulls and Cows" (vous pouvez chercher le but du jeu mais en gros il faut essayer de trouver un code qui est une suite de 4 chiffres tous différents et à chaque coup on vous dit combien de nombres sont à la bonne place : les bulls et combien sont à la mauvaise place : les cows) mais je sais pas trop comment m'y prendre. J'ai regardé des vidéos mais c'est pas assez claire pour ce que je veux faire. Voici le code du jeu :

from math import *
from random import *
from tkinter import *


window = Tk()

window.title("Bulls and Cows")

#window.geometry("500x800")

window.minsize(500, 800)

window.maxsize(500, 800)

label_title = Label (window, text = "BIENVENUE DANS LE JEU BULLS AND COWS !")
label_title.pack()



window.mainloop()




def genere_secret():
    """
    none ---> str
    La fonction genere_secret permet de générer les codes secrets valides
    """
    liste = sample(range(10),4) # tire 4 chiffres différents au hasard parmi {0,...,9}
    secret ="".join([str(n) for n in liste])    # transforme la liste en texte
    return secret



# Exercice 7


def valide_code(code):
    """
    str ---> bool
    La fonction valide_code(code) qui renvoie un booléén indiquant si code est valide
    """
    # On vérifie la longueur
    if len(code) != 4:
        return False
    # On parcourt les symboles
    for i in range(4):
        # On compare le chiffre avec les suivants
        for j in range(i+1, 4):
            if code[i] == code[j]:
                return False
        # On vérifie que c'est un chiffre
        if code[i] not in "0123456789":
            return False
    return True



# Exercice 8


def demande():
    """
    str ---> str
    La fonction demande() demande à l'utilisateur de donner un code, tant que celui-ci n'est pas valide et renvoie en sortie le code valide obtenu
    """
    code = ""
    while not valide_code(code) == True:
        code = input("Entrer un code valide : ")
    return code



# Exercice 9


def tentative(code, secret):
    """
    str, str ---> int, int
    La fonction tentative(code,secret) prend un code et le secret en entrée et renvoie le nombre de chiffres bien placés (bulls) et mal placés (cows)
    """
    bulls = 0
    cows = 0
    for i in range(4):
        if code[i] == secret[i]:
            bulls += 1
        elif secret[i] in code:
            cows += 1
    return bulls, cows



# Exercice 10


def affichage(codes, secret):
    """
    list, str ---> str
    La fonction affichage(codes, secret) prend une liste de codes et le secret, et affiche les résultats pour chacun des codes
    """
    for i in range(len(codes)):
        bulls, cows = tentative(codes[i], secret)
        print(f"{i+1}) {codes[i]} {bulls}B {cows}C")



# Exercice 11


def partie():
    """
    none ---> str
    La fonction partie() permet à l'utilisateur d'essayer de deviner le code secret choisit par l'ordinateur et lui affiche s'il trouve le code secret le nombre de coups nécessairres
    """
    # On génère un secret
    secret = genere_secret()
    #print(secret)
    n = 0
    code = ""
    codes = []
    # On continue jusqu'à ce que le secret soit trouvé
    while code != secret:
        # On demande un code à l'utilisateur
        n += 1
        if n > 5 : # Si le nombre de tentative est atteind, on sort de la boucle while
            break
        code = demande()
        codes.append(code)
        affichage(codes, secret)
    if n > 5 : # Si les 5 tentatives sont épuisées, affiche le message de défaite
        print("Vous n'avez plus de tentative ! Vous avez perdu ! Le code secret était",secret)
    else : # Sinon, affiche le message de victoire
        print(f"Bravo, vous avez trouvé en {n} tentative(s).")

Les programmes du jeu sont très simples mais j'aimerais juste que le jeu soit sous forme d'une interface graphique (avec tkinter). Quelque chose comme ça à peu près :

Je souhaite donc que ça soit sous cette forme. Nous avons donc un input où nous insérons notre code valide. Puis on a un nombre de tentatives (dans mon jeu il est limité à 5 tentatives). Et ensuite en bas nous avons notre code que nous avons tapé avec le nombre de bulls et de cows. Si le joueur trouve le nombre, on lui affiche le message de fin en lui disant en combien de tentatives il a trouvé sinon on dit qu'il a perdu. Et bien évidemment un bouton nouvelle partie pour rejouer. Le jeu est assez simple et tout est compréhensible dans mon programme. Donc si quelqu'un pourrait m'aider pour mon interface, sa ferait plaisir.


Windows / Chrome 122.0.0.0

6 réponses

  1. douco
     

    Bonsoir.

    Un truc simple que tu devrais comprendre et pouvoir compléter.

    # On garde les modules dans leurs boites (namespace)
    import random
    import tkinter as tk
    from tkinter import font as tkfont
    
    
    def generate_secret(size):
        """
        int ---> str
        La fonction genere_secret permet de générer les codes secrets valides
        """
        # Bien plus simple et ainsi pas besoin de transtyper
        return ''.join(random.sample('0123456789', size))
         # tire 4 chiffres différents au hasard parmi {0,...,9}
        # liste = random.sample(range(10), 4)
        # transforme la liste en texte
        # secret = "".join([str(n) for n in liste])
        # return secret
    
    
    def validate_code(value):
        # Fonction autorisant la saisie d'un car.
        # dans l'entry, value (%P) représente la
        # valeur de l'entry + dernier car. saisi
        button_code['state'] = tk.DISABLED
        if not value:
            return True
        if not value.isdigit():
            return False
        length = len(value)
        if length == 1:
            return True
        if length == 5:
            # On ne valide pas le car. mais activation
            # du bouton, car la valeur est toujours correcte
            button_code['state'] = tk.ACTIVE
            return False
        if length <= 4 and len(set(value)) == length:
            if length == 4:
                button_code['state'] = tk.ACTIVE
            return True
        return False
    
    
    def play():
        # démarrage partie
        game['secret_code'] = generate_secret(4)
        insert_text('coucou')
        insert_text('coucou')
        insert_text('coucou')
    
    
    def replay():
        text_result['state'] = tk.NORMAL
        text_result.delete(1.0, tk.END) # Clear text
        text_result['state'] = tk.DISABLED
        button_replay['state'] = tk.DISABLED
        game['current_try'] = 0
        play()
    
    
    def entry_process():
        # C'est ici que tout se passe
        # traitement de la valeur saisie à faire
        # Nul besoin de la contrôler puisque déjà
        # fait en amont
        print(entry_code.get()) # str
        print(game['secret_code'])
        entry_code.delete(0, tk.END) # clear
    
    
    def insert_text(value, value_sep='\n' * 3):
        text_result['state'] = tk.NORMAL
        text_result.insert(tk.END, f'{value}{value_sep}')
        text_result['state'] = tk.DISABLED
    
    
    window = tk.Tk()
    
    FONTS = dict(
        title=tkfont.Font(family='serif', size=14, weight='bold'),
        text=tkfont.Font(family='serif', size=12),
    )
    
    # Si besoin d'autres valeurs au jeu
    # les stocker dans game
    game = dict(
        secret_code='',
        try_max=5,
        current_try=0,
    )
    
    window.title('Bulls and Cows')
    window.resizable(False, False)
    
    window.columnconfigure(0, weight=1)
    window.columnconfigure(1, weight=1)
    window.columnconfigure(2, weight=1)
    
    label_title = tk.Label(
        window, text="BIENVENUE DANS LE JEU BULLS AND COWS !",
        font=FONTS['title'],
    )
    label_title.grid(
        row=0, column=0, columnspan=3, sticky=tk.EW, pady=(15, 10),
    )
    
    label_code = tk.Label(window, text='Entrez un code valide',)
    label_code.grid(row=1, column=0, sticky=tk.E, pady=5,)
    
    check_code = window.register(validate_code)
    entry_code = tk.Entry(
        window, validate='key',
        # %P représente la valeur de l'entry + car. saisi
        validatecommand=(check_code, '%P'),
    )
    entry_code.grid(row=1, column=1, sticky=tk.EW, padx=5, pady=5,)
    
    button_code = tk.Button(
        window, text='OK', state=tk.DISABLED,
        command=entry_process,
        font=FONTS['text'],
    )
    button_code.grid(row=1, column=2, sticky=tk.W, pady=5,)
    
    label_tentatives = tk.Label(
        window, text='tentatives :',
        font=FONTS['text'],
    )
    label_tentatives.grid(
        row=2, column=0, sticky=tk.E, padx=(0, 5), pady=5,
    )
    
    # C'est le texte de ce label qui sera à changer
    # pour indiquer le nombre de tentatives
    label_tentatives_count = tk.Label(window, text='0', font=FONTS['text'],)
    label_tentatives_count.grid(row=2, column=1, sticky=tk.W, pady=5)
    
    text_result = tk.Text(
        window, highlightthickness=0, takefocus=False,
        state=tk.DISABLED, bg='white', fg='black',
        font=FONTS['text'], height=(game['try_max'] + 1) * 3,
    )
    text_result.grid(row=3, column=0, columnspan=3, padx=10, pady=5)
    
    
    label_result = tk.Label(
        window, height=3, text='résultat partie ici',
        font=FONTS['text']
    )
    label_result.grid(row=4, column=0, columnspan=3, padx=5, pady=5)
    
    button_replay = tk.Button(
        window, text='Nouvelle partie',
        command=replay, state=tk.DISABLED,
        font=FONTS['text'],
    )
    button_replay.grid(row=5, column=0, columnspan=3, pady=(5, 25),)
    
    play()
    
    window.mainloop()

    Tout est réalisé et indiqué dans le code pour que tu puisses insérer dans les widgets tkinter dédiés tes valeurs..

    Bonne continuation.

    1
  2. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     

    bonjour, je pense que tkinter est le bon choix pour faire cela.

    Ce n'est cependant pas évident pour un débutant, il te faudra un peu de temps et d'énergie pour te former.

    0
  3. AO._17 Messages postés 4 Statut Membre
     

    mais est-ce que tu as une idée sur comment le faire, car je dois faire ça avant demain 

    0
  4. Phil_1857
     

    Bonjour,

    Avant demain .... ça fait court quand même ... trop court

    Ca ressemble un peu au Mastermind:

    4 couleurs

    tant de bien placées, tant de mal placées, et tant qui n'y sont pas

    Dans le temps, j'avais fait ça en 100 lignes avec Tkinter:

    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. AO._17 Messages postés 4 Statut Membre
     

    oui justement le Mastermind est l'ancêtre du "Bulls and Cows" mais avec des chiffres. mais j'aarive pas à coder ce que je veux. Je suis bloqué depuis des heures. Je veux juste quelque chose comme mon modèle, un truc simple.

    0
  7. AO._17 Messages postés 4 Statut Membre
     

    Merci énormément pour ton aide, c'est vraiment gentil de ta part !

    0