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 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193
|
# Fonction du jeu "Le compte est bon" mode ordre
def lcebordre():
# Construction de la liste de nombres autorisés
nombres = []
nombres.extend(range(1,11)) # Tous les chiffres de 1 à 10
nombres.extend(range(1,11)) # Tous les chifffres de 1 à 10
nombres.extend([25,50,75,100]) # une fois chaque multiple de 25 jusqu'à 100
# Liste contruite par les 3 lignes précédentes
#nombres = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ,1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,10, 25, 50, 75, 100]
# Liste des 4 opérateurs
ops = '*+/-'
# Avant le tirage la liste des nombres tirés au sort est vide
current_list=[]
##Definition de l'objectif - Tirage des 6 nombres
# Objectif et tirage pour le jeu normal :
obj=randint(100,999) # 100 <= Objectif < 1000
current_list = tirage(nombres)
# Sauvegarde de la liste initiale pour la recherche automatique de solution
saved_current_list = list(current_list)
##Début du jeu
print('\t# Tirage initial :' ,current_list, '- objectif :', obj, '#')
print()
win = False # Le joueur n'a pas encore gagné
play = True # Le jeu est en cours
##Le joueur commence
coups = 0 # Nombre de coups joués
while len(current_list)!=1 and not win and play : # tant que la liste n'est pas vide, la solution n'a pas été trouvée, le joueur n'a pas interrompu le jeu...
nb1=current_list[0]
nb2=current_list[1]
print(Joueur, ', entrez votre opération ou "f" si terminé ou "h" pour voir les règles:')
print(nb1, '...', nb2, '?')
# Lecture de l'opérateur
op, play = lire_operateur(play, coups, ops)
current_list.pop(current_list.index(nb1))
current_list.pop(current_list.index(nb2))
if not play: break
# Calcul de l'opération choisie par le joueur
res = operations(nb1,nb2,op)
if type(res) is str: # division non entière ou soustraction négative
print('opération non valide, reprenez')
current_list.insert(0,nb1) # on remet dans la liste les nombres saisis
current_list.insert(1,nb2)
continue
if res == obj: # si la solution est trouvée
win=True # Le joueur a gagné
# Affichage de l'opération saisie
print('\t\t###', nb1, op, nb2, '=' , res, '###' )
print()
coups+=1 # on incrémente le nombre de coups
current_list.insert(0,res) # on ajoute le résultat courant à la liste
if (len(current_list) != 1):
print('\t# Tirage courant :' ,current_list, '- objectif :', obj, '#')
if win: # si c'est gagné
print()
print('### GAGNE en ', coups, ' coups : LE COMPTE EST BON !!! ###')
else: # si c'est perdu
# on cherche le nombre le plus proche de l'objectif
# on fabrique une liste qui contient les ecarts avec l'objectif (en valeur absolue)
diff = [abs(x - obj) for x in current_list]
# on cherche le minimum de cette liste
mini = min(diff)
print('### PERDU !!! Vous avez atteint ', current_list[diff.index(mini)], '(objectif :', obj,') ###')
print()
print("### Patientez, l'ordinateur recherche la solution...")
print("### ...")
ops = '*+/-'
##Recherche automatique de la solution
best_exp = '' # Meilleure expression
best_val = 1e9 # Valeur la plus proche de l'objectif
start_time = time.time() # on démarre le chrono
saved_current_list=[str(x) for x in saved_current_list]
# on fabrique aussi toutes les permutations possibles des 4 opérateurs
for (v, w, x, y, z) in product(ops, ops, ops, ops, ops):
# expression à 2 nombres et 1 opérateur
exp = '(' + saved_current_list[0] + v + saved_current_list[1] + ')' # construction de l'expression (strings)
ev = eval(exp) # on évalue l'expression
if (ev != int(ev)): continue # si elle n'est pas entière on passe à la combinaison suivante
if (ev <= 0): continue# si elle est négative on passe à la combinaison suivante
if (abs(ev-obj) < abs(best_val - obj)): # si elle est meilleure que celles rencontrees jusqu'à présent
best_val = ev
best_exp = exp
print('\t', exp, '=', ev)
if best_val == obj: break # si la solution est trouvée
# expression à 3 nombres et 2 opérateurs
exp = '(' + exp + w + saved_current_list[2] + ')'
ev = eval(exp)
if (ev != int(ev)): continue
if (ev <= 0): continue
if (abs(ev-obj) < abs(best_val - obj)):
best_val = ev
best_exp = exp
print('\t', exp, '=', ev)
if best_val == obj: break
# expression à 4 nombres et 3 opérateurs
exp = '(' + exp + x + saved_current_list[3] + ')'
ev = eval(exp)
if (ev != int(ev)): continue
if (ev <= 0): continue
if (abs(ev-obj) < abs(best_val - obj)):
best_val = ev
best_exp = exp
print('\t', exp, '=', ev)
if best_val == obj: break
# expression à 5 nombres et 4 opérateurs
exp = '(' + exp + y + saved_current_list[4] + ')'
ev = eval(exp)
if (ev != int(ev)): continue
if (ev <= 0): continue
if (abs(ev-obj) < abs(best_val - obj)):
best_val = ev
best_exp = exp
print('\t', exp, '=', ev)
if best_val == obj: break
# expression à 6 nombres et 5 opérateurs
exp = '(' + exp + z + saved_current_list[5] + ')'
ev = eval(exp)
if (ev != int(ev)): continue
if (ev <= 0): continue
if (abs(ev-obj) < abs(best_val - obj)):
best_val = ev
best_exp = exp
print('\t', exp, '=', ev)
if best_val == obj: break
end_time = time.time() # on arrete le chrono
print('### Meilleure solution : {} = {} trouvée en {:.3f} s'.format(best_exp, best_val, end_time - start_time) )
#Création du programme final
def lceb():
print()
print('########################################')
print('# #')
print('# LE COMPTE EST BON #')
print('# #')
print('########################################')
print()
Joueur=str(input('Quel est votre prénom ? '))
print()
print()
print(Joueur," veuillez lire les consignes de jeux qui s'affichent, merci")
time.sleep(4)
os.startfile("consigne lceb.pdf")
time.sleep(2)
print()
print()
print("Vous avez donc le choix entre trois modes de jeux, lequels voulez vous choisir?")
print()
mode='123'
opok = False # True lorsque le nombre saisi est correct
while not opok: # Tant que le nombre n'est pas parmi 1,2,3
print("Taper le '1' pour le mode normal, le '2' pour le mode opération et enfin le '3' pour le mode ordre")
nb = input() # On demande un opérateur
if nb in mode: # l'opérateur entré est valide
opok = True
n=0
if nb == 1:
n=lcebnormal()
elif nb == 2:
n=lceboperation()
elif nb == 3:
n=lcebordre()
return n |
Partager