Forum de mathématiques - Bibm@th.net
Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
Pages : 1
Discussion fermée
#1 21-07-2015 11:39:38
- Terces
- Membre
- Inscription : 16-07-2015
- Messages : 466
Petit jeu divertissant.
Bonjour,
je ne sais pas si vous connaissez le jeu du Mastermind, j'en ai fait une version numérique (qui évite notamment la perte des petites multicolores^^), c'est un programme que j'ai fait il y a pas mal de temps mais c'est vraiment un jeu que je trouve intéressant, j'y ai rajouté un compteur de temps mais bon, c'est un jeu de réflexion avant tout pas de rapidité. J'espère qu'il fonctionnera chez vous et qu'il vous plaira:
-------------------------------------------------------------------------------------------------------------------------------------
from random import*
import time
print("Trouvez la combinaison Newmastermind comprise entre 9999 et 1111 en moins de 12 essais(tapez \"ESSAI\" pr connaitre le nombre d'essais que vous avez deja efectué) Bonne chance!\n ")
while 1:
c1=randint(1,9)
c1=int(c1)
c2=randint(1,9)
c2=int(c2)
c3=randint(1,9)
c3=int(c3)
c4=randint(1,9)
c4=int(c4)
essai=0
temps=False
while 1:
essai+=1
pc=0
pcccc=0
prop=input("alors quelle combinaison proposez vous? ")
while not temps:
temps_debut=time.time()
temps=True
if prop.upper()=="ABANDON":
print("La combinaison était ",c1,c2,c3,c4," !")
break
if prop.upper()=="ESSAI":
essai-=1
print("vous avez effectué ",essai,"/12 essai(s)")
continue
try:
prop=int(prop)
except ValueError:
print("Vous n'avez pas saisi un nombre entier, cet essai ne sera donc pas compté, cependant le temps s'ecoule!")
essai-=1
continue
if 1111>prop:
print("Vous avez saisi un nombre trop petit, cet essai ne sera donc pas compté, cependant le temps s'ecoule!")
essai-=1
continue
if 9999<prop:
print("Vous avez saisi un nombre trop grand, cet essai ne sera donc pas compté, cependant le temps s'ecoule!")
essai-=1
continue
p1=prop-prop%1000
p2=prop-p1-prop%100
p3=prop-p1-p2-prop%10
p4=prop-p1-p2-p3
p1/=1000
p2/=100
p3/=10
p1=int(p1)
p2=int(p2)
p3=int(p3)
if p1==c1 :
pc+=1
if p2==c2 :
pc+=1
if p3==c3 :
pc+=1
if p4==c4 :
pc+=1
if p1==c1 or p1==c2 or p1==c3 or p1==c4:
pcccc+=1
if p2==c1 or p2==c2 or p2==c3 or p2==c4:
pcccc+=1
if p3==c1 or p3==c2 or p3==c3 or p3==c4:
pcccc+=1
if p4==c1 or p4==c2 or p4==c3 or p4==c4:
pcccc+=1
print("Vous avez ",pcccc,"chifre(s) appartenant a la combinaison et",pc,"bien placé(s)\n")
if p1==c1 and p2==c2 and p3==c3 and p4==c4:
temps_sec=time.time()-temps_debut
temps_min=int(temps_sec//60)
temps_sec=((temps_sec-temps_min*60)//0.1)/10
print("bravo, vous avez trouvé la combinaison en ",essai," essai(s) et en ",temps_min,"min",temps_sec,"sec\nFélicitation!")
break
if essai==12:
print("désolé, vs n'avez pas réussi a trouver la combinaison en moins de 12 essais. La combinaison était ",c1,c2,c3,c4,"!")
break
while 1:
rejouer=input("\n\nVoulez-vous rejouer? ")
try:
rejouer=str(rejouer)
except ValueError:
print("vous n'avez pas saisi une réponse attendue, c'est a dire \"oui\" ou \"non\"!")
continue
if rejouer.lower()!= "oui" and rejouer.lower()!= "non":
print("vous n'avez pas saisi une réponse attendue, c'est a dire \"oui\" ou \"non\"!")
continue
break
if rejouer.lower()=="non":
exit()
if rejouer.lower()=="oui":
continue
-------------------------------------------------------------------------------------------------------------------------------------
Voila, Voila, cordialement.
PS: mon meilleur score: 3 essais(gros cou de chance^^) ma moyenne: 6
Dernière modification par Terces (21-07-2015 11:40:27)
La somme des inverses de la suite de Sylvester converge vers 1 plus vite que toute autre série somme infinie d'inverses d'entiers convergeant vers 1.
Hors ligne
#2 22-07-2015 16:14:43
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 16 989
Re : Petit jeu divertissant.
Re;
J'avais toujours eu envie de le faire, sans jamais passer à l'acte.
Maintenant, c'est fait (et perfectible !)
Je vais en faire (ou essayer de) une version graphique, mais là, cela demandera un peu plus de temps...
Je sais, ça existe déjà dans le commerce, mais j'aime bieb réinventer - périodiquement - la roue ! ^_^
# -*- coding: UTF-8 -*-
from random import randint
def presente (Coul_Fr):
print(" "*30+"*"*14)
print (" "*30+"*"+" "*12+"*")
print (" "*30+"* MasterMind *")
print (" "*30+"*"+" "*12+"*")
print(" "*30+"*"*14)
print("\n\n\n"+"--> Couleurs disponibles :")
print (" ",end="")
for co in Coul_Fr:
print (co[0]+"("+co[1:]+") ",end="")
print("\n--> True indiquera une couleur bien placée et False mal placée,.")
print("--> Il pourra y avoir plusieurs fois la même couleur,")
print("--> Vous avez droit à 12 essais.")
print("\n")
def erreur():
print (" "*40+"Erreur, veuillez recommencer...")
def affiche(C):
for l in C:
print (l," ",end="")
def recommencer():
print(" Voulez-vous commencer une autre partie (O/N) ",end="")
encore=input().upper()
if len(encore)!=1 and encore not in "ON":
print ("Erreur, réponse par O, o, N ou n attendue...")
recommencer()
return encore
def choix_combi(Cl):
ok=0
while 1:
c=""
print (" "*40+"Votre combinaison (en 4 lettres) : ", end="")
c=input().upper()
if len(c)!=4:
erreur()
else:
for cc in c:
if cc not in Cl:
erreur()
else:
ok+=1
if ok==4:
affiche(c)
print (" ..... ",end="")
break
return c
# Couleurs=['blue', 'brown', 'orange', 'purple', 'red','silver','teal', 'yellow']
Coul_Fr=["Bleu","Marron","Orange","Pourpre","Rouge","Argent","Vert","Jaune"]
Init_coul_fr=["B","M","O","P","R","A","V","J"]
presente(Coul_Fr)
code=[]
fin_essai=12
while 1:
essai,gain,fin,Rep=0,0,0,[]
while 1:
for coul in range(4): # tirage du code
code.append(Init_coul_fr[randint(0,7)])
for essai in range(1,fin_essai+1):
combi=choix_combi(Init_coul_fr) # Proposition du joueur
Rep=list(combi.upper()) # Tranformation de la chaîne en liste
if Rep==code:
print (" Gagné ! En",essai,"essai"+"s"*(essai>1)+".\n")
gain=1
break
else:
Verif=[]
for i,lt in enumerate(Rep):
if lt in code: # Teste si la couleur est dans le code
if i==code.index(lt): # Si oui, est-elle bien placée ?
Verif.append(True)
else:
Verif.append(False)
if Verif!=[]:
Verif=sorted(Verif,reverse=True) # Tri par ordre décroissant
affiche(Verif)
print("\n")
break
if gain==0:
print ("\n Désolé, vous avez perdu ! La réponse était : ",end="" )
affiche(code)
print("\n")
Rec=recommencer().upper()
if Rec=="N":
print ("\n\n Salut ! A la prochaine !")
break
@+
Arx Tarpeia Capitoli proxima...
En ligne
#3 22-07-2015 17:00:05
- Terces
- Membre
- Inscription : 16-07-2015
- Messages : 466
Re : Petit jeu divertissant.
Salut,
j'ai voulu testé ton programme, et je crois pour le moment qu'il y a une lègère confusion, regarde un extrait de ma "partie" :
Votre combinaison (en 4 lettres) : pmpp
P M P P ..... True True False False
Désolé, vous avez perdu ! La réponse était : P M P M
Le règlement dit:
"True indiquera une couleur bien placée et False mal placée"
alors pourquoi je n'ai pas eu 3 "True" ? Enfin en même temps il y avait que 2 couleurs d'où les deux "true" mais ca porte un peu à confusion à mon sens.
Cordialement.
Dernière modification par Terces (22-07-2015 17:02:34)
La somme des inverses de la suite de Sylvester converge vers 1 plus vite que toute autre série somme infinie d'inverses d'entiers convergeant vers 1.
Hors ligne
#4 22-07-2015 17:20:49
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 16 989
Re : Petit jeu divertissant.
Salut,
J'ai joué au Mastermind avant toi, alors garde ton règlement dans ta poche...
Je regarderai tout à l'heure ce qui cloche dans la verif
@+
Arx Tarpeia Capitoli proxima...
En ligne
#5 22-07-2015 17:35:58
- Terces
- Membre
- Inscription : 16-07-2015
- Messages : 466
Re : Petit jeu divertissant.
J'ai joué au Mastermind avant toi, alors garde ton règlement dans ta poche...
Re,
c'est ton règlement que j'ai cité...
concrètement il est respecté.
La somme des inverses de la suite de Sylvester converge vers 1 plus vite que toute autre série somme infinie d'inverses d'entiers convergeant vers 1.
Hors ligne
#6 22-07-2015 20:16:29
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 16 989
Re : Petit jeu divertissant.
Re,
Bon, l'orage est passé, j'ai tout rebranché...
Non, le "règlement" n'est pas respecté et ce n'était pas un règlement, c'était une précision sur la présentation du codage puisque non graphique.
Mais oui, tu aurais dû avoir 3 True...
Et oui, je pense que j'ai trouvé pourquoi ça cloche : ça ne se produit pas si le code comprend 4 couleurs différentes...
En effet, je teste la présence de ma couleur dans le code : si elle est présente une deuxième fois, l'index de la lettre (if i==code.index(lt)) fait référence à la première occurrence trouvée.
J'ai une idée de la correction (une ligne en principe, la 80).
Je modifie, je teste et je reposte...
@+
Arx Tarpeia Capitoli proxima...
En ligne
#7 22-07-2015 20:37:11
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 16 989
Re : Petit jeu divertissant.
Salut,
C'était bien ça...
Ligne incriminée corrigée en :
if lt==code[ i ] :
ainsi puisque le
for i, lt in enumerate(Rep) :
extrait une par une chaque lettre de Rep et son index i, je n'ai plus qu'à tester si code[ i ] et lt sont bien la même lettre...
# -*- coding: UTF-8 -*-
from random import randint
def presente (Coul_Fr):
print(" "*30+"*"*14)
print (" "*30+"*"+" "*12+"*")
print (" "*30+"* MasterMind *")
print (" "*30+"*"+" "*12+"*")
print(" "*30+"*"*14)
print("\n\n\n"+"--> Couleurs disponibles :")
print (" ",end="")
for co in Coul_Fr:
print (co[0]+"("+co[1:]+") ",end="")
print("\n--> True indiquera une couleur bien placée et False mal placée,.")
print("--> Il pourra y avoir plusieurs fois la même couleur,")
print("--> Vous avez droit à 12 essais.")
print("\n")
def erreur():
print (" "*40+"Erreur, veuillez recommencer...")
def affiche(C):
for l in C:
print (l," ",end="")
def recommencer():
print(" Voulez-vous commencer une autre partie (O/N) ",end="")
encore=input().upper()
if len(encore)!=1 and encore not in "ON":
print ("Erreur, réponse par O, o, N ou n attendue...")
recommencer()
return encore
def choix_combi(Cl):
ok=0
while 1:
c=""
print (" "*40+"Votre combinaison (en 4 lettres) : ", end="")
c=input().upper()
if len(c)!=4:
erreur()
else:
for cc in c:
if cc not in Cl:
erreur()
else:
ok+=1
if ok==4:
affiche(c)
print (" ..... ",end="")
break
return c
# Couleurs=['blue', 'brown', 'orange', 'purple', 'red','silver','teal', 'yellow']
Coul_Fr=["Bleu","Marron","Orange","Pourpre","Rouge","Argent","Vert","Jaune"]
Init_coul_fr=["B","M","O","P","R","A","V","J"]
presente(Coul_Fr)
code=[]
fin_essai=12
while 1:
essai,gain,fin,Rep=0,0,0,[]
while 1:
for coul in range(4): # tirage du code
code.append(Init_coul_fr[randint(0,7)])
for essai in range(1,fin_essai+1):
combi=choix_combi(Init_coul_fr) # Proposition du joueur
Rep=list(combi.upper()) # Tranformation de la chaîne en liste
if Rep==code:
print (" Gagné ! En",essai,"essai"+"s"*(essai>1)+".\n")
gain=1
break
else:
Verif=[]
for i,lt in enumerate(Rep):
if lt in code: # Teste si la couleur est dans le code
if lt==code[i]: # Si oui, est-elle bien placée ?
Verif.append(True)
else:
Verif.append(False)
if Verif!=[]:
Verif=sorted(Verif,reverse=True) # Tri par ordre décroissant
affiche(Verif)
print("\n")
break
if gain==0:
print ("\n Désolé, vous avez perdu ! La réponse était : ",end="" )
affiche(code)
print("\n")
Rec=recommencer().upper()
if Rec=="N":
print ("\n\n Salut ! A la prochaine !")
break
@+
Arx Tarpeia Capitoli proxima...
En ligne
#8 23-07-2015 07:40:09
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 16 989
Re : Petit jeu divertissant.
Bonjour,
'ai trouvé 'depuis mon lit) un autre bug de correction.
J'y réfléchis...
@+
Arx Tarpeia Capitoli proxima...
En ligne
#9 23-07-2015 20:53:40
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 16 989
Re : Petit jeu divertissant.
Bonsoir,
Le pb s'est révélé plus ardu que prévu à résoudre.
Il y avait un bug de détection des couleurs mal placées : je pense l'avoir résolu.
# -*- coding: UTF-8 -*-
from random import randint
def presente (Coul_Fr):
db=" "*30+"*"
lcp=db+"*"*13
print(lcp)
print (db+" "*12+"*")
print (db+" MasterMind *")
print (db+" v1.2 *")
print (db+" "*12+"*")
print(lcp)
print("\n\n\n"+"--> Couleurs disponibles :")
print (" ",end="")
for co in Coul_Fr:
print (co[0]+"("+co[1:]+") ",end="")
print("\n--> True indiquera une couleur bien placée et False mal placée,.")
print("--> Il pourra y avoir plusieurs fois la même couleur,")
print("--> Vous avez droit à 12 essais.")
print("\n")
def erreur():
print (" "*40+"Erreur, veuillez recommencer...")
def affiche(C):
for l in C:
print (l," ",end="")
def recommencer():
print(" Voulez-vous commencer une autre partie (O/N) ",end="")
encore=input().upper()
if len(encore)!=1 and encore not in "ON":
print ("Erreur, réponse par O, o, N ou n attendue...")
recommencer()
return encore
def choix_combi(Cl):
ok=0
while 1:
c=""
print (" "*40+"Votre combinaison (en 4 lettres) : ", end="")
c=input().upper()
if len(c)!=4:
erreur()
else:
for cc in c:
if cc not in Cl:
erreur()
else:
ok+=1
if ok==4:
affiche(c)
print (" ..... ",end="")
break
return c
# Couleurs=['blue', 'brown', 'orange', 'purple', 'red','silver','teal', 'yellow']
Coul_Fr=["Bleu","Marron","Orange","Pourpre","Rouge","Argent","Vert","Jaune"]
Init_coul_fr=["B","M","O","P","R","A","V","J"]
presente(Coul_Fr)
code=[]
fin_essai=12
while 1:
essai,gain,fin,Rep=0,0,0,[]
while 1:
for coul in range(4): # tirage du code
code.append(Init_coul_fr[randint(0,7)])
for essai in range(1,fin_essai+1):
combi=choix_combi(Init_coul_fr) # Proposition du joueur
Rep=list(combi.upper()) # Tranformation de la chaîne en liste
if Rep==code:
print (" Gagné ! En",essai,"essai"+"s"*(essai>1)+".\n")
gain=1
break
else:
Cd,Rp,Pos,Verif,vues=code[:],Rep[:],[],[],0
for ir,lr in enumerate(Rp):
if lr==Cd[ir]:
Pos.append(ir)
Verif.append(True)
flag=len(Pos)
for j,i in enumerate(Pos):
del Rp[i-j]
del Cd[i-j]
vues=1
while vues<5-flag:
for ir,lr in enumerate (Rp):
if lr in Cd: # Teste si la couleur est dans le code
for ic, lc in enumerate(Cd):
if lr==lc:
Verif.append(False)
del Cd[ic]
del Rp[ir]
break
vues+=1
if Verif!=[]:
print ("_ _ _ _\n")
else:
affiche(Verif)
print("\n")
break
if gain==0:
print ("\n Désolé, vous avez perdu ! La réponse était : ",end="" )
affiche(code)
print("\n")
Rec=recommencer().upper()
if Rec=="N":
print ("\n\n Salut ! A la prochaine !")
break
Je prends une copie du code et une copie de la Réponse.
Je procède en 2 passages
1. Détection des couleurs bien placées
2. Détection des couleurs mal placées.
Dans les 2 cas, je supprime du code et de la Réponse les couleurs détectées.
Pour les bien placées, je relève leur position puis je les supprime une par une.
Pour les mal placées, je les supprime une par une et à chaque fois, je sors des boucles et y retourne jusqu(à avoir passé en revue toutes les couleurs de la Réponse...
Je vais voir si je peux simplifier...
@+
Arx Tarpeia Capitoli proxima...
En ligne
#10 24-07-2015 00:07:41
- tibo
- Membre expert
- Inscription : 23-01-2008
- Messages : 1 097
Re : Petit jeu divertissant.
Salut,
J'y ai passé ma soirée mais je suis enfin parvenu au bout.
Ça faisait longtemps que je voulais programmer un Mastermind, et vous m'avez donné envie de m'y mettre ce soir.
Par contre excusez moi par avance pour le code complétement à l’arrache. Au début, j'essayais de bien commenter, mais rapidement mes mauvaises habitudes ont repris le dessus.
et pour les fainéants, une petite AI en plus.
Par IA, je n'entend pas un algorithme complexe, mais simplement un script qui calcule toutes les possibilités et en choisi une au hasard.
[Edit] Attention avec l'IA à ne pas mettre trop de couleurs ET de trous car le nombre de possibilités augmente très très vite.
Et il faudrait optimiser un peu le code, notamment je déteste utiliser la commande global. Je trouve ça profondément moche.
Dernière modification par tibo (24-07-2015 08:33:18)
A quoi sert une hyperbole?
----- A boire de l'hypersoupe pardi !
Hors ligne
#11 24-07-2015 00:29:16
- Terces
- Membre
- Inscription : 16-07-2015
- Messages : 466
Re : Petit jeu divertissant.
Salut, piouf génial je suis content d'avoir "motivé" yoshi afin de te "motiver" à toi également :o, j'ai juste lancé ton programme pour voir à quoi ca ressemblait et c'est très beau^^ je le testerais plus en détail après ou demain.
Voila je viens de le tester, je n'ai pas rencontré de souci^^
Dernière modification par Terces (24-07-2015 11:32:31)
La somme des inverses de la suite de Sylvester converge vers 1 plus vite que toute autre série somme infinie d'inverses d'entiers convergeant vers 1.
Hors ligne
#12 24-07-2015 10:53:53
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 16 989
Re : Petit jeu divertissant.
Salut,
Bravissimo !
@+
Arx Tarpeia Capitoli proxima...
En ligne
Pages : 1
Discussion fermée