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) |