master.py

Created by dan-wallez

Created on February 07, 2025

5.43 KB

Jeu classique du mastermind : pour lancer le jeu »> mastermind() ou sélectionner la fonction mastermind() après l’appui de la touche var. Le nombre de couleurs et de positions est paramétrables mais attention les difficultés montent très vite. Choix classique : 6 couleurs (de 0 à 5) et 4 positions vous pouvez vous confronter à la machine, saisir la lettre o puis suivre les indications. Important : choisir la police petite (voir menu. paramètres de la machine)


from random import randint

def bien_places(u, v):
    cpt = 0
    for i in range(len(u)):
        if u[i] == v[i] :
            cpt+=1
    return(cpt)

def repartition_couleurs(combi, nb_couleurs):
    t=[]
    for i in range(nb_couleurs):
        t.append(int(0))
    for i in range(len(combi)) :
        t[combi[i]]+=1
    return (t)

def bien_ou_mal_places(u, v, nb_couleurs):
    total = 0
    ubis = repartition_couleurs(u, nb_couleurs)
    vbis = repartition_couleurs(v, nb_couleurs)
    for i in range(nb_couleurs):
        if ubis[i] <= vbis[i]:
            total += ubis[i]
        else :
            total += vbis[i]
    return (total)

def similarite(u, v, nb_couleurs):
    x = bien_places(u, v)
    y = bien_ou_mal_places(u, v, nb_couleurs)- x  # y = mal_places
    return (x, y)

def prochain(u,nb_couleurs):

    longueur_combi = len(u)
   
    proposition_suivante=[]
    for i in range(longueur_combi): 
        proposition_suivante.append(u[i])
        
    retenue = False
    retenue_cpt = 0 
        
    for i in range(longueur_combi):        
        if retenue or i==0 :
            if proposition_suivante[longueur_combi -(1+i)] + 1 >= nb_couleurs :
                proposition_suivante[longueur_combi-(1+i)] = 0
                retenue = True
                retenue_cpt += 1
            else :
                proposition_suivante[longueur_combi -(1+i)] += 1 
                retenue = False
                
    if retenue_cpt == longueur_combi :
        return (-1) 
    else :
        return (proposition_suivante)   
    
def compatible(combi, historique, nb_couleurs):

    compatibilite = True
    
    for i in range(len(historique)):
        if similarite(combi,historique[i][0],nb_couleurs)!=historique[i][1]:
            compatibilite = False    
            break
        
    return(compatibilite)

def trouve(but, nb_couleurs, historique):

    combi_courante=[]
    for i in range(len(but)):
        combi_courante.append(0)
        
    while True :
        
        if combi_courante == but :
            print ("Combinaison trouvée  :  ",combi_courante) 
            break
        
        if compatible(combi_courante,historique,nb_couleurs):
            histotuple=(combi_courante,similarite(combi_courante,but,nb_couleurs))
            print ("Proposition, info : ",histotuple)
            historique.append(histotuple)
            
        combi_courante = prochain(combi_courante,nb_couleurs)
            
#----  Début du programme principal -----

def mastermind():

    print ("Voulez vous confronter à la machine ?")
    print ("Si oui : répondre o")
    print ("sinon entrer un autre caractère")
    reponse = input("Réponse = ")

    if reponse == "o" :
        
        print("Une fois les 2 paramètres saisis")
        print("La calculette va proposer une combinaison")
        print("Elle va très vite faire défiler l'écran")
        print("pour que la combinaison soit à deviner")
        print("")

        nbccouls = int(input("Nombre de couleurs = "))
        nbppositions = int(input("Nombre de positions = "))

        liste_ordi = []
        for w in range (nbppositions):
            liste_ordi.append(randint(0,nbccouls-1))
        
        print ("Combinaison proposée :",liste_ordi)

        for i in range (20) :
            print("")

        print (nbccouls, "couleurs de 0 à", nbccouls-1)
        print (nbppositions, "positions")
        print ("Info (x, y) signifie :")
        print ("x pions (couleur ok) bien placés")
        print ("y pions (couleur ok) mal placés")


        historiquej=[]
        combi_courante=[]
        for x in range(nbppositions):
            code_couleur = int(input("Couleur "+str(x+1)+" = "))
            combi_courante.append(code_couleur)
                
        nb_coups = 1
            
        while combi_courante != liste_ordi :
            print("combi courante =", combi_courante)
            historiquej.append( ( combi_courante ,  similarite(combi_courante, liste_ordi,nbccouls) ) )
            for z in range(len(historiquej)):
                print ("Proposition, info : ",historiquej[z])
            combi_courante=[]    # Attention avec les adresses
            for x in range(nbppositions):
                code_couleur = int(input("Couleur "+str(x+1)+" = "))
                combi_courante.append(code_couleur)
            nb_coups += 1
            
        print ("Bravo, gagné en",nb_coups,"coup(s)")
    
##################################################################################

    print ("\nA la machine de trouver")
    print ("Conseil :si vous avez joué proposez")
    print ("la même combinaison de couleurs")
    print ("pour voir qui est le plus fort\n") 

    nbccouls = int(input("Nombre de couleurs = "))
    nbppositions = int(input("Nombre de positions = "))

    historique=[]
    liste_a_trouver = []
    for p in range(nbppositions) :
        
        couleur_entree = int(input("Couleur " + str(p+1) + " = "))
        while couleur_entree < 0 or couleur_entree >= nbccouls :
            print ("Couleur comprise entre ",0," et ",str(nbccouls-1))
            couleur_entree = int(input("Couleur " + str(p+1) + " = "))
            
        liste_a_trouver.append(couleur_entree)
        
    print ("Combinaison à trouver = ",liste_a_trouver)
    print ("Info (x, y) signifie : ")
    print ("x pions (couleur ok) bien placés")
    print ("y pions (couleur ok) mal placés")
    trouve (liste_a_trouver,nbccouls,historique)

    print ("Gagné en",len(historique)+1,"coup(s)")

During your visit to our site, NumWorks needs to install "cookies" or use other technologies to collect data about you in order to:

With the exception of Cookies essential to the operation of the site, NumWorks leaves you the choice: you can accept Cookies for audience measurement by clicking on the "Accept and continue" button, or refuse these Cookies by clicking on the "Continue without accepting" button or by continuing your browsing. You can update your choice at any time by clicking on the link "Manage my cookies" at the bottom of the page. For more information, please consult our cookies policy.