Problème sur un Mastermind [Résolu]

Messages postés
4
Date d'inscription
lundi 15 mai 2006
Statut
Membre
Dernière intervention
21 mai 2006
- - Dernière réponse : louloute26
Messages postés
4
Date d'inscription
lundi 15 mai 2006
Statut
Membre
Dernière intervention
21 mai 2006
- 21 mai 2006 à 10:36
Salut !
Je suis débutante en VB, j'apprends ça en cours, et j'ai fait un Mastermind comme projet noté.
Seule ombre au tableau : ça ne marche pas ! Ca fait bien 2 semaines que je passe des heures à m'arracher les cheveux dessus, mais je ne trouve pas la faille. J'ai demandé des conseils à ma prof et elle n'a trouvé aucune erreur de code, normalement ça devrait fonctionner. Elle m'a alors conseillé de faire appel à des forums de spécialistes, d'où ma requête.
Voilà mon code :
Dim

rejouer AsInteger
Dim quitter AsInteger

Dim deviné AsBoolean

Dim nbbon, nbplace AsInteger

Dim i, j, c, k AsInteger

Dim mystere(4) AsInteger

Dim prop(39, 4) AsInteger

Dim stockprop(4) AsInteger

Dim stockmyst(4) AsInteger

rejouer = 6

quitter = 6

MsgBox("Règles du jeu Mastermind : le but est de déchiffrer la combinaison mystère à 5 chiffres compris entre 0 et 4. Pour cela vous ferez des propositions qui seront analysées : pour chaque proposition vous aurez le nombre de chiffres bien placés et le nombre de chiffres mal placés. A partir de là, à vous de déchiffrer la combinaison en un nombre d'essais minimum. Bonne chance !", , "Règles du jeu")

DoWhile rejouer = 6

' --- Initialisation des variables ---

deviné = False

nbbon = 0

nbplace = 0

i = 0

j = 0

c = 0

k = 0

For i = 0 To 4

mystere(i) = 8

Next

For i = 0 To 4

For j = 0 To 4

prop(i, j) = 8

Next

Next

For i = 0 To 4

stockmyst(i) = 8

Next

For i = 0 To 4

stockprop(i) = 8

Next

' --- Combinaison mystère ---

For i = 0 To 4

Randomize()

mystere(i) = Int(Rnd() * 5)

Next

MsgBox(mystere(0))

MsgBox(mystere(1))

MsgBox(mystere(2))

MsgBox(mystere(3))

MsgBox(mystere(4))

'--- Lancement du jeu ---

DoWhile deviné Falsenbbon 0

nbplace = 0

' --- Copie du tableu mystere (pour manipuler) ---

For i = 0
To 4stockmyst(i) = mystere(i)

Next

' --- Remplir le tableau prop ---

For i = 0
To 4prop(c, i) = InputBox(

"Proposition pour la case " & i + 1 &
" de la combinaison",
"Proposition de combinaison")

Next

' --- Copie du tableau prop (pour manipuler) ---

For i = 0
To 4stockprop(i) = prop(c, i)

Next

' --- Comparer la combinaison mystere et la proposition ---

For i = 0
To 4

If stockprop(i) = stockmyst(i)
Thennbbon = nbbon + 1
stockprop(i) stockmyst(i) 8

Else :
For j = 0
To 4

If stockprop(i) <> 8
Then

If stockprop(i) = stockmyst(j)
Then

If stockmyst(j) <> stockprop(j)
Thennbplace = nbplace + 1
stockprop(i) stockmyst(j) 8

End
If

End
If

End
If

Next

End
If

Next

' --- Résultats ---

If nbbon < 5
ThenMsgBox(

"Vous avez " & nbbon &
" chiffre(s) bien placé(s) et " & nbplace &
" chiffre(s) mal placé(s). Courage !", ,
"Résultats")

' ---Affichage des propositions ---

For k = 0
To cMsgBox(

"Proposition " & k + 1 &
" : " & prop(k, 0) & prop(k, 1) & prop(k, 2) & prop(k, 3) & prop(k, 4), ,
"Combinaisons proposées")

Nextc = c + 1

If c > 6
Thenquitter = MsgBox(

"Vos neurones sont à bout ? Marre de chercher ? Allez, soyez courageux ! Sinon, cliquez sur Non, mais honte à vous !!", MsgBoxStyle.YesNo,
"Continuer ?")

If quitter <> 6
ThenMsgBox(

"Pfff... Abandon... Un peu de persévérance ! Pour info, la combinaison était : " & mystere(0) & mystere(1) & mystere(2) & mystere(3) & mystere(4) &
".", ,
"Solution")

Exit
Sub

End
If

End
If

Elsedeviné =

TrueMsgBox(

"Bravo ! Vous avez réussi à déchiffrer la combinaison en " & c + 1 &
" essais.", ,
"Gagné !!")rejouer = MsgBox(

"Souhaitez-vous refaire une partie ?", MsgBoxStyle.YesNo,
"Rejouer ?")

End
If

Loop

Loop

Pour la petite explication, en fait le tableau mystere stocke les 5 chiffres (de 0 à 4) de la combinaison, définis aléatoirement. Le tableau prop est rempli par l'utilisateur, ce sont ses propositions. La variable nbbon représente le nombre de chiffres bien placés (de la proposition) et nbplace le nombre de chiffres mal placés.
Et pour comparer les 2 combinaisons (mystere et prop), je stocke le contenu de chacun des 2 tableaux dans un autre tableau : stockmyst et stockprop, sur lesquels on va pouvoir faire des manipulations, puisque ce sont des copies.
Si les chiffres comparés sont les mêmes, pas de problème, on incrémente nbbon de 1 et on efface le contenu des 2 cases en question. Quand je dis effacer, ce n'est pas vraiment effacer, je le mets à 8 en fait, c'est-à-dire une valeur bidon, autre que des chiffres de 0 à 4.
En revanche, si les chiffres sont  mal placés, ça se complique un peu. Dans ce cas, on compare le chiffre en question avec tous les chiffres de mystere, jusqu'à tomber sur le même chiffre (ou pas, si ce chiffre n'est pas du tout dans la combinaison mystere). Si on tombe sur le même chiffre, on incrémente nbplace de 1 puis on efface le contenu des 2 cases en question. Ca évite que si le même chiffre revient plusieurs fois dans la proposition, il soit compté 2 ou plusieurs fois comme nbplace alors qu'il n'y en a qu'1 dans la combinaison mystere.
Voilà en gros l'explication de ma logique. Normalement, ça devrait marcher. Parfois c'est le cas, mais parfois ça ne marche pas. Et ni moi ni ma prof ne comprenons pourquoi...
J'espère que quelqu'un ici pourra m'éclairer, je dois rendre mon projet dans moins d'une semaine, et pour ma satisfaction personnelle j'aimerais bien que mon Mastermind marche quand je le rendrai...
Merci bien de vous pencher sur mon cas.
Et bonne chance, bon courage !
Afficher la suite 

3 réponses

Meilleure réponse
Messages postés
4172
Date d'inscription
mercredi 30 juillet 2003
Statut
Membre
Dernière intervention
9 juin 2006
17
3
Merci
Si ta prof n'a trouvé aucune erreur de code dans ta source, ... tu pourras lui mettre une petite tarte de ma part, là !! , juste au dessus de la nuque !
En VB, Une ligne du type de "stockprop(i) stockmyst(i) 8", n'a pas le sens que tu crois !! J epense que tu veux à cet endroit mettre les item des deux tableaux à 8 ! Or, ce que tu demandes effectivement à VB, c'est de stocker dans stockprop(i), le résultat du test "stockmyst(i)=8 ?" !! comme stockmyst(i) est forcément différent de 8, ce test retourne False, donc traduit par un zéro en integer, zéro qui est stocké dans stockprop(i) !!! VB ne réagit pas comme le C à ce niveau !! En VB, tu dois faire ca en deux lignes ...
stockprop(i) = 8
stockmyst(i) = 8

ensuite, ton "If stockprop(i) <> 8 Then" jsute après le "For j = 0 to 4" est je pense inutile ! En effet, tu es dans un Else, alors que stockprop(i) ne peut être égal à 8 que si tu es passé dans la clause Then, tu ne peux donc pas avoir stockprop(i) égal à 8 à ce niveau. Et puis cette clause "Else", qui vérifie les mal placé si j'ai bien compris me parait un peut complexe ! En fait, pour une vérif complete de la combinaison, je ferais Un truc du genre ...
For i = 0 to 4
If Stockprop(i) = Sotckmyst(i) Then
Nbbon += 1
Else
For j = 0 to 4
If j <> i Then
If Stockprop(i) = Sotckmyst(j) Then NbPlace += 1
End If
Next j
End If
Next i

J'ai pas testé mais cela dois pas etre bien loin du but !
ET tu remettras une petite tarte à ta prof de ma part !!!

CR
Cela devrait nous suffire !
Et comme je ne touche pas au tableau, je ne suis pas certain que tu es besoin de passer par des tableau intermédiaire !

CR

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 195 internautes nous ont dit merci ce mois-ci

Commenter la réponse de crenaud76
Messages postés
11
Date d'inscription
mardi 5 octobre 2004
Statut
Membre
Dernière intervention
15 avril 2008
0
Merci
Salut, j'ai essayer de résoudre ton probleme, voici mon code basé sur le tien  :




Dim Mystere(4, 1) As Integer


Dim Test(4) As Integer


Dim Proposition(5, 4) As Integer


Dim NbreBon, NbrePlace, NbreMauvais, NbreProposition As Integer


Dim i, j As Integer


Dim Quitter, Rejouer As Integer


Dim Trouve As Boolean


 


Quitter = 6


Rejouer = 6


Do While Rejouer = 6


Trouve = False


'Nombre mystère à trouver


For i = 0 To 4


Randomize()


Mystere(i, 0) = Int(Rnd() * 5)


Next


For i = 0 To 4


Test(i) = 0


Mystere(i, 1) = 0


Next


NbreBon = 0


NbrePlace = 0


NbreMauvais = 0


MsgBox(Mystere(0, 0) & Mystere(1, 0) & Mystere(2, 0) & Mystere(3, 0) & Mystere(4, 0))


Do While Trouve = False


'Entrée des propositions


For i = 0 To 4


Proposition(NbreProposition, i) = InputBox("Entrez votre proposition pour le chiffre : " & i + 1)


Next


'Test des propositions pour voir si elles sont bonnes et bien placées


For i = 0 To 4


If Proposition(NbreProposition, i) = Mystere(i, 0) Then


Test(i) = 1


Mystere(i, 1) = 1


End If


Next


'Test des propositions pour voir si elles sont mal placées ou mauvaises


For i = 0 To 4


For j = 0 To 4


If Test(i) 0 And Mystere(j, 1) 0 Then


If Proposition(NbreProposition, i) = Mystere(j, 0) Then


Test(i) = 2


Mystere(j, 1) = 2


End If


End If


Next


Next


'Comptage des propositions


For i = 0 To 4


Select Case Test(i)


Case 0


NbreMauvais += 1


Case 1


NbreBon += 1


Case 2


NbrePlace += 1


End Select


Next


'Boite de dialogue si les propositions sont bonnes


If NbreBon = 5 Then


Trouve = True


MsgBox("Bravo, vous avez trouvé !!!", MsgBoxStyle.Exclamation, "Gagné!!!")


Rejouer = MsgBox("Voulez-vous refaire une partie ?", MsgBoxStyle.YesNo, "Nouvelle partie ?")


If Rejouer <> 6 Then End


Else


'Résultats de propositions du joueur


MsgBox("Bons : " & NbreBon & " ; Mal placé : " & NbrePlace & " ; Mauvais : " & NbreMauvais)


'Quitter ou Rejouer


If NbreProposition <= 6 Then


Quitter = MsgBox("Voulez-vous continuer le jeu ?", MsgBoxStyle.YesNo)


If Quitter <> 6 Then


End


Else


For i = 0 To 4


NbreBon = 0


NbrePlace = 0


NbreMauvais = 0


Next


For j = 0 To NbreProposition


MsgBox("Proposition " & j + 1 & " : " & Proposition(j, 0) & Proposition(j, 1) & Proposition(j, 2) & Proposition(j, 3) & Proposition(j, 4))


Next


End If


Else


MsgBox("Le jeu est fini, la bonne combinaison était : " & Mystere(0, 0) & Mystere(1, 0) & Mystere(2, 0) & Mystere(3, 0) & Mystere(4, 0))


Rejouer = MsgBox("Voulez-vous refaire une partie ?", MsgBoxStyle.YesNo, "Nouvelle partie ?")


If Rejouer <> 6 Then End


End If


End If


 


'Incrémentation du nombre de propositions


NbreProposition += 1


Loop


Loop


Je pense que le plus simple serait quand même de faire une interface graphique avec une form, des textbox et des boutons, mais c'est toi qui vois . J'espère que ca t'aidera! DoWin
Commenter la réponse de cs_Dowin
Messages postés
4
Date d'inscription
lundi 15 mai 2006
Statut
Membre
Dernière intervention
21 mai 2006
0
Merci
Merci bien DoWin et crenaud76 !!
Je commençais à désespérer de voir mon Mastermind marcher un jour !

DoWin : Alors en fait, si je ne fais pas mon programme avec une interface (ce qui serait certainement plus simple pour ça, effectivement), c'est parce que cette année à cause des grèves on a pas pu apprendre à s'en servir, et comme on est des sous-doués de l'informatique, on sait pas apprendre tout seuls. Donc la prof nous a demandé un truc simplement avec la commande.
Quant à ton code, merci beaucoup de t'être penché dessus. Là je suis en pleine période de partiels, donc j'ai pas vraiment le temps de regarder ça en détail. Mais dès que je serai en vacances je regarderai, comment je peux améliorer le mien en m'inspirant du tien.

crenaud76 : Déjà, je pense que si je mets une tarte à ma prof, ma note risque de descendre en flèche ! lol Et puis ça me ferait mal au coeur, c'est peut-etre pas une spécialiste de VB mais je l'aime bien elle est sympa.D'autre part, en fait hier je suis retournée voir mon copain Mastermind, et j'ai regardé d'ou venait le problème en suivant par étapes avec des points d'arrêt. Et en fait j'ai trouvé l'erreur, c'était bien cette histoire de stock1 stock2 8. Mais merci de ton explication, j'avais pas compris pourquoi il le remettait à 0. Comme ça marchait pour l'initialisation de mettre 2 variables à 0 sur la même ligne, j'ai cru que ça marchait aussi comme ça. Mais en fait non, pour l'initialisation sur la même ligne on utilise une virgule, et c'est compris dans un Dim.
Pour le "If stockprop(i) <> 8 Then" juste après le "For j = 0 to 4" : je crois qu'il est utile dans le cas ou on a changé la valeur de stockprop (à 8), mais ou la boucle de j n'est pas terminée : si on a trouvé un chiffre mal placé, on a mis sa valeur à 8 (déjà traité), mais la boucle continue, donc si on ne veut pas qu'il compare ce 8 à un chiffre effacé précédemment dans stockmyst, il faut le rajouter. A moins effectivement (j'y pense à l'instant) de rajouter un Exit Do ou quelque chose du genre après l'incrémentation de nbplace. En fait j'avais déjà essayé un truc sans tableaux intermédiaires, mais ça marchait pas non plus et ça m'a pris la tête alors j'avais essayé autrement. Mais oui c'est possible (même probable) que ça marche sans tous ces tableaux.
Pour ta proposition, même réponse qu'à DoWin : je testerai une fois mes partiels finis, parce que là je suis un peu en galère (comme d'hab...).

A tous les 2 : En tout cas merci beaucoup d'avoir apporté un peu de votre temps à mon problème. C'est sympa. Et puis tant qu'on y est ... vous avez l'air bien calés en VB ... je connais un pote de ma classe, sur ce forum aussi, qui a un problème avec son BlackJack. Si vous pouviez y jeter un oeil... Son pseudo c'est beyleixa, son code est là http://www.vbfrance.com/infomsgt_ALGORITHME_229.aspx. Merci pour lui !

Bonne journée !
Commenter la réponse de louloute26