Bonjour

Nous avons réalisé une premiere programmation pour un mastermind sur lequel l'utilisateur doit trouver la solution de la combinaison donné par l'ordinateur, celle ci fonctionne correctement.

Par contre nous souhaitons develloper la solution inverse c'est a dire que l'ordinateur trouve la combinaison donnée par l'utilisateur . Au depart on rentre la combinaison et l'ordinateur evalue les combinaisons possibles. Mais il apparait une boucle infinie qui lui empeche de chercher la solution.
Pourriez vous m'indiquer s'il vous plait d'ou provient l'erreur car nous n'arrivons pas a la trouver malgré nos recherches.

Merci d'avance . Ci dessous le programme.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
# -*- coding: Latin-1 -*-
 
#V2 : Programmer un jeu de MASTERMIND dans lequel l?humain choisit la combinaison à découvrir et l?ordinateur émet les
#propositions les plus pertinentes possibles afin d?arriver à trouver la solution. Pour cela, il faudra doter l?ordinateur d?une stratégie
#d?IA. Dans cette version, le programme continue à évaluer chaque proposition
 
import random
 
# fonction qui choisit aléatoirement une combinaison
# donnees : n nombre de pions, k nombre de couleurs
# résultat : une liste S de n entiers, choisis dans [0..k]
 
def tirage(n,k) :
    S = []
    i = 0
    while i < n:
        S.append(randrange(1,k+1))
        i += 1
    return S
 
#lcar = Liste de caractère
# qui renvoie la liste de caractère
# e = nombre d'essaies
def saisie(n,k) :
    lcar =[]
    message="Entrez la proposition " + str (n) + " chiffres de 1 à " + str (k) +") :"
    chaine = input(message)
    i = 0
    while i < len(chaine) :
        lcar.append(int(chaine[i]))
        i += 1
    return lcar
 
# Qui retourne une copie de la liste
def copie(L1):
    L2 = []
    i = 0
    while i < len(L1):
        L2.append(L1[i])  
        i+=1
    return L2
 
# Cette fonction sert à retourner le nombre d'élément d'une liste de même valeur et de même rang
def evaluenoir (L1 , L2):
    i, n= 0 , 0
    l = len(L2)
    while i < l :
        if L1[i] == L2[i]:
            n+=1
            # Pour eviter de compter plusieurs fois un entier couleur, onle remplace par un entier hors intervalle
            L1[i]= -1
            L2[i]= -2
        i += 1
    return n
 
 
# Cette fonction sert à retourner le nombre d'élément d'une liste de même valeur mais de rang différent
def evalueblanc (L1 , L2):
    i , n = 0, 0
    l = len(L2)
    while i < l :
        j = 0
        while j < l :
            if L1[i] == L2[j]:
                n+=1
# Pour eviter de compter plusieurs fois un entier couleur et pour prendre un entier hors intervalle
                L1[i]= -1
                L2[j]= -2
            j += 1
        i += 1
    return n
 
 
# Fonction qui affiche une ligne de plateau de jeu
# n = couleur mal placées
# b = couleur bien placées
def affiche (L , n , b):
    print (L, end=" ")
    for nn in range(n) :
        print ("+", end=" ")
    for nb  in range (b) :
        print ("-", end=" " )
    print()
 
# Fonction qui genere toutes les combinaisons possibles
# n1= nombre de boules et n2= nombre de couleurs
# Resultat donne une liste C de liste n1 choisis dans [1...n2]
 
def touteCombinaisons(n1,n2):
    C=[]  #Liste des combinaisons possibles
    P= [1] * n1 # une combinaison
    i=0
    while i < n1**n2:
        C.append(copie(P))
        P[n1-1] += 1
        j = n1-1
        while j > 0 :
            if P[j] == n2 + 1 :
                P[j]=1
                P[j-1] += 1 # "+=" C'est une Incrementation : Ajouter une valeur entiere fixée a un compteur
                k=j
                while k < (n1-j):
                    P[k]=1
                    k+=1
            j-=1 # "-+" C'est une Decrementation : Retirer une valeur entiere fixée a un compteur
        i+=1
    return C
 
# Fonction qui elimine les combinaisons de la liste
# nn entier = bien placés
# nb = mal placés
# prposition, une liste de n1 choisis dans [1...n2]
def elimineCombinaison (proposition,nn,nb):
    global C #liste des combinaisons possibles
    i, j = 0, len(C)   #pointeurs de parcours de la liste C
    while i < j :     # Tant qu'il n'a pas parcourue toutes les combinaisons de la liste C
 
    # si il n'y a le bon nombre de noir ou de blanc dans une combinaison
            if (evaluenoir(copie(C[i]),copie(proposition)) != nn) & (evalueblanc(copie(C[i]),copie(proposition)) != nb) :
                del C [i] # La combinaison est eliminée de la liste
                i-= 1  # est lepointeur de fin de liste est decrémentée (puisque la liste a un element en moins)
                j-= 1
    else:
        i+=1 # La combinaison est conservée et on passe a la combinaison suivante
 
#PROGRAMME PRINCIPAL
nBoule = 4
nCouleur = 8
nEssai = 20
C = touteCombinaisons(nBoule, nCouleur)
i=0
nNoir=0
nBlanc=0
 
#Debut de partie
#Choix aléatoire de la combinaison a découvrir
#Solution = tirage (nBoule,nCouleur)
#Choix par le joueur de la combinaison
Solution = saisie (nBoule,nCouleur)
print("vous avez choisis",Solution)
print("Je vais essayer de trouver la combinaison en moins de ",nEssai+1, "essais : il y a" ,len(C),
"combinaisons possibles ?","en")
 
#Boucles principales
# Tant qu'on a pas trouvé la combi et toujours avoir des essaies autorisé
while nNoir < nBoule and i < nEssai :
    i += 1
    #Choisir aléatoirement une proposition dans la listes des combinaisons possibles
Proposition = random.choice(C)
copie_Proposition, copie_Solution = copie(Proposition),copie(Solution)
    #Evaluer son résultat
nNoir=evaluenoir(copie_Proposition,copie_Solution)
nBlanc=evalueblanc(copie_Proposition,copie_Solution)
    #Eliminer dela listes les combinaison incompatibles avec le resultat
elimineCombinaison(Proposition,nNoir,nBlanc)
    #Afficher le resultat de l'essai
print("essais", i,end="  :  ")
affiche (Proposition, nNoir,nBlanc)
print("il reste", len(C), "Combinaisons possibles ")
 
#Fin de Partie
print()
if nNoir == nBoule:
    print("J'ai gagné en",i,"coups")
else :
    print ("J'ai perdu ! La solution etait",Solution)