Tout d'abord je tiens à préciser que je suis un débutant et que je vais exprimer mon problème du mieux que je peux. J'essaye de faire un mastermind sans interface graphique mais je suis confronté à un problème au moment d'afficher les résultats (Bien ou mal placé). Aucun random n'est ajouté, cela se joue à 2, 1 Codeur et 1 Décodeur.
Dans la plupart des cas cela s'affiche bien sans erreurs, cependant dans certains cas particulier il y a une anomalie.
Pour mieux expliciter le problème, je vais donner un exemple.
Lorsque je rentre dans le "Code" : 1234
Et que je "Décode" en : 2143; et bien dans ce cas cela me renvoie 2 Mal Placés et 2 Faux, or, je souhaiterai que cela me renvoie 4 Mal Placés, car aucun n'est faux.
J'aimerai donc comprendre ce qu'il ne vas pas dans mon code, et ainsi, comment faire pour m'afficher 4 Mal Placés au lieu de 2.
def codeur():
global codeFinal
global partie
global nbPartie
print(nbPartie)
while partie != nbPartie:
print("Votre palette de couleur est Jaune, Bleu, Vert et Rouge")
codeFinal = input("Veuillez saisir vos 4 couleurs (Jaune = 1 Bleu = 2 Vert = 3 Rouge = 4) : ")
if len(codeFinal) == 4 and 0 < int(codeFinal[0]) <= 4 and 0 < int(codeFinal[1]) <= 4 and 0 < int(codeFinal[2]) <= 4 and 0 < int(codeFinal[3]) <= 4 :
print("Votre code est le : "+codeFinal)
decodeur()
else:
print("non")
def decodeur():
global codeFinal
global partie
global nbPartie
print(str(codeFinal))
bonneCouleurBienPlace=0
tentative = 0
points = 12
while tentative != 12 or bonneCouleurBienPlace < 4:
tentative = tentative + 1
bonneCouleurBienPlace = 0
faux = 0
quasi = 0
codeFinalJoueur = input("Veuillez rentrer votre code (Jaune = 1 Bleu = 2 Vert = 3 Rouge = 4) : ")
if len(codeFinalJoueur) == 4 and 0 < int(codeFinalJoueur[0]) <= 4 and 0 < int(codeFinalJoueur[1]) <= 4 and 0 < int(codeFinalJoueur[2]) <= 4 and 0 < int(codeFinalJoueur[3]) <= 4 :
for i in range(0, len(codeFinal)):
for j in range(i, len(codeFinalJoueur)):
if codeFinalJoueur[i] == codeFinal[i]:
bonneCouleurBienPlace += 1
break
elif codeFinalJoueur[j] == codeFinal[i]:
quasi += 1
break
faux = len(codeFinal) - bonneCouleurBienPlace - quasi
if tentative == 12:
print("Malheuresement tu n'as pas trouvé le code.")
partie = partie + 1
if partie == nbPartie:
finPartie()
else:
codeur()
if bonneCouleurBienPlace == 4:
print("Bravo, tu as trouvé le code, tu gagnes " + str(points) + " points")
print(str(bonneCouleurBienPlace))
partie = partie + 1
if partie == nbPartie:
finPartie()
else:
codeur()
points = points - 1
print(str(tentative) + " Tentative(s)")
print("Vous avez " + str(bonneCouleurBienPlace) + " bonne couleur bien placé")
print("Vous avez " + str(quasi) + " couleur mal placé")
print("Vous avez " + str(faux) + " fausse couleur")
Le code semble assez brouillon et difficilement lisible voir compréhensible.
On y retrouve le terme global qui n'aide pas pour le debug.
Je vois plusieurs choses,
Tout d'abord les constantes comme les couleurs par exemple, qu'on pourrait mettre en tout début de code,
JAUNE = 1
BLEU = 2
... = ...
ce qui évite des entiers à se balader sans qu'on sache leur intérêt dans le code.
Puis il y a les informations liées au jeu qu'on pourrait placer dans un dictionnaire,
partie = {
'tentatives': 0,
'tentatives_max': 12,
'code_final: '...',
'...': '...',
}
# Toutes les informations utiles pour gérer la partie se trouve dans ce dictionnaire.
Et des incompréhensions,
Les print ne se trouvent pas dans une fonction, le mot clé return doit être présent sauf si l'on crée une autre fonction d'affichage du même style que print.
Il faut donc déjà revoir tout ça, pour que le code soit plus compréhensible et maintenable...
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard) La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
Ce n'est pas si simple à coder, il faut déjà bien avoir compris la règle en tant que telle, indépendamment de Python, c'est le point n°1.
Je ne vais pas rentrer dans le détail de ton code car je le trouve trop complexe (l'algo n'est pas apparent), pas assez découpé (tes fonctions font plein de choses qu'elles ne devraient pas faire, comme gérer les entrées de l'utilisateur), avec des variables globale, des fonctions sans paramètres, etc.
Déjà, sois certains de bien avoir compris les règles de score , en particulier en cas de doublons.
Ensuite, ignore la gestion des entrées utilisateur, ce n'est pas le boulot d'une fonction qui te renvoie le score blancs/noirs. Il te faut une fonction get_score(code, guess) avec deux paramètres.
Prenons ton exemple
1234 (code)
2143 (guess)
(code est le code inconnu et guess est la proposition du joueur). Tu as donc les deux listes d'entiers code = [1, 2, 3, 4] et guess = [2, 1, 4, 3]. Je suppose qu'il y a 6 couleurs de 1 à 6. Pour simplifier le calcul du score, tu crées une liste provisoire state qui enregistre l'état initial du code (la liste va évoluer au fur et à mesure qu'on calcule le score). Comme tu as 6 couleurs indexée à partir de 1, state aura 7 valeurs, initialisée à 0 et la première (indice 0) ne servira pas. La valeur de state[i] indiquera une information sur le nombre de pions de couleurs i dans le code. Donc, au départ, tu auras avec ton exemple :
state=[0, 1, 1, 1, 1, 0, 0]
Le score noir
Ce sera une variable noirs qui au départ vaut 0. C'est donc le nombre de pions bien placés : c'est très simple, tu parcours "en parallèle" (simple boucle for) ton code inconnu et le guess et chaque fois que les pions sont de couleur identique disons i à une même position
tu augmentes de 1 ta variable noirs
tu diminues de 1 state[i] où i est la valeur de la couleur commune
tu places -1 à la place de guess[j] où j est l'indice courant de parcours.
Pour ton exemple, noirs va rester à 0.
Le score blanc
Ensuite tu calcules le score blanc (pareil, au départ une variable blanc qui vaut 0). Tu parcours la liste correspondant à guess et en appelant i l'indice courant dans ton parcours et en supposant que guess[i] vaille k :
si k vaut -1, ignorer
sinon, examiner state[k] et s'il ne vaut pas 0, diminuer sa valeur de 1 et rajouter 1 à blanc.
Dans ton exemple, quand tu vas d'abord lire 2 dans guess, blancs va augmenter de 1 car state[2] ne vaut pas 0 et state vaudra ensuite
[0, 1, 0, 1, 1, 0, 0]
Puis, tu vas lire 1 dans guess et comme state[1] ne vaut pas 0, blancs va encore augmenter de 1 et state va évoluer vers :
[0, 0, 0, 1, 1, 0, 0]
Puis tu lis 4, blancs passe à 3 et state devient
[0, 0, 0, 1, 0, 0, 0]
Enfin, tu lis 3, blancs passe à 4 et state devient
[0, 0, 0, 0, 0, 0, 0]
et, comme guess a été completement lu, ta fonction get_score peut renvoyer le couple (0, 4) pour noirs/blancs.
Si tout ceci te paraît trop compliqué c'est que, selon moi, tu n'es pas prêt pour faire cet exo (qui je le répète, n'a rien d'évident si on a peu d'expérience en Python et si on n'a jamais été confronté à des situations algorithmiques).
Tu pourras certainement y arriver avec ton code mais probablement au prix de longs débogages et pour te retrouver avec un code peu lisible et peu maintenable.
- Edité par PascalOrtiz 17 novembre 2019 à 2:22:19
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
Découverte Python Doc Tkinter Les chaînes de caractères