Comment créer une interface graphique simple pour mon jeu

AO._17 Messages postés 4 Date d'inscription dimanche 10 mars 2024 Statut Membre Dernière intervention 10 mars 2024 - 10 mars 2024 à 15:58
AO._17 Messages postés 4 Date d'inscription dimanche 10 mars 2024 Statut Membre Dernière intervention 10 mars 2024 - 10 mars 2024 à 22:33

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

A voir également:

6 réponses

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
yg_be Messages postés 22804 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 22 mai 2024 1 469
10 mars 2024 à 17:34

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
AO._17 Messages postés 4 Date d'inscription dimanche 10 mars 2024 Statut Membre Dernière intervention 10 mars 2024
10 mars 2024 à 17:59

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

0

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

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

Posez votre question
AO._17 Messages postés 4 Date d'inscription dimanche 10 mars 2024 Statut Membre Dernière intervention 10 mars 2024
10 mars 2024 à 20:32

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
AO._17 Messages postés 4 Date d'inscription dimanche 10 mars 2024 Statut Membre Dernière intervention 10 mars 2024
10 mars 2024 à 22:33

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

0