begin process at 2010 03 17 23:58:40
  Trouver un code source :
 
dans
 
Accueil > Forum > 

VB.NET et VB 2005

 > 

Divers

 > 

General

 > 

Problème sur un Mastermind


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Problème sur un Mastermind

samedi 20 mai 2006 à 12:33:30 | Problème sur un Mastermind

louloute26

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é = False

nbbon = 0

nbplace = 0

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

For i = 0 To 4

stockmyst(i) = mystere(i)

Next

' --- Remplir le tableau prop ---

For i = 0 To 4

prop(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 4

stockprop(i) = prop(c, i)

Next

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

For i = 0 To 4

If stockprop(i) = stockmyst(i) Then

nbbon = 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) Then

nbplace = nbplace + 1

stockprop(i) = stockmyst(j) = 8

EndIf

EndIf

EndIf

Next

EndIf

Next

' --- Résultats ---

If nbbon < 5 Then

MsgBox(

"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 c

MsgBox(

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

Next

c = c + 1

If c > 6 Then

quitter = MsgBox(

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

If quitter <> 6 Then

MsgBox(

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

ExitSub

EndIf

EndIf

Else

deviné =

True

MsgBox(

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

rejouer = MsgBox(

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

EndIf

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 !
dimanche 21 mai 2006 à 00:21:24 | Re : Problème sur un Mastermind

Dowin

Membre Club

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

dimanche 21 mai 2006 à 00:28:39 | Re : Problème sur un Mastermind

crenaud76

Réponse acceptée !
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
dimanche 21 mai 2006 à 10:36:43 | Re : Problème sur un Mastermind

louloute26

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 !


Cette discussion est classée dans : chiffres, to, combinaison, prop, mystere


Répondre à ce message

Sujets en rapport avec ce message

Problème sur un Mastermind... aidez-moi svp !! [ par louloute26 ] 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 fa Faire une combinaison de chiffres [ par odeesey ] Bonjour je suis debutant en VB et je voudrai un code pour trouver toute les combinaison possible de chiffre.Sachant que ces chiffre seront introduit d boucles imbriquées [ par oolivierr ] Bonsoir,je débute en VisualBasic 6 et je souhaiterai avoir une précision sur un problème d'optimisation sur les boucles imbriquées.Je m'expliqueje sou HELP! comment désactiver la combinaison clavier CTRL+ESC?? [ par asel ] voilà, la qst est dans le titre, je voudrais savoir comment désactiver (et réactiver) cette combinaison de touches, car j'ai trouvé comment faire pour un tri un peu spécial dans un tableau [ par snake57 ] Bonjour a tousJe dois effectuer une sorte de tri dans un tableau en fait mon tableau ne peu contenir que 3 chiffres diffèrent par exemple 6,7,8. Si pl Screensaver [ par jphermans ] Hello everybody,Sorry for the english text but i can not write the french , i can only read it.What i want to ask is the following.I'm creating a scre label1 to 10 ? [ par ravachol ] bonjour,je voudrais renommer plein de label (ou autre)label1.caption label2.caption ....est il possible d'utiliser un boucle forfor i=1 to 10labeli.ca Word ... Switch to .. Reply URGENT merci [ par Nightcourrier ] bonjour a tous, J'utilise word .. tous va bien . Cependant des fois quand J'essais de réouvrir un fichi Comment permuter des lignes d'une matrice ? [ par franchise ] Je suis une débutante en VB et je dois faire une résolution de système d'équations de n variables sur VB. J'ai réussi le tout mais mon gros problème e Appel d'une fonction [ par zapping ] Je n'arrive pas à faire fonctionner la fonction ci dessousavec des appels de type B = InverseMatrice(A())avec A (1 to 2 ; 1 to 2) As Double et B idemm


Nos sponsors


Appels d'offres

Sondage...

CalendriCode

Mars 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,484 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales