Variables nulles qui ne devraient pas l'être : d'où vient l'erreur ?
cs_Lisla
Messages postés11Date d'inscriptiondimanche 11 janvier 2004StatutMembreDernière intervention12 avril 2007
-
8 avril 2007 à 17:37
jrivet
Messages postés7392Date d'inscriptionmercredi 23 avril 2003StatutMembreDernière intervention 6 avril 2012
-
12 avril 2007 à 14:35
Bonjour,
Je mets mon message dans la catégorie débutants, parce qu'on ne peut pas tellement dire que je maitrise le VB...
Bon, voilà, on a eu deux pauvres cours à la fac, et là on se retrouve à devoir faire un programme. C'est surement dans nos possibilités, mais si jamais mes questions vous semblent vraiment stupides, c'est aussi que j'ai pas fait bcp de VB dans ma vie.
Voilà quelque chose que je ne comprends pas dans mon code :
-----------------------------------------
PointsCorbeau et TotalFruits sont tous les deux initialisés à 0 avant la boucle
Cerises, Prunes, Poires et Pommes sont tous initialisés à 10 avant la boucle.
'Boucle pour faire tous les jets d'une partie
While PointsCorbeau < 9 And TotalFruits < 40
ValeurDuDe = Int((6 * Rnd) + 1) 'nb aléatoire entre 1 et 6 pour le dé
Select Case ValeurDuDe
Case 1 'CERISES
If Cerises > 0 Then
Cerises = Cerises - 1
TotalFruits = TotalFruits + 1
End If
Case 2 'POMMES
If Pommes > 0 Then
Pommes = Pommes - 1
TotalFruits = TotalFruits + 1
End If
Case 3 'PRUNES
If Prunes > 0 Then
Prunes = Prunes - 1
TotalFruits = TotalFruits + 1
End If
Case 4 'POIRES
If Poires > 0 Then
Poires = Poires - 1
TotalFruits = TotalFruits + 1
End If
Case 5 'CHOIX DE STRATEGIE
Select Case Strategie
Case 1 'Ce qu'on fait en cas de stratégie 1
Case 2 'Ce qu'on fait en cas de stratégie 2
Case 3 'C'est ici que se pose le pb :
'D'après cette stratégie, on doit prendre deux fruits sur les arbres où il en reste le moins
While i < Max 'On passe une fois ou deux dans la boucle
If Pommes <= j And Pommes > 0 And i < Max Then
Pommes = Pommes - WorksheetFunction.Min(j, Max - i)
TotalFruits = TotalFruits + WorksheetFunction.Min(j, Max - i)
i = i + WorksheetFunction.Min(j, Max - i)
End If
If Poires <= j And Poires > 0 And i < Max Then
Poires = Poires - WorksheetFunction.Min(j, Max - i)
TotalFruits = TotalFruits + WorksheetFunction.Min(j, Max - i)
i = i + WorksheetFunction.Min(j, Max - i)
End If
If Prunes <= j And Prunes > 0 And i < Max Then
Prunes = Prunes - WorksheetFunction.Min(j, Max - i)
TotalFruits = WorksheetFunction.Min(j, Max - i)
i = i + WorksheetFunction.Min(j, Max - i)
End If
If Cerises <= j And Cerises > 0 And i < Max Then
Cerises = Cerises - WorksheetFunction.Min(j, Max - i)
TotalFruits = TotalFruits + WorksheetFunction.Min(j, Max - i)
i = i + WorksheetFunction.Min(j, Max - i)
End If
j = j + 1
Wend
End Select
Case 6 'CORBEAU
PointsCorbeau = PointsCorbeau + 1
End Select
Wend
-----------------------------------------
L'idée c'est qu'on a dix fruits sur l'arbre. On joue contre un corbeau.
Si quand on lance le dé on fait un 1, 2, 3, ou 4, alors on a le droit de prendre un seul fruit sur l'arbre correspondant. Si on fait un 6, le corbeau marque 1 point.
Quand on fait un 5, on décide de prendre les deux fruits dont il reste le moins. (c'est la stratégie 3 du code, celle que j'essaye de coder).
Le jeu se termine quand le corbeau a 9 points, ou quand on a récolté les 40 fruits.
Apparement, mon code n'est pas bon. Mais ce que je ne comprends pas, c'est que quand j'utilise des MsgBox pour m'afficher la valeur de mes variables, il arrive que quand on entre dans le Case 5, les valeurs des 4 fruits soient à zéro. Pourtant, je ne vois pas comment c'est possible.
Si les 4 fruits font zéro, pour moi, on sort automatiquement de la boucle sans avoir l'opportunité de faire un nouveau jet de dé.
Merci à ceux qui prendront la peine de lire tout ça et d'essayer de comprendre. J'ai essayé de faire un message aussi clair que possible. Si je ne suis pas assez précise par endroits, y'a qu'à demander.
A voir également:
Variables nulles qui ne devraient pas l'être : d'où vient l'erreur ?
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 8 avril 2007 à 18:01
Bonjour,
Plusieurs choses :
1) La premère et la plus importante : si tes variables ne sont pas déclarées dans la partie générale de ton code
Private toto as integer, par exemple,
elles seront à 0 à chaque coup de dé !
2) la deuxième : si su n'a pas déclaré Randomize quelque part (dans l'événement activate de ta Form, par exemple, tes tirages aléatoires seront peu aléatoires !
3) tu devrais revoir la philosopie de ton appli et remplacer tes variables fruits par un tableau dynamique, ce qui tepermettrait d'éviter toutes ces clauses Case ! Il te suffirait alors en effet d'intervenir direct(ement sur l'indice du tableau correspondant au résultat de ton coup de dé.
cs_Lisla
Messages postés11Date d'inscriptiondimanche 11 janvier 2004StatutMembreDernière intervention12 avril 2007 8 avril 2007 à 18:14
1) Mes variables sont déclarées comme ça :
Sub JeuDuVerger()
'Déclaration variables
Dim PointsCorbeau, TotalFruits As Integer
Dim ValeurDuDe, ArbreChoisi As Integer
Dim Cerises, Pommes, Prunes, Poires As Integer
2) Qu'est-ce que tu appelles "déclarer randomize" ? L'aide ne dit que ça :
Dim MyValue
' Renvoie une valeur aléatoire comprise entre 1 et 6.
MyValue = Int((6 * Rnd) + 1)
3) Je préfère faire une machine à vapeur qui est un peu mal foutue plutôt que des tableaux dynamiques, parce que je n'ai aucune idée de ce qu'est un tableau dynamique en fait... et donc je me vois mal me lancer là dedans. Avec ma manière de faire, même si ce n'est pas forcément optimal, il doit y avoir moyen d'y arriver nan ?
(A moins que quelqu'un se sente l'âme généreuse pour m'expliquer le concept ou pour me refiler un tuto "spécial neuneu" que (pour une fois) j'arriverai à comprendre)
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 8 avril 2007 à 18:33
1) déclarées dans une sub, tes variables perdent leur valeur à chaque sortie de la sub !
Elles doivent être déclarées tout en haut (hors sub ou fonction) de ton code !
Private PointsCorbeau as Interger, TotalFruits As Integer
Private ValeurDuDe as Integer, ArbreChoisi As Integer
etc...
remarque bien que je répète le type pour chaque variable (c'est important)
et ensuite :
private Sub.......
end sub
private sub......
End sub.....
2) Faire un cours sur les tableaux serait bien long.
Je peux par contre te faire un exemple "parlant" que voici :
Sur une form, un bouton de commande command1 et un bouton de commande command2
et ce code :
Private toto(3) As Integer
Private Sub Command1_Click()
For i = 0 To 2
toto(i) = 0
Next
End Sub
Private Sub Command2_Click()
For i = 0 To 2
MsgBox "valeur de la ligne " & i & " : " & toto(i)
Next
MsgBox "ON VA MAINTENANT AUGMENTER DE 1 LA 27ME LIGNE DU TABLEAU"
toto(1) = toto(1) + 1
For i = 0 To 2
MsgBox "valeur de la ligne " & i & " : " & toto(i)
Next
End Sub
Tu lances, presses command1 (pour alimenter le tableau)
Tu presses ensuite command2 et tu observes attentivement (tu vas voir)
Tu reviens au code et l'analyse lentement.
C'est simple et "parlant"
jrivet
Messages postés7392Date d'inscriptionmercredi 23 avril 2003StatutMembreDernière intervention 6 avril 201260 12 avril 2007 à 14:03
1- BONJOUR 2- Est ce que tu peux me dire quel est le rapport avec le sujet déjà en cours?
3- Tu pourrais peu être commencer par poster une nouvelle question.
4- Tu pourrais aussi nous dire si il y a une erreur ou si simplement le code ne fait pas ce que tu veux....
5- BREF: [reglement.aspx Voir le règlement de CodeS-SourceS]