****************************************************
****************** Simple MASTERMIND **************
****************************************************
Here is a very simple mastermind game in Python 3.7 PyScripter 4.0.0.6 x64
*
done with PyScripter
https://sourceforge.net/projects/pyscripter/
*
The program proposes to find an arrangement of 5 digits among 9
without 0, without double.
he analyzes the responses and responds accordingly.
*
Method:
*
The program builds an array of arrangements
valid from 12345 to 87654, from Min to Max.
This gives 6720 arrangements:
n! / (n-k)! = A
8! / (8-5)! = 6720
https://fr.wikipedia.org/wiki/Arrangement
*
The method is simple:
We start from 12345-1 (Min) and add +1 until (Max = 6720)
all arrangements with 0 and double are rejected.
*
Then the program chooses an arrangement in this table
by a random number from 0 to A (6720)
*
Choice request is made.
it's tested:
If it's: too long, too short, with 0, with doubles : it's rejected.
*
if it's correct:
it's compared to the arrangements to be found.
For a well-placed number: +1 in the variable w
For a misplaced number: +1 in the variable b
If the answer is correct the program stops and displays the score an numbers of try.
In case of wrong answer the program displays w and b
and wait for a new choice.
*
If you enter the previous choice, the program understand
that we do not find the right arrangement, displays the arrangement to be found
and stop.
*
A good exercise for beginners in python for approaching programming
step by step, always try to build subroutines that work
all by themselves in a new independent module and then include them in the main program.
It's easy to modify and everyone can contribute their ideas
by placing print (...) here and there, stops etc etc for improve it.
*
Completely open-source !
Lionel Nivelle 2021
*
The next approach:
The program must find an arrangement that the user suggests
All of Def() of this program are suitable but the program is totaly different.
********************************************************
*****************************************************
****************** Simple MASTERMIND ***************
*****************************************************
Voici un jeu de mastermind tout simple en Python 3.7 PyScripter 4.0.0.6 x64
*
édité à l'aide de PyScripter
https://sourceforge.net/projects/pyscripter/
*
Le programme propose de trouver un arrangement de 5 chiffres parmi 9
sans 0 , sans double.
il analyse les réponses et réponds en conséquence.
*
Méthode :
*
Le programme construit un tableau des arrangements
valables de 12345 a 87654 , de Min à Max .
Cela donne 6720 arrangements :
n! / (n-k) ! =A
8! / (8-5) ! = 6720
https://fr.wikipedia.org/wiki/Arrangement
*
La méthode est simple :
On part de 12345-1 (Min) et on ajoute +1 jusqu'a (Max)
tous les arrangements avec 0 et des doubles sont rejetés.
*
Puis le programme choisi un arrangement dans ce tableau
par un nombre aléatoire de 0 a A (6720)
*
Une demande de choix est faite .
il est testé :
S'il est : trop long ,trop court, avec des 0 , avec des doubles
il est rejeté .
*
s'il est correct:
il est comparé à l’arrangement à trouver.
Pour un chiffre bien placé : +1 dans la variable w
Pour un chiffre mal placé : +1 dans la variable b
En cas de bonne réponse le programme s'arrête et affiche le score.
En cas de mauvaise réponse le programme affiche w et b
et attends un niveau choix.
*
Si on entre le choix précédent , le programme comprend
que l'on ne trouve pas le bon arrangement et affiche l'arrangement à trouver
et s'arrête.
*
Un bon exercice pour débutant en python pour l'approche d'une programmation
pas à pas , tenter toujours de construire des sous routines qui fonctionnent
toutes seules dans un nouveau module indépendant et ensuite les inclure dans le programme principal .
Il est simple à modifier et chacun peut y apporter ses idées
en y plaçant de print(...) par ci par là , des arrêts etc etc pour l’améliorer.
*
Et complètement Open-source !
Lionel Nivelle 2021
*
La prochaine approche :
Le programme doit trouver un arrangement que l'utilisateur propose
Toutes les sous-routines sont utilisables mais le programme devient tres different
*
**********************************************************************************
#-------------------------------------------------------------------------------
# Name: le pc propose mastermind
# Purpose:
# Author: Lionel Nivelle
# Created: 24/10/2021
# Licence: <Open-Source>
# PyScripter 4.0.0.6 x64
#-------------------------------------------------------------------------------
import secrets
# Super Mastermind
# 8 couleurs 5 cases en 12 rangées : le "Super" Master Mind
"""
Il se présente généralement sous la forme d'un plateau perforé de 10 ou 12 rangées de 4 ou 5 trous pouvant accueillir des pions de couleurs.
Les 6 couleurs sont dans la version originale : jaune, bleu, rouge, vert, blanc, noir.
"""
Tableau=[0]*6721 # tableau des combinaisons : voir formule de maths
Max = 87654
Min = 12345
Codage =[12] # tableau des reponse bien place / mal placé
def Nodouble(x): # si dans x y a un double return = False
Double = True
for i in range (0,len(x)):
for j in range (0,len(x)):
#print ( x[i] , " " , x[j])
if (x[i] == x[j]) and j!=i:
Double = False
return Double
def Lettre(x):
#cherche une lettre dans une chaine x
#que des chiffres : Lettre= None
#avec des lettres : Lettre <> None
OK= False
for i in range (0, len(x)):
if not(int(ord(x[i]))>=48 and int(ord(x[i]))<=57):
return OK
def Entrée(x): # controle de l'input du joueur
OK = False
if Nodouble(x):
OK = True #pas de double
else:
print('double')
OK = False
if OK:
if x.count(str(0))==0:
OK = True #pas de zero
else:
print ('zero')
OK = False
if OK:
if len(x)==5:
OK = True #bonne longueur
else:
print ('longueur')
OK = False
if OK:
if Lettre(x)== None: #pas de lettre
OK = True
else:
print ('lettre')
OK = False
return OK
def ChoixDuPc(a): # le pc choisi une combinaison <sans double , sans 0
# a partir du tableau de 6720 elements
while a>6720:
a= secrets.randbelow (6721)
if a>6720: # *********** en cas d'erreur peu probable
print (Tableau[a])
return (Tableau[a])
def analyse(x , Atrouver):
b=0
w=0
s=""
for i in range (0, len(x)):
for j in range (0, len(x)):
if x[i] == Atrouver[j]:
if i==j:
w+=1
else:
b+=1
s=str(w)+str(b)
return s
def Cls():
for i in range(50):
print()
print ('MASTERMIND')
print ('en entrant 2 fois la même combinaison : le jeu s''arrête' )
print ('et donne la reponse ')
print()
# ***********************************************************
# *********** construction du tableaux de combinaisons ***************
# *********** pas de 0 , pas de double **********************
# ***********************************************************
code = Min-1
CODE=str(code)
# OK = False
Nombredecode=0
for i in range (Min , Max+1):
code+=1
CODE=str(code)
# test absence de 0 et de 9
if CODE.count("0")==0 and str(CODE).count("9")==0:
# test presence de double
if Nodouble(CODE):
Nombredecode+=1
Tableau[Nombredecode]= CODE
# print (CODE)
# Atrouver
Atrouver= (ChoixDuPc(7000)) # 7000 pour forcer la boucle dans la def
# print (Atrouver) # ecrit la combinaison a trouver pour controle
Cls() # remonte l'ecran
#***********************************************************
#********************** entree au clavier ************************
#***********************************************************
precedente="" # entrée precedente
Stop=False
tour=0 # entree au clavier
fin='non'
while fin=='non':
N=False # True si entree correcte pas de 0 , de double , longueur = 5 , pas de lettre
while N==False:
n=input(' votre entrée : ')
if Entrée(n) == True:
N=True
else:
N= False
tour+=1
#**********************************************************
#*************** analyse *************************************
#**********************************************************
Retour = analyse(n , Atrouver)
print ('tour N° :' , tour , 'proposition',n , 'bien placé :' ,Retour[0] , 'mal placé :' ,Retour[1] , end ='')
# *********************************************
# *********** test reponse = precedente ************
# *********************************************
if n==precedente:
print (' *** STOP ****')
Stop=True
else:
precedente=n
# *********************************************
# *********** arrêt voulu ou gagné ******************
# *********************************************
if Retour[0] == '5':
fin ='oui'
else:
if Stop:
print ('la reponse est : ',Atrouver)
print ('bye')
fin="oui"
if not(Stop):
#*********************************************************
#*************** gagné *************************************
#*********************************************************
print()
print('********************************************')
print ('BRAVO , trouvé en ', tour , 'coup', end ="")
if tour>1:
print('s')
else:
print()
**********************************************************