Variables nulles qui ne devraient pas l'être : d'où vient l'erreur ?

cs_Lisla Messages postés 11 Date d'inscription dimanche 11 janvier 2004 Statut Membre Dernière intervention 12 avril 2007 - 8 avril 2007 à 17:37
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Derniè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

Max = WorksheetFunction.Min(Pommes + Poires + Cerises + Prunes, 2)
MsgBox "max vaut " & Max & Pommes & Prunes & Poires & Cerises

i = 0 'On met i à zéro
j = 1

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.

10 réponses

jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
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é.


 


Voilà mes conseils...


A toi, maintenant, de les suivre ou non...
0
cs_Lisla Messages postés 11 Date d'inscription dimanche 11 janvier 2004 Statut Membre Dernière intervention 12 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)







Merci pour tes réponses !
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
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"

Voilà.
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
10 avril 2007 à 09:42
Salut,
Est ce que tu travailles sous Excel?
@+: Ju£i?n
Pensez: Réponse acceptée
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
nerazzurro01 Messages postés 41 Date d'inscription jeudi 12 avril 2007 Statut Membre Dernière intervention 14 janvier 2008
12 avril 2007 à 13:57
  Dim i = CDate(Me.DateTimePicker1.Text)
            Dim s = CDate(Me.DateTimePicker2.Text)
            Dim r = (s - i)




            MsgBox(r)

ou est le probleme svp
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
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]

@+: Ju£i?n
Pensez: Réponse acceptée
0
nerazzurro01 Messages postés 41 Date d'inscription jeudi 12 avril 2007 Statut Membre Dernière intervention 14 janvier 2008
12 avril 2007 à 14:10
ben le probleme c'est que la variable r reste toujours null
donc je peux pas recuperer le resultat merci
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
12 avril 2007 à 14:12
5- BREF: [reglement.aspx Voir le règlement de CodeS-SourceS]

@+: Ju£i?n
Pensez: Réponse acceptée
0
nerazzurro01 Messages postés 41 Date d'inscription jeudi 12 avril 2007 Statut Membre Dernière intervention 14 janvier 2008
12 avril 2007 à 14:32
alors jrivet tu as la reponnse stp


 
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
12 avril 2007 à 14:35
Alors[auteurdetail.aspx?ID=1032594 nerazzurro01] , tu es allé lire le règlement STP
le point 5 pour être précis
@+: Ju£i?n
Pensez: Réponse acceptée
0
Rejoignez-nous