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
|
def lcebnormal():
print()
print('########################################')
print('# #')
print('# LE COMPTE EST BON #')
print('# #')
print('########################################')
print()
Joueur=str(input('Quel est votre prénom ? '))
print()
# 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...
print(Joueur, ', entrez votre opération ou "f" si terminé ou "h" pour voir les règles:')
# Lecture du premier terme de l'opération
nbok = False
nb1, play, current_list = lire_nombre(play, coups, current_list)
if not play: break # Si le joueur a souhaité arreter le jeu
# Lecture de l'opérateur
op, play = lire_operateur(play, coups, ops)
if not play: break
# Lecture du second terme de l'opération
nbok = False
nb2, play, current_list = lire_nombre(play, coups, current_list)
if not play: break # Si le joueur a souhaité arreter le jeu
# 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.append(nb1) # on remet dans la liste les nombres saisis
current_list.append(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.append(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
# on fabrique toutes les permutations possibles des 6 nombres
# La fonction permutations retourne toutes les permutations d'un ensemble
for (a, b, c, d, e, f) in permutations([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 = '(' + a + v + b + ')' # 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 + c + ')'
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 + d + ')'
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 + e + ')'
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 + f + ')'
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) ) |
Partager