Problème d'addition de variable [Résolu]

Signaler
Messages postés
11
Date d'inscription
mardi 20 février 2007
Statut
Membre
Dernière intervention
8 septembre 2011
-
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
-
Bonjour à tous, je suis vraiment embêté. J'essaie de réaliser un développement en vb6 pour réaliser un jeu de poker.
J'ai rencontré un problème hier matin, et cela fait 24h que je planche dessus sans trouver de solution (d'ailleurs sans même trouver de problème !!).

Alors voilà, je voudrais que l'application ouvre une msgbox quand tout le monde est couché, excepté un joueur, celui qui gagne le pot. Les joueurs sont répertoriés dans table(0 to 9) as integer. Avant le premier tour de mise, toutes les valeurs affectées aux joueurs sont "1". table(0)=1, table(1)=1, etc ...
A la petite blind est affecté 15 par défaut et 30 pour la grosse blind. (ex : table(4)=15, table(5)=30)
Si un joueur se couche, sa valeur dans table() sera 0 sinon la valeur de la mise.
Théoriquement, lorsque tout le monde se couche, si la petite blind (avant dernière position) se couche, alors l'addition de toutes les variables grosse blind et donc le message devrait apparaitre !! Mais le message n'apparait que lorsque que TOUS les joueurs sont couchés. La formule suivante ne fonctionne donc qu'avec 0+0+0+0+0+0+0+0+0+0 0 et pas avec 0+0+0+0+30+0+0+0+0+0=30 ?????????????????



Sub toursuivant()

For a = 0 To 9
If table(0) + table(1) + table(2) + table(3) + table(4) + table(5) + table(6) + table(7) + table(8) + table(9) = table(a) Then
MsgBox "Le joueur " & a & " gagne le pot."
Call finjeu
End If
Next a

Ensuite je ne comprends pas non plus pourquoi la formule suivante ne fonctionne pas non plus. Je voudrais qu'une fois que tous les joueurs se sont prononcé, soit qu'ils aient suivi soit, si'ils se soient couché, une msgbox annonce le tirage du flop. Donc soit les joueurs sont couchés (leur valeur dans table()=0), soit ils relancent(et le tour continue) soit ils ont suivi et tous les joueurs ont la meme valeur dans table (qui est la mise max).

misemax = 0

For i = 0 To 9
If table(i) > misemax Then misemax = table(i)
Next i

If (table(0) 0 Or table(0) misemax) And (table(1) = 0 Or table(1) = misemax) And (table(2) = 0 Or table(2) = misemax) And (table(3) = 0 Or table(3) = misemax) And (table(4) = 0 Or table(4) = misemax) And (table(5) = 0 Or table(5) = misemax) And (table(6) = 0 Or table(6) = misemax) And (table(7) = 0 Or table(7) = misemax) And (table(8) = 0 Or table(8) = misemax) And (table(9) = 0 Or table(9) = misemax) Then
MsgBox "ok pour flop"
Call serflop
End If


If tour = 9 Then
tour = 0
Else
tour = tour + 1
End If


End Sub

18 réponses

Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
229
Et si tu permets ===>> je vais ajouter qu'il est dommage, puisque tu travailles avec VB6, que tu n'utilises tout simplement pas des groupes de contrôles indexés, directement.
Un seul contrôle au départ, d'indice 0, que tu GARDES tout au long du jeu ===>> Au début d'un jeu : tu charges 10 contrôles (10 index) ===>> chaque fois qu'un joueur se couche ===>> tu décharges le contrôle de même index ===>> la propriété Count du groupe de contrôles te fera savoir où tu en ers ! il ne reste qu'un joueur (le gagnant) lorsque sa valeur = 2
Si tu sais, de surcroît, "associer" les index de plusieurs groupes de contrôles indexés, tu iras beaucoup plus loin et de manières beaucoup plus élastique ppour gérer toius les autres aspects de ton jeu (mises, gains, pertes, etc ...)
Mais je suis conscient de ce que je t'indique là est tout simplement la remise en cause de tout ton mécanisme .


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
11
Date d'inscription
mardi 20 février 2007
Statut
Membre
Dernière intervention
8 septembre 2011

J'espère avoir été assez clair, merci de me donner un coup de main les gars svp, je deviens fouuuuuuuuuuu...
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
70
Salut

Première chose : Assure toi du contenu de tes variables "tables()" lors de chaque test, tu découvras ainsi ce qui ne va pas.

Tes variables sont-elles toutes bien et correctement dimensionnées ?

Débogage :
- F9 sur une ligne de code; elle change de couleur
Le programme s'y arrêtera au prochain passage
Survole avec la souris tes variables pour visualiser leur contenu, ou va dans la fenêtre de debogage (Ctrl-G) et tape
? maVariable
pour qu'elle s'inscrive dans la fenêtre.
- F8 (VB6) ou F10 (.Net) pour avancer d'une ligne de code
- F5 pour continuer normalement

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
11
Date d'inscription
mardi 20 février 2007
Statut
Membre
Dernière intervention
8 septembre 2011

merci jack de te pencher sur mon problème. J'ai déjà vérifié chaque variable en cours d'execution de programme. Par exemple il me dit que table(0)=0, table(1)=0, table(2)=30, table(3)=0, table(4)=0, table(5)=0, table(6)=0, table(7)=0, table(8)=0, table(9)=0. la somme de tous les index = 30.
il me dit également que table(i)=30 (quand i=2)
mais dans la meme fenetre d execution, quand je tape table(0) + table(1)+table(2)+table(3)+[...]+table(9) = table(i)
(quand i=2) il me répond "FAUX"...
ce qui n'est pas logique puisqu'indépendamment il me dit que la somme 30, l'indice 30, mais que la somme n'est pas égale à l'indice... ?!?
Quant à mes variables, elles sont toutes déclarées dans un module, par Public mavariable as integer ou variant.

Quelque chose m'échappe, mais quoi ?
Messages postés
14733
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
12 octobre 2020
146
Bonjour,

Pourquoi ne pas faire plus simple ?
Genre :

Dim lBoo As boolean=False
For each lClient As Integer=0 to 9
    If lClient<>0 Then
        If lBoo Then
        lBoo=False
        Exit For
    Else
        lBoo=True
    End If
Next

If lBoo Then
    'Reste un seul client
Else
    'Il y a plus de 1 client
End If


---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS et aussi ce lien[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Mon site
Messages postés
14733
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
12 octobre 2020
146
Bonjour,

Il faut remplacer
For each lClient As Integer=0 to 9
Par
For each lClient In Table

Dans la mesure que Table ne contienne que les données des joueurs.

---------------------------------------------------------------------
Mon site
Messages postés
2065
Date d'inscription
lundi 11 avril 2005
Statut
Membre
Dernière intervention
14 mars 2016
8
Bonjour,

(ceradetareba, évite la multiplication des messages identiques)...

Quel est le type de déclaration de Table() ?

Le problème vient (peut-être) du type. Si tu utilises un type de variable non entière (variant ou double, par exemple), tu as peut-être un problème d'arrondi en interne. Ainsi, même si tu vois 30 dans les deux cas, en réalité tu as peut-être 29.999999999999999999 et 30 en interne. Ce qui explique que l'égalité n'est pas vérifiée.

Amicalement,
Us.
Messages postés
2065
Date d'inscription
lundi 11 avril 2005
Statut
Membre
Dernière intervention
14 mars 2016
8
Oupsss... Nhenry tu étais invicible avant mon post... désolé...
Messages postés
2065
Date d'inscription
lundi 11 avril 2005
Statut
Membre
Dernière intervention
14 mars 2016
8
Donc, oui, je fini ... choisi le type Long ou Integer pour Table()

Amicalement,
Us.
Messages postés
11
Date d'inscription
mardi 20 février 2007
Statut
Membre
Dernière intervention
8 septembre 2011

table est déjà déclarée en integer... bon je vais essayer la solution nhenry. Sauf que dim lBoo as boolean = false il me le prend pas. Je vais donc essayer dim lBoo as boolean
lBoo = false

on verra, en tout cas déjà merci, a toute a l heure pour le verdict.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
229
Sauf que dim lBoo as boolean = false il me le prend pas.

et oui ! surtout que nous sommes en .... VB6

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
14733
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
12 octobre 2020
146
Bonjour,

Certes j'étais passé en mode .NET, mais le principe est le même :
- Parcourir le tableau pour voir si une et une seule valeur est différente de 0.

Pas besoin d'additionner.

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS et aussi ce lien[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Mon site
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
229
Je procèderais personnellement ainsi :

Au départ : un Array toto ===>>

toto =  Array(1,2,3,4,5,6,7,8,9,10)


dans lequel chacun des 10 joueurs est numéroté de 1 à 10

Au fur et à mesure du jeu : si un joueur se couche disons par exemple le joueur 8 ==>> toto(8-1) = 0

et on vérifie s'il n'en reste qu'un alors très simplement :
Exemple/simulation :
Private Sub CommandButton1_Click()
  tabl = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
  toto = Replace(Join(tabl, ","), "0,", "")
  If Len(toto) < 4 Then MsgBox "le joueur " & Val(toto) & " a gagné"
  '.....
  tabl = Array(0, 2, 0, 0, 0, 0, 0, 0, 0, 9, 0)
  '......
  
  toto = Replace(Join(tabl, ","), "0,", "")
  If Len(toto) < 4 Then MsgBox "le joueur " & Val(toto) & " a gagné"
  'le joueur 2 se couche ===>>
  tabl = Array(0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0)
  toto = Replace(Join(tabl, ","), "0,", "")
  If Len(toto) < 4 Then MsgBox "le joueur " & Val(toto) & " a gagné"
End Sub





____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
11
Date d'inscription
mardi 20 février 2007
Statut
Membre
Dernière intervention
8 septembre 2011

Et si tu permets ===>> je vais ajouter qu'il est dommage, puisque tu travailles avec VB6, que tu n'utilises tout simplement pas des groupes de contrôles indexés, directement. >>>> désolé, je comprends pas, j'ai appris la prog en autodidacte et je sais que j'ai énormément de lacunes.

je suis peut etre un peu lourd mais la fonction join comment ca s utilise en fait ? je comprends pas bien...


ps : la vie est trop courte pour retirer un périphérique usb en toute sécurité
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
229
je suis peut etre un peu lourd mais la fonction join comment ca s utilise en fait ? je comprends pas bien...

Tu développes bien en VB6 ?
Si oui ===>> Msdn (ton aide VB6) sur le mot Join ! Et je ne vois pas du tout ce que j'aurais à rajouter à ce qui y est dit de manière très claire et suffisante :
Renvoie une chaîne créée par la jonction de plusieurs sous-chaînes contenues dans un tableau.

et dans ma solution, j'ai choisi comme séparateur (delimiter) la chaine ",", puis j'ai remplacé tout bêtement les chaines "0," par ""
Aucune "sorcellerie" là-dedans !




____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
70
"... dimensionné de type integer ou variant"
Tu ne veux pas nous les montrer ?
Je reste persuadé qu'il s'agit d'un problème d'arrondi, mais les Integer ne devraient pas poser de problème (si on ne dépasse pas une certaine limite, 32767).

Variant est très particulier et ne s'utilise que dans des cas spéciaux.
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
70
PS : Supprime tout de suite tous les "On Error Resume Next" qui pourraient être présents dans ton code et qui masqueraient une éventuelle erreur.
Là aussi, utilisation dans des cas très précis.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
229
désolé, je comprends pas, j'ai appris la prog en autodidacte et je sais que j'ai énormément de lacunes.

As-tu commencé par la lecture de ton aide VB6 (MSDN) ?
Je ne peux te parler de l'utilisation de groupes de contrôles indexés que si tu as au moins lu ce que t'en dit ton aide en ligne !
Question : as-tu installé cette aide (MSDN) ?
Si non : je ne peux te guider valablement (sûr et certain de cela !)

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient