Petit pb de débutant

Résolu
tlemeillat Messages postés 26 Date d'inscription jeudi 8 mars 2007 Statut Membre Dernière intervention 17 mai 2007 - 17 avril 2007 à 22:11
 cs_mafe - 24 mai 2007 à 15:24
je débute en vb et j'ai un petit pb sur un exo, si quelqu'un pouvait me donner quelques idées:

en fait il s'agit d'un damier avec 2 types d'agents, rouges et bleus, disposés aléatoirement sur le damier et qui vont se déplacer aléatoirement s'ils ne sont pas contents (si le nb de leurs voisins de couleur différente est supérieur à un certain seuil). Sur le damier, chaque agent (cellule) est entouré de 8 voisins.
Le but de l'exo est de voir qu'à la fin d'une itération, les agents de même couleur se regroupent, formant ainsi des "tâches" sur le damier.

mon blocage: je n'arrive pas à traduire en code le moment où je voudrais que les agents "pas contents" se rangent dans un tableau (invisible) et se "redispatchent" sur le damier initial sur une case où ils seraient "contents".

si quelqu'un pouvait m'aiguiller un peu se serait sympa -)

45 réponses

tlemeillat Messages postés 26 Date d'inscription jeudi 8 mars 2007 Statut Membre Dernière intervention 17 mai 2007
19 avril 2007 à 12:09
merci pour ton explication, par contre je ne comprends pas pourquoi le nb de voisins différents serait inutile. De plus je ne vois pas quelle est la signification de "UBound", cette fonction n'est pas défini dans mon gros bouquin de vb6?

A+
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
19 avril 2007 à 12:54
Salut,
Alors:
En fait le Nb de voisins différents est inutiles dans le Type T_Agent:
    - Si un agent de couleur bleue est insatisfait c'est que sont nombre de voisin différents est trop élevé
    - Si un agent de couleur rouge est insatisfait c'est que sont nombre de voisin différents est trop élevé

Ces deux agents peuvent donc échanger leur place sans avoir ce souceir du nombre de voiin de l'un ou l'autre, ils sont sûr d'être , après ce déplacement, satisfait.

La fonction Ubound:
Renvoie une valeur de type Long contenant le plus grand indice disponible pour la dimension indiquée d'un tableau.

Exemple Dim MonTab(1 to 10) => Ubound te renverra 10 mais lorsque tu ne connais pas le plus grand indice (ou que tu redimensione dynamiquement tes tableaux), Ubound est de ce fait très utile.

@+: Ju£i?n
Pensez: Réponse acceptée
0
tlemeillat Messages postés 26 Date d'inscription jeudi 8 mars 2007 Statut Membre Dernière intervention 17 mai 2007
19 avril 2007 à 13:06
merci-)
0
tlemeillat Messages postés 26 Date d'inscription jeudi 8 mars 2007 Statut Membre Dernière intervention 17 mai 2007
19 avril 2007 à 14:09
excuse moi, je vais "t'embêter" encore une fois, pour la procédure rangement penses-tu que ceci conviendrait:

Public Sub rangement()
For T_Ligne = 1 To LesInsatisfaits(UBound(LesInsatisfaits))
For T_Colonne = 1 To LesInsatisfaits(UBound(LesInsatisfaits))
If Temp_Agent.T_Couleur = &H80FFFF Then
agent(indice(Lig, Col)).BackColor = &HFF&
ElseIf Temp_Agent.T_Couleur = &HFF& Then
agent(indice(Lig, Col)).BackColor = &H80FFFF
End If
Next T_Colonne
Next T_Ligne
End Sub

A+
0

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

Posez votre question
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
19 avril 2007 à 14:17
Salut,

Non.
pourquoi?
For T_Ligne = 1 To LesInsatisfaits(UBound(LesInsatisfaits)) ceci est faux. je pense que tu voulais dire
For T_Ligne = 1 To UBound(LesInsatisfaits)

Mais ATTENTION que représente T_Ligne si c'est la variable Du Type T_Agent c'est incorrect.

Ensuite tu te trompes me semble t il pour ce qui concerne le déplacement.
Ce que tu me montre n'est pas un déplacement mais un changement de couleur. (hors ce n'est pas ce qui est demander.)

Pour le rangement je pencherai plus pour ceci:
ATTENTION c'est à améliorer mais c'est pour l'idée.
Je dit améliorer car avec ce code, un agent peu être déplacer plusieurs fois dans la même boucle et je ne sais pas si c'est correct ou pas.
Enfin bref tu verras.
Private Sub Rangement()
Dim Source As T_Agent
Dim Destination As T_Agent
Dim TmpCol As Integer
Dim TmpLig As Integer
Dim TmpCoul As Long
Dim I As Integer
Dim J As Integer
   'On Parcour une premiere fois
   For I = 0 To UBound(LesInsatisfaits) - 1
       'on parcours une seconde fois pour lui trouver
       'une plase satisfaisante
       For J = I To UBound(LesInsatisfaits)
           Source = LesInsatisfaits(I)
           Destination = LesInsatisfaits(J)
           'SI les couleurs sont différentes
           If (Source.T_Couleur <> Destination.T_Couleur) Then
               'On intervertit les agent sur le damier

               Agent(indice(Destination.T_Ligne, Destination.T_Colonne)).BackColor = Source.T_Couleur
               Agent(indice(Source.T_Ligne, Source.T_Colonne)).BackColor = Destination.T_Couleur
               Exit For
           End If
       Next J
   Next I

End Sub , ----
[code.aspx?ID=41455 By Renfield]

@+: Ju£i?n
Pensez: Réponse acceptée
0
tlemeillat Messages postés 26 Date d'inscription jeudi 8 mars 2007 Statut Membre Dernière intervention 17 mai 2007
19 avril 2007 à 15:46
Salut,
une dernière petite question et après je ne t'embête plus:
quand je lance une itération, celle-ci bloque sur la procédure "Public Sub satisfaction()", en me surlignant le mot "indice" de la ligne "Ind = indice(Lig, Col)", avec le message "compile error: sub or function not defined".

je ne comprends pas car pourtant cette ligne est déjà utilisée et définie dans "Private Function IsSameColor" et dans "Public Sub IniatialisationDamier()" ??
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
19 avril 2007 à 15:51
Salut

Est ce que tu as TOUT mis au meme endroit (la fonction indice aussi)?

@+: Ju£i?n
Pensez: Réponse acceptée
0
tlemeillat Messages postés 26 Date d'inscription jeudi 8 mars 2007 Statut Membre Dernière intervention 17 mai 2007
19 avril 2007 à 16:07
si tu entends par "endroit" la form ou le module, mon module contient:

Option Explicit
Private Type T_Agent
...

Public Sub satisfaction()
...

et

Public Sub Rangement()
...

tout le reste est dans la form
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
19 avril 2007 à 16:14
Salut,
Alors place

Public Function indice(ByVal Lig As Integer, ByVal Col As Integer) As Integer
   'retourne l'indice correspondant à la position (lig, col)
indice = Lig + (Col - 1) * dimterrain
End Function , ----
[code.aspx?ID=41455 By Renfield]

Dans le module mais il te faudra surement alors déplacer un peu tout.
ou alors place TOUT dans le form (après tout c'est pas si grave)

@+: Ju£i?n
Pensez: Réponse acceptée
0
tlemeillat Messages postés 26 Date d'inscription jeudi 8 mars 2007 Statut Membre Dernière intervention 17 mai 2007
19 avril 2007 à 21:03
Salut, pour te donner des nouvelles:

- il n'y a plus de bugs quand je lance la procédure Unpas, mais cela ne marche pas car les agents insatisfaits ne se déplacent pas une fois avoir rentré le seuil (le damier ne se modifie pas). Ma procédure Unpas est:

Private Sub Unpas_Click()
Call IniatialisationDamier
Call satisfaction
Call Rangement
End Sub

- j'essaie de modifier la procédure suivante car il y a un pb au niveau du seuil, qd le seuil que je rentre est 1, 2, ou 3 et je sais pas pourquoi

'POUR VERIFIER que les fonction "colonne" et "ligne" retournent les bonnes valeurs
Public Sub agent_Click(Index As Integer)
Dim BonneCouleur As Integer
BonneCouleur = Getvoisins(Index)
If BonneCouleur < seuil Then MsgBox ("AGENT " & Index & " INSATISFAIT AVEC " & 8 - BonneCouleur & " VOISINS DIFFERENTS")
While seuil > 8 Or seuil < 1
seuil = InputBox("Entrez le nombre maximum de voisins différents, compris entre 1 et 8, tolérés")
Wend
End Sub
0
tlemeillat Messages postés 26 Date d'inscription jeudi 8 mars 2007 Statut Membre Dernière intervention 17 mai 2007
19 avril 2007 à 21:18
concernant le deuxième "-" du message précédent, je rajoute pour que tu comprenne mieux le pb que qd le seuil est 1, 2, 3 (voisins différents tolérés au max), certains agents (qui par ailleurs non que 1 ou 2 voisins différents de plus que la valeur du seuil) ne sont pas repérés par l'ordi, alors qu'ils devraient être des insatisfaits. Seul les agents qui sont assez isolés (avec 8 ou 7 ou 6 voisins de couleur différente) sont quant à eux toujours bien repérés comme étant insatisfaits. j'espère que tu me comprends...-) ça commence à me prendre la tête
0
tlemeillat Messages postés 26 Date d'inscription jeudi 8 mars 2007 Statut Membre Dernière intervention 17 mai 2007
19 avril 2007 à 22:22
Je viens de résoudre le pb du seuil (le deuxième "-") dans mon message précédent:

j'ai remplacé

If BonneCouleur < seuil Then MsgBox ("AGENT " & Index & " INSATISFAIT AVEC " & 8 - BonneCouleur & " VOISINS DIFFERENTS")

par

If ((8 - BonneCouleur) > seuil) Then MsgBox ("AGENT " & Index & " INSATISFAIT AVEC " & 8 - BonneCouleur & " VOISINS DIFFERENTS")

Pour ce qui en est du premier "-" concernant la procédure Unpas et notamment le fait que les insatisfaits ne se déplaçent pas et que le damier reste le même, je vais m'y pencher cette nuit...peut-être à demain matin -) A+
0
tlemeillat Messages postés 26 Date d'inscription jeudi 8 mars 2007 Statut Membre Dernière intervention 17 mai 2007
20 avril 2007 à 15:47
Salut jrivet,

J'arrive à faire marcher le programme, mais il reste encore un petit bug: une fois avoir lancé la procédure Unpas, et rentré le seuil de voisins différents, les agents commencent à se déplacer mais cela s'arrête et le message suivant apparait:

"Run-time error: invalid control array index" au niveau de la ligne suivante (dans la procédure Rangement):

agent(indice(Destination.T_Ligne, Destination.T_Colonne)).BackColor = Source.T_Couleur

J'ai passé la nuit à essayer de débuger mais en vain. J'ai tout du moins peut être trouvé une piste (j'ai mis un temps fou pour comprendre la procédure Rangement qui est vraiment balaise):

Public Sub Rangement()
Dim Source As T_Agent
Dim Destination As T_Agent
Dim TempCol As Integer
Dim TempLig As Integer
Dim TempCouleur As Long
Dim I As Integer
Dim J As Integer
For I = 0 To UBound(LesInsatisfaits) - 1 'On parcours une premiere fois le tableau des insatisfaits
For J = I To UBound(LesInsatisfaits) 'on parcours une seconde fois pour lui trouver un emplacement satisfaisant
Source = LesInsatisfaits(I)
Destination = LesInsatisfaits(J)
If (Source.T_Couleur <> Destination.T_Couleur) Then 'Si les couleurs sont différentes
agent(indice(Destination.T_Ligne, Destination.T_Colonne)).BackColor = Source.T_Couleur
'On intervertit les agent sur le damier
agent(indice(Source.T_Ligne, Source.T_Colonne)).BackColor = Destination.T_Couleur

Exit For 'permet de ne pas intervertir le même agent deux fois
End If
'dès qu'on trouve un agent insatisfait avec une couleur différente de l'agent insatisfait observé
'on intervertit les couleurs des 2 agents et on passe a un autre agent observé
Next J
Next I
End Sub

Ma piste: je pense qu'il faudrait peut être rajouter une colonne dans le tableau LesInsatisfaits de type Boolean pour indiquer si oui ou non, à chaque ligne, l'agent a été intervertit ou pas, seulement je ne sais pas le traduire en vb.
J'espère que tu pourras me donner qq indication
A+
0
tlemeillat Messages postés 26 Date d'inscription jeudi 8 mars 2007 Statut Membre Dernière intervention 17 mai 2007
20 avril 2007 à 16:16
Salut jrivet,

J'arrive à faire marcher le programme, mais il reste encore un petit bug: une fois avoir lancé la procédure Unpas, et rentré le seuil de voisins différents, les agents commencent à se déplacer mais cela s'arrête et le message suivant apparait:

"Run-time error: invalid control array index" au niveau de la ligne suivante (dans la procédure Rangement):

agent(indice(Destination.T_Ligne, Destination.T_Colonne)).BackColor = Source.T_Couleur

J'ai passé la nuit à essayer de débuger mais en vain. J'ai tout du moins peut être trouvé une piste (j'ai mis un temps fou pour comprendre la procédure Rangement qui est vraiment balaise):

Public Sub Rangement()
Dim Source As T_Agent
Dim Destination As T_Agent
Dim TempCol As Integer
Dim TempLig As Integer
Dim TempCouleur As Long
Dim I As Integer
Dim J As Integer
For I = 0 To UBound(LesInsatisfaits) - 1 'On parcours une premiere fois le tableau des insatisfaits
For J = I To UBound(LesInsatisfaits) 'on parcours une seconde fois pour lui trouver un emplacement satisfaisant
Source = LesInsatisfaits(I)
Destination = LesInsatisfaits(J)
If (Source.T_Couleur <> Destination.T_Couleur) Then 'Si les couleurs sont différentes
agent(indice(Destination.T_Ligne, Destination.T_Colonne)).BackColor = Source.T_Couleur
'On intervertit les agent sur le damier
agent(indice(Source.T_Ligne, Source.T_Colonne)).BackColor = Destination.T_Couleur

Exit For 'permet de ne pas intervertir le même agent deux fois
End If
'dès qu'on trouve un agent insatisfait avec une couleur différente de l'agent insatisfait observé
'on intervertit les couleurs des 2 agents et on passe a un autre agent observé
Next J
Next I
End Sub

Ma piste: je pense qu'il faudrait peut être rajouter une colonne dans le tableau LesInsatisfaits de type Boolean pour indiquer si oui ou non, à chaque ligne, l'agent a été intervertit ou pas, seulement je ne sais pas le traduire en vb.
J'espère que tu pourras me donner qq indication
A+
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
20 avril 2007 à 16:22
Salut,
(pas la peine poster deux fois le même truc à 1/2 heure d'interval)
Alors dans l'ordre:
Run-time error: invalid control array index au niveau de la ligne suivante (dans la procédure Rangement):
Signifie que tu essaie d'accéder à un label qui n'existe pas exemple Agents(-5) ou Agents(500) Bref la valeur retourné alors par indice(Destination.T_Ligne, Destination.T_Colonne) doit être foireuse. (conseil utilise le Debugger pour suivre ton code pas à pas)

Pour ajouter le fait qu'un agent à dejà ete deplacer il te faut modifier le Type T_Agent.
Il deviendrait alors

Option Explicit
Private Type T_Agent
  T_Ligne As Integer
  T_Colonne As Integer
  T_Couleur As Long
  T_Deplacer As Boolean
End Type , ----
[code.aspx?ID=41455 By Renfield]

Puis tu modifie ta procédure Rangement pour obtenir un truc du style

Public Sub Rangement()
Dim Source As T_Agent
Dim Destination As T_Agent
Dim TempCol As Integer
Dim TempLig As Integer
Dim TempCouleur As Long
Dim I As Integer
Dim J As Integer
For I = 0 To UBound(LesInsatisfaits) - 1 'On parcours une premiere fois le tableau des insatisfaits
   For J = I To UBound(LesInsatisfaits) 'on parcours une seconde fois pour lui trouver un emplacement satisfaisant
   Source = LesInsatisfaits(I)
   Destination = LesInsatisfaits(J)
       If (Source.T_Couleur <> Destination.T_Couleur) And Not Source.T_Deplacer And Not Destination.T_Deplacer Then 'Si les couleurs sont différentes
          agent(indice(Destination.T_Ligne, Destination.T_Colonne)).BackColor = Source.T_Couleur
          'On intervertit les agent sur le damier
          agent(indice(Source.T_Ligne, Source.T_Colonne)).BackColor = Destination.T_Couleur
           'On indque alors que les deux agents ont été deplacer
           Destination.T_Deplacer = True
           Source.T_Deplacer = True
          Exit For 'permet de ne pas intervertir le même agent deux fois
       End If
       'dès qu'on trouve un agent insatisfait avec une couleur différente de l'agent insatisfait observé
       'on intervertit les couleurs des 2 agents et on passe a un autre agent observé
   Next J
Next I
End Sub<hr />, ----
[code.aspx?ID=41455 By Renfield]

@+: Ju£i?n
Pensez: Réponse acceptée
0
tlemeillat Messages postés 26 Date d'inscription jeudi 8 mars 2007 Statut Membre Dernière intervention 17 mai 2007
20 avril 2007 à 16:43
Re-salut,

En effet, qd je modifie la proc Rangement avec le "T_Deplacer" cela ne change rien.
Le problème est qu'il y a des valeurs qui deviennent égale à 0, notamment au niveau de la ligne du bug:

"agent(indice(Destination.T_Ligne, Destination.T_Colonne)).BackColor = Source.T_Couleur"

qd je pointe la souris j'ai "Destination.T_Ligne" et "Destination.T_Colonne" qui sont égales à 0 et "Source.T_Couleur" qui vaut 8454143 !?
je ne comprends pas pourquoi ligne et colonne sont toutes les deux nulles
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
20 avril 2007 à 16:47
Salut,
Il faut que tu remontes à LesInsatisfaits(J) Que vaut J lorsque ta ligne plante? est ce que la valeur est indice possible de ton tableau LesINsatisfaits? Bref il y a des petit problème d'indice.

Envoie moi ton projet a epsylon9@gmail.Com que je regarde un peu ou tu en est (vite fait avant que je parte en WE)

@+: Ju£i?n
Pensez: Réponse acceptée
0
tlemeillat Messages postés 26 Date d'inscription jeudi 8 mars 2007 Statut Membre Dernière intervention 17 mai 2007
20 avril 2007 à 17:41
tu devrais recevoir un mail de ma part sur l'adresse que tu m'a donné
0
cs_othi Messages postés 2 Date d'inscription jeudi 17 mai 2007 Statut Membre Dernière intervention 21 mai 2007
17 mai 2007 à 09:54
Bonjour tlemeillat et à tous
Je suis etudiant en licence informatique à Tours, je suis tombé sur ce forum par hasard et je fait depuis une semaine un programme de simulation d'echeck en Vb et ton exercice pourra ennormement m'aider .
est cque c'est possible dafficher le code final de ton exercice
Merci d'avance pour ton aide
Othi
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
21 mai 2007 à 08:03
Salut,
> [auteurdetail.aspx?ID=1063851 othi], réponse au MP: Je suis désolé mais je ne garde pas les codes que l'on m'envoie. je ne pourrais donc pas t'aider plus que ce que tu  as trouvé dans cette discution.

En revanche ce que je peux te conseiller (peu être l'as tu déjà fait) c'est d'utiliser le forum pour y poser une nouvelle question le plus précise possible pour avoir de l'aide de toute la communauté dès que besoins.
@+: Ju£i?n
Pensez: Réponse acceptée
0
Rejoignez-nous