Manche mastermind PYTHON

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour, j'essaye de faire un autre exercice en python, qui est de simuler une manche de mastermind, le but étant d'indiquer au joueur le nombres de couleurs bien placées.

Mais j'ai un petit soucis, voilà mon code :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#!/usr/bin/python
#-*coding:Latin-1-*

Pions_Masques=["J","J","B","F","O"]
Proposition=[]
compteur=0
Couleurs_saisies=""
print("Bienvenue sur le jeu du mastermind !").upper().center(20)
for v in Pions_Masques:
    Couleurs_saisies=raw_input("Entrez les couleurs \n")
    Proposition.append(Couleurs_saisies)
    for i in Proposition:
        if Pions_Masques[v]==Proposition[i]:
            compteur=compteur+1

print("Il y a :"+str(compteur)+" couleurs bien placées")                        

J'ai une erreur lorsque je l'exécute :

if Pions_Masques[v]==Proposition[i]: TypeError: list indices must be integers, not str

J'ai essayé de retirer les indices et de mettre "Pions_Masques==Proposition:" mais ça ne marche pas.

Voilà si vous avez une idée sur l'erreur ou un conseil sur mon code n'hésitez pas ! Merci d'avance :)

+0 -0

c'est normal:
Pios_Masques contient des lettres v prend a chaque tour de boucle une valeur dans Pions_Masques et après tu fais if Pions_Masques[v] == Proposition[i]

le problème c'est que ta liste attend à l'intérieur de [] un chiffre utilisé comme index et tu lui envoie une lettre et il comprends pas. Tu as plusieurs solutions à ce problème: tu trouve quel index à la lettre contenu dans v.
Ou, à la place d'iterer sur tes lettres tu fais un truc comme ca :
for v in range(len(Pionts_Masques))
De cette manière v ne sera pas une lettre mais un chiffre

En espérant ne pas avoir dit de bêtise

conseil: le thé est meilleur avec un zeste de citron

+0 -0
Staff

Salut,

Tu fais une confusion sur les indices (c'est à dire ce que tu mets entre crochet []) et le contenu du tableau.

Quand tu écris :

1
for i in Proposition:

Tu itères sur toutes les proposition. i est une proposition, c'est déjà déjà un élément de ta liste, en l'occurrence une chaîne de caractères.
Il ne faut pas confondre avec :

1
for i in range(len(Proposition)):

Là, i est bien un entier, compris entre 0 (inclu) et len(Proposition) (exclu).

Le meilleur moyen de comprendre est de déboguer : insère print(i) à la ligne 13 (avant l'instruction fautive) et tu verras que i vaut bien les propositions que tu as entré, et non un entier.

EDIT: j'ai posté avant Bermudes mais lui il explique mieux ;) je te renvoie donc à son post ci-après !

Édité par Algue-Rythme

+0 -0

Salut, premièrement, ton code est-il Python3 ou Python2 ? Parce que ta ligne 8 est assez bizarre et ne devrait, je pense, pas fonctionner en Python3.

Sinon l'erreur te dit que tu utilises des chaînes de caractères en tant qu'indice et pas des entiers, ce qui est en effet ce que tu fais.

Il y a globalement deux manières d'utiliser une boucle for en Python :

  • la première est d'itérer sur les éléments d'une liste, d'un tuple, d'une str, … bref, d'un itérable. Par exemple :
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
l1 = [1, 2, 3, 4, 6]
l2 = ['un', 'deux', 'quatre', 'huit']
for elem in l1:
    print(elem)
for elem in l2:
    print(elem)
# te donnera :
1
2
3
4
6
un
deux
quatre
huit

On peut en déduire que le type de ta variable elem va dépendre de ce que contient la liste. Quand tu utilises une boucle for comme cela, tu n'as pas besoin de ré-indicer ta liste vu que tu accèdes déjà aux éléments l'un après l'autre.

  • la seconde manière est d'utiliser range (souvent couplé avec len) afin de faire une boucle sur les indices. Lorsque tu utilises ta boucle for comme cela, tu dois utiliser les indices. Voici l'équivalent de l'exemple d'au-dessus avec cette méthode :
1
2
3
4
5
6
l1 = [1, 2, 3, 4, 6]
l2 = ['un', 'deux', quatre', 'huit']
for i in range(len(l1)):
    print(l1[i])
for i in range(len(l2)):
    print(l2[i])

Ce code-ci te donnera exactement le même résultat : les mêmes choses seront affichées dans le même ordre.

Cependant, dans le second code, le type de la variable i est imposé par range qui renvoie (yields pour être précis) des entiers.


Ce qu'il faut retenir de mon message et qu'il faut appliquer à ton code, c'est que dans une boucle for avec range, on utilise la variable du for pour indicer la liste (l'itérable), et que dans un for directement sur la liste, tu ne dois pas indicer la liste, et encore moins avec ta variable itérateur car celle-ci n'est pas nécessairement entière.

EDIT: Algue-Rythme a été plus rapide, mais ça me fait mal au cœur de supprimer mon message.

Le hasard n'est que le nom donné à notre ignorance et n'existerait pas pour un être ominscient., Émile Borel

+0 -0
Auteur du sujet

Merci pour vos réponses ! J'ai corrigé mon code, par contre il n'est pas bon ):

  • Lorsqu'une couleur est bonne, il affiche que 2 couleurs sont bonnes;
  • lorsque deux couleurs sont bonnes, il en affiche 4;
  • lorsque les 5 sont bonnes, il en affiche 6.

J'ai essayé de chercher l'erreur mais je vois pas d'ou ça peut venir

+0 -0

Donne la nouvelle version de ton code afin que l'on voie comment tu l'as modifié. :)

Le hasard n'est que le nom donné à notre ignorance et n'existerait pas pour un être ominscient., Émile Borel

+0 -0
Auteur du sujet

Re désolé j'ai été manger. Bah déjà, j'ai changé les boucles initiales,

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#!/usr/bin/python
#-*coding:Latin-1-*

Pions_Masques=["J","J","B","F","O"]
Proposition=[]
compteur=0
Couleurs_saisies=""
print("Bienvenue sur le jeu du mastermind !").upper().center(20)
for v in range(len(Pions_Masques)):
    Couleurs_saisies=raw_input("Entrez les couleurs \n")
    Proposition.append(Couleurs_saisies)
    for i in range(len(Proposition)):
        if Pions_Masques[v]==Proposition[i]:
            compteur=compteur+1

print("Il y a :"+str(compteur)+" couleurs bien placées")    

Mais même avec celui-ci ça ne marche pas, ça me donne pas le bon nombres au niveau du compteur.

J'ai essayé de voir si c'était pas les boucles le problème, mais pour moi elles sont bonnes non ?

On parcourt les deux listes avec les deux boucles et on compare les valeurs 2 par 2. Pour moi ça me semble bon pourtant :s

+0 -0

Tu as un problème du fait que tes deux boucles soient imbriquées. Qu'est-ce que j'entends par là ?

Si comme première couleur tu rentres 'B'. Il va vérifier combien de 'B' il y a et augmenter le compteur. Si après tu rentres 'N', il va revérifier d'abord les 'B' (donc ré-augmenter le compteur de 1), et puis vérifier pour 'N'. Puisque tu vérifies plusieurs fois la même couleur, tu obtiens des problèmes de compteur.

Ce que tu devrais faire, c'est demander toutes les couleurs, et puis seulement les vérifier. Cela te permettrait de vérifier une seule fois chaque couleur (il faudra également penser à traiter le cas où la même couleur est demandée plusieurs fois).

Le hasard n'est que le nom donné à notre ignorance et n'existerait pas pour un être ominscient., Émile Borel

+0 -0

Je te dis qu'en les imbriquant, tu recomptes plusieurs fois les mêmes cases. Il faut donc les dés-imbriquer et puis débugger… ^^

Le hasard n'est que le nom donné à notre ignorance et n'existerait pas pour un être ominscient., Émile Borel

+0 -0

Que si ça ne fonctionne pas, c'est que tu as fait une erreur, et il faut la trouver. :)

Le hasard n'est que le nom donné à notre ignorance et n'existerait pas pour un être ominscient., Émile Borel

+0 -0

Quand il y a quelque chose que tu ne comprends pas, poste ton code, et exprime clairement ta question, ça augmentera largement ta probabilité de recevoir une réponse. ;)

Le hasard n'est que le nom donné à notre ignorance et n'existerait pas pour un être ominscient., Émile Borel

+1 -0
Auteur du sujet

D'ac excuse moi, voilà le code initial :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#!/usr/bin/python
#-*coding:Latin-1-*

Pions_Masques=["J","J","B","F","O"]
Proposition=[]
compteur=0
Couleurs_saisies=""
print("Bienvenue sur le jeu du mastermind !").upper().center(20)
for v in Pions_Masques:
    Couleurs_saisies=raw_input("Entrez les couleurs \n")
    Proposition.append(Couleurs_saisies)
for i in Proposition:
    if Pions_Masques[v]==Proposition[i]:
         compteur=compteur+1

print("Il y a :"+str(compteur)+" couleurs bien placées")                        

Voilà le code qui marche :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
#!/usr/bin/python
#-*coding:Latin-1-*

Pions_Masques=["J","J","B","F","O"]
Proposition=[]
compteur=0
compteur2=0
Couleurs_saisies=""
print("Bienvenue sur le jeu du mastermind !").upper().center(20)
for i in range(len(Pions_Masques)):
    Couleurs_saisies=raw_input("Entrez les couleurs \n")
    Proposition.append(Couleurs_saisies)    
for i in range(len(Proposition)):
    if Pions_Masques[i] in Proposition:
        compteur2=compteur2+1
    if Pions_Masques[i]==Proposition[i]:
        compteur=compteur+1

print("Il y a :"+str(compteur)+" couleurs bien placées et "+str(compteur2)+" bonnes couleurs" ) 

En gros j'ai remplacé l'indice v en i et ça a marché mais je sais pas pourquoi :p

j'ai essayé d'améliorer le code en précisant combien il y a de couleurs sont bonnes dans la liste mais j'ai une erreur, pas le bon nombre dans le compteur 2, il ya toujours une couleurs de trop.

+0 -0

Juste quelques petites remarques : + tente de donner des noms plus explicites que compteur et compteur2 à tes variables tu t'en sortiras déjà mieux dans ton code ; + essaye de trouver une convention pour nommer tes variables (en Python, on aime bien nommer les variables en_minuscules_séparés_par_des_underscores).

Sinon, que tu appelles ta variable i ou v` ne changera strictement rien donc c'estque l'erreur devait venir d'ailleurs.

Pour ta variable compteur2, à nouveau, il y a un problème de comptage multiple. Imagine que Proposition vaille ['J', 'B'] et que tu demandes deux fois si 'J' est dedans, il te dira True les deux fois et donc ton compteur sera trop grand. C'est ce que je disais dans un message précédent : il et faut vérifier que tu ne demandes pas trop de fois la même couleur.

Le hasard n'est que le nom donné à notre ignorance et n'existerait pas pour un être ominscient., Émile Borel

+0 -0
Auteur du sujet

Bah j'ai juste changé :

for v in range(len(Pions_Masques)):

en

for i in range(len(Pions_Masques)):

et

if Pions_Masques[v]==Proposition[i]:

en

if Pions_Masques[i]==Proposition[i]:

Mais j'ai rien fait d'autre, je comprends pas pourquoi il y a un comptage multiple, si Proposition vaut ["J","R","N","F","O"], la boucle va de vérifier qu'une fois que J est dans Pions_Masques non ? vu que la boucle commence à lindice 0 et s'incrémente de 1 à chaque fois

Édité par Drakop

+0 -0

C'est probablement alors parce que tu utilisais une variable i qui n'était pas déclarée que ça plantait.

Sinon, oui, dans ton cas, 'J' ne sera vérifié qu'une seule fois. Maintenant, prenons le cas où Pions_masques = ['J', 'R', 'N'] et Proposition = ['J', 'J', 'V']. Tu vas vérifier deux fois la présence de 'J' alors qu'il ne devrait être vérifié qu'une seule fois.

Le hasard n'est que le nom donné à notre ignorance et n'existerait pas pour un être ominscient., Émile Borel

+0 -0

Pour le problème que j'ai soulevé, tu pourrais par exemple retenir combien de fois tu as déjà compté chaque couleur, ou encore, compter dans Proposition combien de fois la couleur a été proposée, et ensuite compter dans Pions_masques combien de fois elle apparaît. :)

Le hasard n'est que le nom donné à notre ignorance et n'existerait pas pour un être ominscient., Émile Borel

+0 -0
Auteur du sujet

La biblio collections est pas disponible dans python 2 ? Parce que j'ai pas l'impression, javais peut-être pensé à faire ça mais bon, je galère je vois pas comment faire même si je réussis à compter les couleurs.

Je pense continuer plus tard mais merci pour ton aide en tout cas!

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte