Bibm@th

Forum de mathématiques - Bibm@th.net

Bienvenue dans les forums du site BibM@th, des forums où on dit Bonjour (Bonsoir), Merci, S'il vous plaît...

Vous n'êtes pas identifié(e).

#1 21-07-2015 11:39:38

Terces
Membre
Inscription : 16-07-2015
Messages : 466

Petit jeu divertissant.

Bonjour,
je ne sais pas si vous connaissez le jeu du Mastermind, j'en ai fait une version numérique (qui évite notamment la perte des petites multicolores^^), c'est un programme que j'ai fait il y a pas mal de temps mais c'est vraiment un jeu que je trouve intéressant, j'y ai rajouté un compteur de temps mais bon, c'est un jeu de réflexion avant tout pas de rapidité. J'espère qu'il fonctionnera chez vous et qu'il vous plaira:
-------------------------------------------------------------------------------------------------------------------------------------

from random import*
import time
print("Trouvez la combinaison Newmastermind comprise entre 9999 et 1111 en moins de 12 essais(tapez \"ESSAI\" pr connaitre le nombre d'essais que vous avez deja efectué)  Bonne chance!\n ")
while 1:
    c1=randint(1,9)
    c1=int(c1)
    c2=randint(1,9)
    c2=int(c2)
    c3=randint(1,9)
    c3=int(c3)
    c4=randint(1,9)
    c4=int(c4)
    essai=0
    temps=False
    while 1:
        essai+=1
        pc=0
        pcccc=0
        prop=input("alors quelle combinaison proposez vous? ")
        while not temps:
            temps_debut=time.time()
            temps=True
        if prop.upper()=="ABANDON":
            print("La combinaison était ",c1,c2,c3,c4," !")
            break
        if prop.upper()=="ESSAI":
            essai-=1
            print("vous avez effectué ",essai,"/12 essai(s)")
            continue
        try:
            prop=int(prop)
        except ValueError:
            print("Vous n'avez pas saisi un nombre entier, cet essai ne sera donc pas compté, cependant le temps s'ecoule!")
            essai-=1
            continue
        if 1111>prop:
            print("Vous avez saisi un nombre trop petit, cet essai ne sera donc pas compté, cependant le temps s'ecoule!")
            essai-=1
            continue
        if 9999<prop:
            print("Vous avez saisi un nombre trop grand, cet essai ne sera donc pas compté, cependant le temps s'ecoule!")
            essai-=1
            continue
           
        p1=prop-prop%1000
        p2=prop-p1-prop%100
        p3=prop-p1-p2-prop%10
        p4=prop-p1-p2-p3
        p1/=1000
        p2/=100
        p3/=10
        p1=int(p1)
        p2=int(p2)
        p3=int(p3)
        if p1==c1 :
            pc+=1
        if p2==c2 :
            pc+=1
        if p3==c3 :
            pc+=1
        if p4==c4 :
            pc+=1
        if p1==c1 or p1==c2 or p1==c3 or p1==c4:
            pcccc+=1
        if p2==c1 or p2==c2 or p2==c3 or p2==c4:
            pcccc+=1
        if p3==c1 or p3==c2 or p3==c3 or p3==c4:
            pcccc+=1
        if p4==c1 or p4==c2 or p4==c3 or p4==c4:
            pcccc+=1
        print("Vous avez ",pcccc,"chifre(s) appartenant a la combinaison et",pc,"bien placé(s)\n")
        if p1==c1 and p2==c2 and p3==c3 and p4==c4:
            temps_sec=time.time()-temps_debut
            temps_min=int(temps_sec//60)
            temps_sec=((temps_sec-temps_min*60)//0.1)/10
            print("bravo, vous avez trouvé la combinaison en ",essai," essai(s) et en ",temps_min,"min",temps_sec,"sec\nFélicitation!")
            break
        if essai==12:
            print("désolé, vs n'avez pas réussi a trouver la combinaison en moins de 12 essais. La combinaison était ",c1,c2,c3,c4,"!")
            break
    while 1:
        rejouer=input("\n\nVoulez-vous rejouer? ")
        try:
            rejouer=str(rejouer)
        except ValueError:
            print("vous n'avez pas saisi une réponse attendue, c'est a dire \"oui\" ou \"non\"!")
            continue
        if rejouer.lower()!= "oui" and rejouer.lower()!= "non":
            print("vous n'avez pas saisi une réponse attendue, c'est a dire \"oui\" ou \"non\"!")
            continue
        break
    if rejouer.lower()=="non":
        exit()
    if rejouer.lower()=="oui":
        continue

-------------------------------------------------------------------------------------------------------------------------------------
Voila, Voila, cordialement.

PS: mon meilleur score: 3 essais(gros cou de chance^^)   ma moyenne: 6

Dernière modification par Terces (21-07-2015 11:40:27)


La somme des inverses de la suite de Sylvester converge vers 1 plus vite que toute autre série somme infinie d'inverses d'entiers convergeant vers 1.

Hors ligne

#2 22-07-2015 16:14:43

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 989

Re : Petit jeu divertissant.

Re;

J'avais toujours eu envie de le faire, sans jamais passer à l'acte.

Maintenant, c'est fait (et perfectible !)
Je vais en faire (ou essayer de) une version graphique, mais là, cela demandera un peu plus de temps...
Je sais, ça existe déjà dans le commerce, mais j'aime bieb réinventer - périodiquement - la roue ! ^_^

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

from random import randint


def presente (Coul_Fr):
    print(" "*30+"*"*14)
    print (" "*30+"*"+" "*12+"*")
    print (" "*30+"* MasterMind *")
    print (" "*30+"*"+" "*12+"*")
    print(" "*30+"*"*14)
    print("\n\n\n"+"--> Couleurs disponibles :")
    print ("        ",end="")
    for co in Coul_Fr:
        print (co[0]+"("+co[1:]+") ",end="")  
    print("\n--> True indiquera une couleur bien placée et False mal placée,.")
    print("--> Il pourra y avoir plusieurs fois la même couleur,")
    print("--> Vous avez droit à 12 essais.")
    print("\n")
   
def erreur():
    print (" "*40+"Erreur, veuillez recommencer...")
   
def affiche(C):
    for l in C:
        print (l," ",end="")
           
def recommencer():
    print("      Voulez-vous commencer une autre partie (O/N) ",end="")
    encore=input().upper()
    if len(encore)!=1 and encore not in "ON":
        print ("Erreur, réponse par O, o, N ou n attendue...")
        recommencer()
    return encore

def choix_combi(Cl):
    ok=0
    while 1:
        c=""
        print (" "*40+"Votre combinaison (en 4 lettres) : ", end="")
        c=input().upper()      
        if len(c)!=4:
            erreur()
        else:
            for cc in c:
                if cc not in Cl:
                    erreur()
                else:
                    ok+=1
            if ok==4:
                affiche(c)
                print (" .....  ",end="")
                break
    return c

   
# Couleurs=['blue', 'brown',  'orange', 'purple',  'red','silver','teal', 'yellow']
Coul_Fr=["Bleu","Marron","Orange","Pourpre","Rouge","Argent","Vert","Jaune"]
Init_coul_fr=["B","M","O","P","R","A","V","J"]
presente(Coul_Fr)
code=[]
fin_essai=12
while 1:
    essai,gain,fin,Rep=0,0,0,[]
    while 1:
        for coul in range(4): # tirage du code
            code.append(Init_coul_fr[randint(0,7)])      
        for essai in range(1,fin_essai+1):
            combi=choix_combi(Init_coul_fr)   # Proposition du joueur
            Rep=list(combi.upper())    # Tranformation de la chaîne en liste
            if Rep==code:
                print (" Gagné ! En",essai,"essai"+"s"*(essai>1)+".\n")
                gain=1
                break
            else:
                Verif=[]
                for i,lt in enumerate(Rep):
                    if lt in code:   # Teste si la couleur est dans le code
                        if i==code.index(lt): # Si oui, est-elle bien placée ?
                            Verif.append(True)
                        else:
                            Verif.append(False)
                if Verif!=[]:
                        Verif=sorted(Verif,reverse=True) # Tri par ordre décroissant
                        affiche(Verif)
                        print("\n")
        break
       
    if gain==0:
        print ("\n  Désolé, vous avez perdu ! La réponse était : ",end="" )
        affiche(code)
        print("\n")
    Rec=recommencer().upper()
    if Rec=="N":
        print ("\n\n              Salut ! A la prochaine !")
        break

@+


Arx Tarpeia Capitoli proxima...

En ligne

#3 22-07-2015 17:00:05

Terces
Membre
Inscription : 16-07-2015
Messages : 466

Re : Petit jeu divertissant.

Salut,
j'ai voulu testé ton programme, et je crois pour le moment qu'il y a une lègère confusion, regarde un extrait de ma "partie" :

                                        Votre combinaison (en 4 lettres) : pmpp
P  M  P  P   .....  True  True  False  False 


  Désolé, vous avez perdu ! La réponse était : P  M  P  M 


Le règlement dit:
"True indiquera une couleur bien placée et False mal placée"
alors pourquoi je n'ai pas eu 3 "True" ? Enfin en même temps il y avait que 2 couleurs d'où les deux "true" mais ca porte un peu à confusion à mon sens.

Cordialement.

Dernière modification par Terces (22-07-2015 17:02:34)


La somme des inverses de la suite de Sylvester converge vers 1 plus vite que toute autre série somme infinie d'inverses d'entiers convergeant vers 1.

Hors ligne

#4 22-07-2015 17:20:49

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 989

Re : Petit jeu divertissant.

Salut,

J'ai joué au Mastermind avant toi, alors garde ton règlement dans ta poche...
Je regarderai tout à l'heure ce qui cloche dans la verif

@+


Arx Tarpeia Capitoli proxima...

En ligne

#5 22-07-2015 17:35:58

Terces
Membre
Inscription : 16-07-2015
Messages : 466

Re : Petit jeu divertissant.

yoshi a écrit :

J'ai joué au Mastermind avant toi, alors garde ton règlement dans ta poche...

Re,
c'est ton règlement que j'ai cité...
concrètement il est respecté.


La somme des inverses de la suite de Sylvester converge vers 1 plus vite que toute autre série somme infinie d'inverses d'entiers convergeant vers 1.

Hors ligne

#6 22-07-2015 20:16:29

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 989

Re : Petit jeu divertissant.

Re,

Bon, l'orage est passé, j'ai tout rebranché...

Non, le "règlement" n'est pas respecté et ce n'était pas un règlement, c'était une précision sur la présentation du codage puisque non graphique.
Mais oui, tu aurais dû avoir 3 True...
Et oui, je pense que j'ai trouvé pourquoi ça cloche : ça ne se produit pas si le code  comprend 4 couleurs différentes...
En effet, je teste la présence de ma couleur dans le code : si elle est présente une deuxième fois, l'index de la lettre (if i==code.index(lt)) fait référence à la première occurrence trouvée.
J'ai une idée de la correction (une ligne en principe, la 80).
Je modifie, je teste et je reposte...

@+


Arx Tarpeia Capitoli proxima...

En ligne

#7 22-07-2015 20:37:11

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 989

Re : Petit jeu divertissant.

Salut,

C'était bien ça...
Ligne incriminée corrigée en :
if lt==code[ i ] :
ainsi puisque le
for i, lt in enumerate(Rep) :
extrait une par une chaque lettre de Rep et son index i, je n'ai plus qu'à tester si code[ i ] et lt sont bien la même lettre...

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

from random import randint


def presente (Coul_Fr):
    print(" "*30+"*"*14)
    print (" "*30+"*"+" "*12+"*")
    print (" "*30+"* MasterMind *")
    print (" "*30+"*"+" "*12+"*")
    print(" "*30+"*"*14)
    print("\n\n\n"+"--> Couleurs disponibles :")
    print ("        ",end="")
    for co in Coul_Fr:
        print (co[0]+"("+co[1:]+") ",end="")  
    print("\n--> True indiquera une couleur bien placée et False mal placée,.")
    print("--> Il pourra y avoir plusieurs fois la même couleur,")
    print("--> Vous avez droit à 12 essais.")
    print("\n")
   
def erreur():
    print (" "*40+"Erreur, veuillez recommencer...")
   
def affiche(C):
    for l in C:
        print (l," ",end="")
           
def recommencer():
    print("      Voulez-vous commencer une autre partie (O/N) ",end="")
    encore=input().upper()
    if len(encore)!=1 and encore not in "ON":
        print ("Erreur, réponse par O, o, N ou n attendue...")
        recommencer()
    return encore

def choix_combi(Cl):
    ok=0
    while 1:
        c=""
        print (" "*40+"Votre combinaison (en 4 lettres) : ", end="")
        c=input().upper()      
        if len(c)!=4:
            erreur()
        else:
            for cc in c:
                if cc not in Cl:
                    erreur()
                else:
                    ok+=1
            if ok==4:
                affiche(c)
                print (" .....  ",end="")
                break
    return c

   
# Couleurs=['blue', 'brown',  'orange', 'purple',  'red','silver','teal', 'yellow']
Coul_Fr=["Bleu","Marron","Orange","Pourpre","Rouge","Argent","Vert","Jaune"]
Init_coul_fr=["B","M","O","P","R","A","V","J"]
presente(Coul_Fr)
code=[]
fin_essai=12
while 1:
    essai,gain,fin,Rep=0,0,0,[]
    while 1:
        for coul in range(4): # tirage du code
            code.append(Init_coul_fr[randint(0,7)])
       
        for essai in range(1,fin_essai+1):
            combi=choix_combi(Init_coul_fr)   # Proposition du joueur
            Rep=list(combi.upper())    # Tranformation de la chaîne en liste
            if Rep==code:
                print (" Gagné ! En",essai,"essai"+"s"*(essai>1)+".\n")              
                gain=1
                break
            else:
                Verif=[]
                for i,lt in enumerate(Rep):
                    if lt in code:   # Teste si la couleur est dans le code
                        if lt==code[i]: # Si oui, est-elle bien placée ?
                            Verif.append(True)
                        else:
                            Verif.append(False)
                if Verif!=[]:
                        Verif=sorted(Verif,reverse=True) # Tri par ordre décroissant
                        affiche(Verif)
                        print("\n")
        break
       
    if gain==0:
        print ("\n  Désolé, vous avez perdu ! La réponse était : ",end="" )
        affiche(code)
        print("\n")
    Rec=recommencer().upper()
    if Rec=="N":
        print ("\n\n              Salut ! A la prochaine !")
        break

@+


Arx Tarpeia Capitoli proxima...

En ligne

#8 23-07-2015 07:40:09

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 989

Re : Petit jeu divertissant.

Bonjour,


'ai trouvé 'depuis mon lit) un autre bug de correction.
J'y réfléchis...

@+


Arx Tarpeia Capitoli proxima...

En ligne

#9 23-07-2015 20:53:40

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 989

Re : Petit jeu divertissant.

Bonsoir,

Le pb s'est révélé plus ardu que prévu à résoudre.
Il y avait un bug de détection des couleurs mal placées : je pense l'avoir résolu.

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

from random import randint


def presente (Coul_Fr):
    db=" "*30+"*"
    lcp=db+"*"*13
    print(lcp)
    print (db+" "*12+"*")
    print (db+" MasterMind *")
    print (db+"    v1.2    *")
    print (db+" "*12+"*")
    print(lcp)
    print("\n\n\n"+"--> Couleurs disponibles :")
    print ("        ",end="")
    for co in Coul_Fr:
        print (co[0]+"("+co[1:]+") ",end="")  
    print("\n--> True indiquera une couleur bien placée et False mal placée,.")
    print("--> Il pourra y avoir plusieurs fois la même couleur,")
    print("--> Vous avez droit à 12 essais.")
    print("\n")
   
def erreur():
    print (" "*40+"Erreur, veuillez recommencer...")
   
def affiche(C):
    for l in C:
        print (l," ",end="")
           
def recommencer():
    print("      Voulez-vous commencer une autre partie (O/N) ",end="")
    encore=input().upper()
    if len(encore)!=1 and encore not in "ON":
        print ("Erreur, réponse par O, o, N ou n attendue...")
        recommencer()
    return encore

def choix_combi(Cl):
    ok=0
    while 1:
        c=""
        print (" "*40+"Votre combinaison (en 4 lettres) : ", end="")
        c=input().upper()      
        if len(c)!=4:
            erreur()
        else:
            for cc in c:
                if cc not in Cl:
                    erreur()
                else:
                    ok+=1
            if ok==4:
                affiche(c)
                print (" .....  ",end="")
                break
    return c

   
# Couleurs=['blue', 'brown',  'orange', 'purple',  'red','silver','teal', 'yellow']
Coul_Fr=["Bleu","Marron","Orange","Pourpre","Rouge","Argent","Vert","Jaune"]
Init_coul_fr=["B","M","O","P","R","A","V","J"]
presente(Coul_Fr)
code=[]
fin_essai=12
while 1:
    essai,gain,fin,Rep=0,0,0,[]
    while 1:
        for coul in range(4): # tirage du code
            code.append(Init_coul_fr[randint(0,7)])
       
        for essai in range(1,fin_essai+1):
            combi=choix_combi(Init_coul_fr)   # Proposition du joueur
            Rep=list(combi.upper())    # Tranformation de la chaîne en liste
            if Rep==code:
                print (" Gagné ! En",essai,"essai"+"s"*(essai>1)+".\n")              
                gain=1
                break
            else:
                Cd,Rp,Pos,Verif,vues=code[:],Rep[:],[],[],0
                for ir,lr in enumerate(Rp):
                    if lr==Cd[ir]:
                        Pos.append(ir)
                        Verif.append(True)
                flag=len(Pos)
                for j,i in enumerate(Pos):
                    del Rp[i-j]
                    del Cd[i-j]
                vues=1
                while vues<5-flag:
                    for ir,lr in enumerate (Rp):
                        if lr in Cd:   # Teste si la couleur est dans le code
                            for ic, lc in enumerate(Cd):
                                if lr==lc:
                                    Verif.append(False)
                                    del Cd[ic]
                                    del Rp[ir]
                                    break
                        vues+=1
                           
                if Verif!=[]:
                    print ("_ _ _ _\n")
                else:
                    affiche(Verif)
                    print("\n")
        break
       
    if gain==0:
        print ("\n  Désolé, vous avez perdu ! La réponse était : ",end="" )
        affiche(code)
        print("\n")
    Rec=recommencer().upper()
    if Rec=="N":
        print ("\n\n              Salut ! A la prochaine !")
        break

Je prends une copie du code et une copie de la Réponse.
Je procède en 2 passages
1. Détection des couleurs bien placées
2. Détection des couleurs mal placées.
Dans les 2 cas, je supprime du code et de la Réponse les couleurs détectées.
Pour les bien placées, je relève leur position puis je les supprime une par une.
Pour les mal placées, je les supprime une par une et à chaque fois, je sors des boucles et y retourne jusqu(à avoir passé en revue toutes les couleurs de la Réponse...
Je vais voir si je peux simplifier...

@+


Arx Tarpeia Capitoli proxima...

En ligne

#10 24-07-2015 00:07:41

tibo
Membre expert
Inscription : 23-01-2008
Messages : 1 097

Re : Petit jeu divertissant.

Salut,

J'y ai passé ma soirée mais je suis enfin parvenu au bout.
Ça faisait longtemps que je voulais programmer un Mastermind, et vous m'avez donné envie de m'y mettre ce soir.
Par contre excusez moi par avance pour le code complétement à l’arrache. Au début, j'essayais de bien commenter, mais rapidement mes mauvaises habitudes ont repris le dessus.

Python

# -*- coding: cp1252 -*-


        ##########################
        ##########################
        ####                  ####
        ####                  ####
        ####    MASTERMIND    ####
        ####                  ####
        ####                  ####
        ##########################
        ##########################

##################
##### import #####
##################

from Tkinter import *   # interface graphique # enlevez la majuscule en cas d'erreur
from random import randrange
#import itertools        # module de combinaisons et arrangements

#################################
##### parametres par defaut #####
#################################

couleur=["white", "black", "red", "green", "blue",  # on peut en ajouter autant que l'on veut
         "yellow", "brown", "orange", "grey", "cyan",
         "purple", "pink"]
nbTrou=5
nbCouleur=8
nbEssai=12

noEssai=0
noTrou=0

####################
##### fonction #####
####################

def cercle(can, x, y, r, coul="grey"):
    """trace dans le canvas can un cercle de centre (x,y) de rayon r et de couleur coul"""
    return can.create_oval(x-r, y-r, x+r, y+r, fill=coul, outline="black")


##### parametrage du jeu #####
def nbTrouMoins():
    global nbTrou
    if nbTrou>1:
        nbTrou=nbTrou-1
        nbTrouLabel.config(text="Nombre de trous = %s"%(nbTrou))
def nbTrouPlus():
    global nbTrou
    if nbTrou<30:
        nbTrou=nbTrou+1
        nbTrouLabel.config(text="Nombre de trous = %s"%(nbTrou))
def nbCouleurMoins():
    global nbCouleur
    if nbCouleur>2:
        nbCouleur=nbCouleur-1
        nbCouleurLabel.config(text="Nombre de couleurs = %s"%(nbCouleur))
def nbCouleurPlus():
    global nbCouleur
    if nbCouleur<len(couleur):
        nbCouleur=nbCouleur+1
        nbCouleurLabel.config(text="Nombre de couleurs = %s"%(nbCouleur))
def nbEssaiMoins():
    global nbEssai
    if nbEssai>2:
        nbEssai=nbEssai-1
        nbEssaiLabel.config(text="Nombre d'essais = %s"%(nbEssai))
def nbEssaiPlus():
    global nbEssai
    if nbEssai<30:
        nbEssai=nbEssai+1
        nbEssaiLabel.config(text="Nombre d'essais = %s"%(nbEssai))


##### jeu #####
def initJeu():
    """Creation du plateau de jeu"""
    global cache, jeuFrame, couleur, possible, nbCombi
    global solution, solutionCanvas
    global essai, essaiCercle, essaiCanvas
    global aide, aideCercle, aideCanvas
    initFrame.destroy()

    ## toutes combinaisons possibles
    #possible=[]
    #for i in itertools.product(couleur[:nbCouleur], repeat=nbTrou):
    #    possible.append(list(i))
    #nbCombi=Label(root, text=str(len(possible)))
    #nbCombi.grid(row=0, column=0)
       

    # solution
        # la solution est enregistree dans une liste de couleur
    solution=[]
    for i in range(nbTrou):
        solution.append(couleur[randrange(nbCouleur)])
    #print(solution)
        # la solution est affichee dans un canvas
    solutionCanvas=Canvas(root, bg="white", height=24, width=22*nbTrou+4)
    solutionCanvas.grid(row=0, column=1, padx=5, pady=5)
    for i in range(nbTrou):
        cercle(solutionCanvas, i*22+14, 14, 10, coul=solution[i])
        # la solution est recouverte d'un cadre noir qui sera supprime a la fin de la partie
    cache=solutionCanvas.create_rectangle(0,0,22*nbTrou+4, 24, fill="black")
    #solutionCanvas.delete(cache)

    # essai
        # les essais sont enregistres dans un tableau
    essai=[]
    essaiCercle=[]
        # les essais sont affiches dans un canvas
    essaiCanvas=Canvas(root, bg="white", height= 24*nbEssai+8, width=22*nbTrou+4)
    essaiCanvas.grid(row=1, column=1, padx=5, pady=5)
    for i in range(nbEssai):
        essai.append([])
        essaiCercle.append([])
        for j in range(nbTrou):
            essai[i].append(None)
            essaiCercle[i].append(cercle(essaiCanvas, j*22+14, 24*nbEssai+8-(i*24+14), 10))
    #print(essai)        
    #print(essaiCercle)
        # le premier trou est selectionne
    essaiCanvas.itemconfig(essaiCercle[noEssai][noTrou], outline="white")

    # aide
        # les aides sont enregistrees dans un tableau
    aide=[]
    aideCercle=[]
        # les aides sont affichees dans un canvas
    aideCanvas=Canvas(root, bg="white", height= 24*nbEssai+8, width=12*nbTrou+4)
    aideCanvas.grid(row=1, column=0, padx=5, pady=5)
    for i in range(nbEssai):
        aideCercle.append([])
        for j in range(nbTrou):
            aideCercle[i].append(cercle(aideCanvas, j*12+10, 24*nbEssai+8-(i*24+14), 5))

    # boutons de jeu
    jeuFrame=Frame(root, bg="white")
    jeuFrame.grid(row=0, column=3, rowspan=10, padx=5, pady=5)

        # deplacement du cercle selectionne
    def droite():
        global noTrou, essaiCanvas
        essaiCanvas.itemconfig(essaiCercle[noEssai][noTrou], outline="black")
        if noTrou<nbTrou-1:
            noTrou=noTrou+1
        else:
            noTrou=0  
        essaiCanvas.itemconfig(essaiCercle[noEssai][noTrou], outline="white")
    Button(jeuFrame, text="-->", width=4, command=droite).grid(row=6, column=0)
   
    def gauche():
        global noTrou, essaiCanvas
        essaiCanvas.itemconfig(essaiCercle[noEssai][noTrou], outline="black")
        if noTrou>0:
            noTrou=noTrou-1
        else:
            noTrou=nbTrou-1
        essaiCanvas.itemconfig(essaiCercle[noEssai][noTrou], outline="white")
    Button(jeuFrame, text="<--", width=4, command=gauche).grid(row=5, column=0)

        # changement de couleur du cercle selectionne
    changeCouleur=[]
    for i in range(nbCouleur):
        def changeCouleurFonc(coul=couleur[i]):
            global essaiCanvas, essai
            essaiCanvas.itemconfig(essaiCercle[noEssai][noTrou], fill=coul)
            essai[noEssai][noTrou]=coul
            droite()
            #print(couleur[i])
        changeCouleur.append(changeCouleurFonc)
        #print(changeCouleur)
    for i in range(nbCouleur):
        Button(jeuFrame, bg=couleur[i], width=4, command=changeCouleur[i]).grid(row=i+10, column=0)
        Checkbutton(jeuFrame).grid(row=i+10, column=1)

        # tester la combinaison
    Button(jeuFrame, text="OK", width=4, command=test).grid(row=0, column=0)
    #Button(jeuFrame, text="IA", width=4, command=IA).grid(row=1, column=0)
   
   
def test():
    #global solution, solutionCanvas
    global possible
    #global nbCombi
    global essai, essaiCercle, essaiCanvas
    global aide, aideCercle, aideCanvas
    global noEssai, noTrou, jeuFrame, cache
    t=1
    for i in essai[noEssai]:
        if i==None:
            t=0
    if t==1:
        essaiTemp=[]
        solTemp=[]
        for i in range(nbTrou):
            essaiTemp.append(essai[noEssai][i])
            solTemp.append(solution[i])
        indice=testCombi(essaiTemp, solTemp)
        aide.append(indice)
        for i in range(len(indice)):
            if indice[i]==2:
                aideCanvas.itemconfig(aideCercle[noEssai][i], fill="black")
            if indice[i]==1:
                aideCanvas.itemconfig(aideCercle[noEssai][i], fill="white")    
        if indice==[2]*nbTrou:
            solutionCanvas.delete(cache)
            gagnFen=Toplevel()
            Label(gagnFen, text="Gagné").grid()
            jeuFrame.destroy()
    if noEssai>nbEssai-2 and indice!=[2]*nbTrou:
        solutionCanvas.delete(cache)
        gagnFen=Toplevel()
        Label(gagnFen, text="Perdu").grid()
        jeuFrame.destroy()
    else:
        essaiCanvas.itemconfig(essaiCercle[noEssai][noTrou], outline="black")
        noEssai=noEssai+1
        noTrou=0
        essaiCanvas.itemconfig(essaiCercle[noEssai][noTrou], outline="white")

        # calcul des combinaisons restantes
        #possibleTemp=[]
        ##print("indice=", indice)
        #for i in range(len(possible)):
        #    essaiTemp=[]
        #    posTemp=[]
        #    for j in range(nbTrou):
        #        essaiTemp.append(essai[noEssai-1][j])
        #        posTemp.append(possible[i][j])
        #    aideTemp=testCombi(essaiTemp, posTemp)
        #    #print(aideTemp)
        #    if indice==aideTemp:
        #        #print("OK")
        #        possibleTemp.append(possible[i])
        #        
        #possible=[]
        #for i in possibleTemp:
        #    possible.append(i)
        #nbCombi.config(text=str(len(possible)))


       

       
def testCombi(combi, sol):
    #print(essai[noEssai])
    #print(type(combi), type(sol))
    indice=[]
    for i in range(nbTrou):
        if sol[i]==combi[i]:
            indice.append(2)
            sol[i]=0
            combi[i]=1
    for i in range(nbTrou):
        for j in range(nbTrou):
            if sol[i]==combi[j]:
                indice.append(1)
                sol[i]=0
                combi[j]=1
    return indice

   

##### IA #####

#def IA():
#    global essaiCanvas, essai
#    combi=possible[randrange(len(possible))]
#    for i in range(nbTrou):
#        essaiCanvas.itemconfig(essaiCercle[noEssai][i], fill=combi[i])
#        essai[noEssai][i]=combi[i]

   

       
   

################
##### main #####
################

root=Tk()   # fenetre principale
root.title("Mastermind")

# parametrage du jeu
initFrame=Frame(root)
initFrame.grid()
Label(initFrame, text="Parametres du jeu").grid(row=0, column=0, columnspan=10)
    # nombre de trous
nbTrouLabel=Label(initFrame, text="Nombre de trous = %s"%(nbTrou))
nbTrouLabel.grid(row=1, column=0)
Button(initFrame, text="-", command=nbTrouMoins).grid(row=1, column=1)
Button(initFrame, text="+", command=nbTrouPlus).grid(row=1, column=2)
    # nombre de couleurs
nbCouleurLabel=Label(initFrame, text="Nombre de couleurs = %s"%(nbCouleur))
nbCouleurLabel.grid(row=2, column=0)
Button(initFrame, text="-", command=nbCouleurMoins).grid(row=2, column=1)
Button(initFrame, text="+", command=nbCouleurPlus).grid(row=2, column=2)
    # nombre d'essais
nbEssaiLabel=Label(initFrame, text="Nombre d'essais = %s"%(nbEssai))
nbEssaiLabel.grid(row=3, column=0)
Button(initFrame, text="-", command=nbEssaiMoins).grid(row=3, column=1)
Button(initFrame, text="+", command=nbEssaiPlus).grid(row=3, column=2)
    # GO !!!
Button(initFrame, text="Lancer le jeu !", command=initJeu).grid(row=4, column=0)


root.mainloop()

 


et pour les fainéants, une petite AI en plus.
Par IA, je n'entend pas un algorithme complexe, mais simplement un script qui calcule toutes les possibilités et en choisi une au hasard.


avec IA

# -*- coding: cp1252 -*-


        ##########################
        ##########################
        ####                  ####
        ####                  ####
        ####    MASTERMIND    ####
        ####                  ####
        ####                  ####
        ##########################
        ##########################

##################
##### import #####
##################

from Tkinter import *   # interface graphique # enlevez la majuscule en cas d'erreur
from random import randrange
import itertools        # module de combinaisons et arrangements

#################################
##### parametres par defaut #####
#################################

couleur=["white", "black", "red", "green", "blue",  # on peut en ajouter autant que l'on veut
         "yellow", "brown", "orange", "grey", "cyan",
         "purple", "pink"]
nbTrou=5
nbCouleur=8
nbEssai=12

noEssai=0
noTrou=0

####################
##### fonction #####
####################

def cercle(can, x, y, r, coul="grey"):
    """trace dans le canvas can un cercle de centre (x,y) de rayon r et de couleur coul"""
    return can.create_oval(x-r, y-r, x+r, y+r, fill=coul, outline="black")


##### parametrage du jeu #####
def nbTrouMoins():
    global nbTrou
    if nbTrou>1:
        nbTrou=nbTrou-1
        nbTrouLabel.config(text="Nombre de trous = %s"%(nbTrou))
def nbTrouPlus():
    global nbTrou
    if nbTrou<30:
        nbTrou=nbTrou+1
        nbTrouLabel.config(text="Nombre de trous = %s"%(nbTrou))
def nbCouleurMoins():
    global nbCouleur
    if nbCouleur>2:
        nbCouleur=nbCouleur-1
        nbCouleurLabel.config(text="Nombre de couleurs = %s"%(nbCouleur))
def nbCouleurPlus():
    global nbCouleur
    if nbCouleur<len(couleur):
        nbCouleur=nbCouleur+1
        nbCouleurLabel.config(text="Nombre de couleurs = %s"%(nbCouleur))
def nbEssaiMoins():
    global nbEssai
    if nbEssai>2:
        nbEssai=nbEssai-1
        nbEssaiLabel.config(text="Nombre d'essais = %s"%(nbEssai))
def nbEssaiPlus():
    global nbEssai
    if nbEssai<30:
        nbEssai=nbEssai+1
        nbEssaiLabel.config(text="Nombre d'essais = %s"%(nbEssai))


##### jeu #####
def initJeu():
    """Creation du plateau de jeu"""
    global cache, jeuFrame, couleur, possible, nbCombi
    global solution, solutionCanvas
    global essai, essaiCercle, essaiCanvas
    global aide, aideCercle, aideCanvas
    initFrame.destroy()

    # toutes combinaisons possibles
    possible=[]
    for i in itertools.product(couleur[:nbCouleur], repeat=nbTrou):
        possible.append(list(i))
    nbCombi=Label(root, text=str(len(possible)))
    nbCombi.grid(row=0, column=0)
       

    # solution
        # la solution est enregistree dans une liste de couleur
    solution=[]
    for i in range(nbTrou):
        solution.append(couleur[randrange(nbCouleur)])
    #print(solution)
        # la solution est affichee dans un canvas
    solutionCanvas=Canvas(root, bg="white", height=24, width=22*nbTrou+4)
    solutionCanvas.grid(row=0, column=1, padx=5, pady=5)
    for i in range(nbTrou):
        cercle(solutionCanvas, i*22+14, 14, 10, coul=solution[i])
        # la solution est recouverte d'un cadre noir qui sera supprime a la fin de la partie
    cache=solutionCanvas.create_rectangle(0,0,22*nbTrou+4, 24, fill="black")
    #solutionCanvas.delete(cache)

    # essai
        # les essais sont enregistres dans un tableau
    essai=[]
    essaiCercle=[]
        # les essais sont affiches dans un canvas
    essaiCanvas=Canvas(root, bg="white", height= 24*nbEssai+8, width=22*nbTrou+4)
    essaiCanvas.grid(row=1, column=1, padx=5, pady=5)
    for i in range(nbEssai):
        essai.append([])
        essaiCercle.append([])
        for j in range(nbTrou):
            essai[i].append(None)
            essaiCercle[i].append(cercle(essaiCanvas, j*22+14, 24*nbEssai+8-(i*24+14), 10))
    #print(essai)        
    #print(essaiCercle)
        # le premier trou est selectionne
    essaiCanvas.itemconfig(essaiCercle[noEssai][noTrou], outline="white")

    # aide
        # les aides sont enregistrees dans un tableau
    aide=[]
    aideCercle=[]
        # les aides sont affichees dans un canvas
    aideCanvas=Canvas(root, bg="white", height= 24*nbEssai+8, width=12*nbTrou+4)
    aideCanvas.grid(row=1, column=0, padx=5, pady=5)
    for i in range(nbEssai):
        aideCercle.append([])
        for j in range(nbTrou):
            aideCercle[i].append(cercle(aideCanvas, j*12+10, 24*nbEssai+8-(i*24+14), 5))

    # boutons de jeu
    jeuFrame=Frame(root, bg="white")
    jeuFrame.grid(row=0, column=3, rowspan=10, padx=5, pady=5)

        # deplacement du cercle selectionne
    def droite():
        global noTrou, essaiCanvas
        essaiCanvas.itemconfig(essaiCercle[noEssai][noTrou], outline="black")
        if noTrou<nbTrou-1:
            noTrou=noTrou+1
        else:
            noTrou=0  
        essaiCanvas.itemconfig(essaiCercle[noEssai][noTrou], outline="white")
    Button(jeuFrame, text="-->", width=4, command=droite).grid(row=6, column=0)
   
    def gauche():
        global noTrou, essaiCanvas
        essaiCanvas.itemconfig(essaiCercle[noEssai][noTrou], outline="black")
        if noTrou>0:
            noTrou=noTrou-1
        else:
            noTrou=nbTrou-1
        essaiCanvas.itemconfig(essaiCercle[noEssai][noTrou], outline="white")
    Button(jeuFrame, text="<--", width=4, command=gauche).grid(row=5, column=0)

        # changement de couleur du cercle selectionne
    changeCouleur=[]
    for i in range(nbCouleur):
        def changeCouleurFonc(coul=couleur[i]):
            global essaiCanvas, essai
            essaiCanvas.itemconfig(essaiCercle[noEssai][noTrou], fill=coul)
            essai[noEssai][noTrou]=coul
            droite()
            #print(couleur[i])
        changeCouleur.append(changeCouleurFonc)
        #print(changeCouleur)
    for i in range(nbCouleur):
        Button(jeuFrame, bg=couleur[i], width=4, command=changeCouleur[i]).grid(row=i+10, column=0)
        Checkbutton(jeuFrame).grid(row=i+10, column=1)

        # tester la combinaison
    Button(jeuFrame, text="OK", width=4, command=test).grid(row=0, column=0)
    Button(jeuFrame, text="IA", width=4, command=IA).grid(row=1, column=0)
   
   
def test():
    #global solution, solutionCanvas
    global possible, nbCombi
    global essai, essaiCercle, essaiCanvas
    global aide, aideCercle, aideCanvas
    global noEssai, noTrou, jeuFrame, cache
    t=1
    for i in essai[noEssai]:
        if i==None:
            t=0
    if t==1:
        essaiTemp=[]
        solTemp=[]
        for i in range(nbTrou):
            essaiTemp.append(essai[noEssai][i])
            solTemp.append(solution[i])
        indice=testCombi(essaiTemp, solTemp)
        aide.append(indice)
        for i in range(len(indice)):
            if indice[i]==2:
                aideCanvas.itemconfig(aideCercle[noEssai][i], fill="black")
            if indice[i]==1:
                aideCanvas.itemconfig(aideCercle[noEssai][i], fill="white")    
        if indice==[2]*nbTrou:
            solutionCanvas.delete(cache)
            gagnFen=Toplevel()
            Label(gagnFen, text="Gagné").grid()
            jeuFrame.destroy()
    if noEssai>nbEssai-2 and indice!=[2]*nbTrou:
        solutionCanvas.delete(cache)
        gagnFen=Toplevel()
        Label(gagnFen, text="Perdu").grid()
        jeuFrame.destroy()
    else:
        essaiCanvas.itemconfig(essaiCercle[noEssai][noTrou], outline="black")
        noEssai=noEssai+1
        noTrou=0
        essaiCanvas.itemconfig(essaiCercle[noEssai][noTrou], outline="white")

        # calcul des combinaisons restantes
        possibleTemp=[]
        #print("indice=", indice)
        for i in range(len(possible)):
            essaiTemp=[]
            posTemp=[]
            for j in range(nbTrou):
                essaiTemp.append(essai[noEssai-1][j])
                posTemp.append(possible[i][j])
            aideTemp=testCombi(essaiTemp, posTemp)
            #print(aideTemp)
            if indice==aideTemp:
                #print("OK")
                possibleTemp.append(possible[i])
               
        possible=[]
        for i in possibleTemp:
            possible.append(i)
        nbCombi.config(text=str(len(possible)))


       

       
def testCombi(combi, sol):
    #print(essai[noEssai])
    #print(type(combi), type(sol))
    indice=[]
    for i in range(nbTrou):
        if sol[i]==combi[i]:
            indice.append(2)
            sol[i]=0
            combi[i]=1
    for i in range(nbTrou):
        for j in range(nbTrou):
            if sol[i]==combi[j]:
                indice.append(1)
                sol[i]=0
                combi[j]=1
    return indice

   

##### IA #####

def IA():
    global essaiCanvas, essai
    combi=possible[randrange(len(possible))]
    for i in range(nbTrou):
        essaiCanvas.itemconfig(essaiCercle[noEssai][i], fill=combi[i])
        essai[noEssai][i]=combi[i]

   

       
   

################
##### main #####
################

root=Tk()   # fenetre principale
root.title("Mastermind")

# parametrage du jeu
initFrame=Frame(root)
initFrame.grid()
Label(initFrame, text="Parametres du jeu").grid(row=0, column=0, columnspan=10)
    # nombre de trous
nbTrouLabel=Label(initFrame, text="Nombre de trous = %s"%(nbTrou))
nbTrouLabel.grid(row=1, column=0)
Button(initFrame, text="-", command=nbTrouMoins).grid(row=1, column=1)
Button(initFrame, text="+", command=nbTrouPlus).grid(row=1, column=2)
    # nombre de couleurs
nbCouleurLabel=Label(initFrame, text="Nombre de couleurs = %s"%(nbCouleur))
nbCouleurLabel.grid(row=2, column=0)
Button(initFrame, text="-", command=nbCouleurMoins).grid(row=2, column=1)
Button(initFrame, text="+", command=nbCouleurPlus).grid(row=2, column=2)
    # nombre d'essais
nbEssaiLabel=Label(initFrame, text="Nombre d'essais = %s"%(nbEssai))
nbEssaiLabel.grid(row=3, column=0)
Button(initFrame, text="-", command=nbEssaiMoins).grid(row=3, column=1)
Button(initFrame, text="+", command=nbEssaiPlus).grid(row=3, column=2)
    # GO !!!
Button(initFrame, text="Lancer le jeu !", command=initJeu).grid(row=4, column=0)


root.mainloop()

 


[Edit] Attention avec l'IA à ne pas mettre trop de couleurs ET de trous car le nombre de possibilités augmente très très vite.
Et il faudrait optimiser un peu le code, notamment je déteste utiliser la commande global. Je trouve ça profondément moche.

Dernière modification par tibo (24-07-2015 08:33:18)


A quoi sert une hyperbole?
----- A boire de l'hypersoupe pardi !

Hors ligne

#11 24-07-2015 00:29:16

Terces
Membre
Inscription : 16-07-2015
Messages : 466

Re : Petit jeu divertissant.

Salut, piouf génial je suis content d'avoir "motivé" yoshi afin de te "motiver" à toi également :o, j'ai juste lancé ton programme pour voir à quoi ca ressemblait et c'est très beau^^ je le testerais plus en détail après ou demain.

Voila je viens de le tester, je n'ai pas rencontré de souci^^

Dernière modification par Terces (24-07-2015 11:32:31)


La somme des inverses de la suite de Sylvester converge vers 1 plus vite que toute autre série somme infinie d'inverses d'entiers convergeant vers 1.

Hors ligne

#12 24-07-2015 10:53:53

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 989

Re : Petit jeu divertissant.

Salut,

Bravissimo !

@+


Arx Tarpeia Capitoli proxima...

En ligne

Pied de page des forums