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

jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
20 avril 2007 à 17:15
Salut,
C'est bien ce que je pensais le contenu de LesInsatisfaits(Ubound(LesInsatisfaits)) est  VIDE.

Enfait je me suis trompe dans rangement :
CEic:
'Nous sommes ici obliger de supprimer le dernier élément du tableau LesInsatisfaits car il y a une ligne vide
ReDim Preserve LesInsatisfaits(UBound(LesInsatisfaits)), ----
[code.aspx?ID=41455 By Renfield]
DEVRAIT ETRE CECI
'Nous sommes ici obliger de supprimer le dernier élément du tableau LesInsatisfaits car il y a une ligne vide
ReDim Preserve LesInsatisfaits(UBound(LesInsatisfaits) - 1), ----
[code.aspx?ID=41455 By Renfield]
Donc voila il faut continuer les test.
NOTE: EVITE LES ACCENT DANS LE CODE SAUF DANS LES COMMENTAIRE.

@+: Ju£i?n
Pensez: Réponse acceptée
3
tlemeillat Messages postés 26 Date d'inscription jeudi 8 mars 2007 Statut Membre Dernière intervention 17 mai 2007
17 avril 2007 à 22:25
voilà où j'en suis:

Option Explicit


Public Sub IniatialisationDamier()
'dimensionnement des agents, sur un damier de 6000 points,
agent(0).Height = 6000 / dimterrain
agent(0).Width = 6000 / dimterrain
agent(0).Visible = False

'charge une copie de agent(0) pour chaque emplacement du damier
Dim col As Integer
Dim lig As Integer
Dim ind As Integer
For col = 1 To dimterrain
For lig = 1 To dimterrain
ind = indice(lig, col)
Load agent(ind)
'le damier est situé en haut à gauche de la fenetre
agent(ind).Left = agent(0).Width * (col - 1)
agent(ind).Top = agent(0).Height * (lig - 1)
agent(ind).Visible = True
agent(ind).Enabled = True
'exemple pour colorier un agent
If (ind Mod 2 = 0) Then
agent(ind).BackColor = &HFF&
Else
agent(ind).BackColor = &HFF0000
End If
Next lig
Next col
End Sub

'POUR VERIFIER que les fonction "colonne" et "ligne" retournent les bonnes valeurs
Public Sub agent_Click(Index As Integer)
Call MsgBox("index : " & Index & " colonne : " & colonne(Index) & ", ligne : " & ligne(Index))
End Sub

Option Explicit

'le nbre de cases du damier, en largeur et hauteur
Dim dimterrain As Integer
'informations sur chaque agent du terrain
Public damier(1 To dimterrain, 1 To dimterrain) As Integer


Public Function ligne(ByVal indice As Integer) As Integer
'retourne la ligne correspondant à ind
ligne = ((indice - 1) Mod dimterrain) + 1
End Function

Public Function colonne(ByVal indice As Integer) As Integer
'reourne la colonne correspondant à indice
colonne = ((indice - 1) \ dimterrain) + 1
End Function

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

Public Sub Voisin()
Dim col As Integer
Dim lig As Integer
Dim ind As Integer
Dim voisins As Integer
ind = indice(lig, col)
voisins = 0
For lig = 1 To dimdamier
For col = 1 To dimterrain

If ind(lig + 1, col + 1) agent(ind).BackColor &HFF& Then voisins = voisins + 1
If ind(lig + 1, col) agent(ind).BackColor &HFF& Then voisins = voisins + 1
If ind(lig + 1, col - 1) agent(ind).BackColor &HFF& Then voisins = voisins + 1
If ind(lig - 1, col + 1) agent(ind).BackColor &HFF& Then voisins = voisins + 1
If ind(lig - 1, col) agent(ind).BackColor &HFF& Then voisins = voisins + 1
If ind(lig - 1, col - 1) agent(ind).BackColor &HFF& Then voisins = voisins + 1
If ind(lig, col + 1) agent(ind).BackColor &HFF& Then voisins = voisins + 1
If ind(lig, col - 1) agent(ind).BackColor &HFF& Then voisins = voisins + 1

Else

If ind(lig + 1, col + 1) agent(ind).BackColor &HFF0000 Then voisins = voisins + 0
If ind(lig + 1, col) agent(ind).BackColor &HFF0000 Then voisins = voisins + 0
If ind(lig + 1, col - 1) agent(ind).BackColor &HFF0000 Then voisins = voisins + 0
If ind(lig - 1, col + 1) agent(ind).BackColor &HFF0000 Then voisins = voisins + 0
If ind(lig - 1, col) agent(ind).BackColor &HFF0000 Then voisins = voisins + 0
If ind(lig - 1, col - 1) agent(ind).BackColor &HFF0000 Then voisins = voisins + 0
If ind(lig, col + 1) agent(ind).BackColor &HFF0000 Then voisins = voisins + 0
If ind(lig, col - 1) agent(ind).BackColor &HFF0000 Then voisins = voisins + 0

End If

'Prise en compte de la fermeture toroïdale du damier:'

If lig < 1 Then 'si le numéro de la ligne dépasse le haut du damier'
lig = lig + dimterrain 'on prend la ligne du bas'
ElseIf lig > dimterrain Then 'si le numéro de la ligne dépasse le bas du damier'
lig = lig - dimterrain 'on prend la ligne du haut'
End If
If col < 1 Then 'si le numéro de la colonne dépasse la gauche du damier'
col = col + dimterrain 'on prend la colonne de droite'
ElseIf col > dimterrain Then 'si le numéro de la colonne dépasse la droite du damier'
col = col - dimterrain 'on prend la colonne de gauche'

Next col
Next lig
End Sub

Public Sub satisfaction()
Dim heureux As Boolean
Dim seuil As Integer
seuil = InputBox("Entrez le nombre maximum de voisins différents tolérés")

If voisins <= seuil Then
heureux = True
Else
If voisins > seuil Then
heureux = False
End If

If heureux = False Then
agent(ind) = insatisfait
Call déplacement

déplacement= ?
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
18 avril 2007 à 08:16
Salut,
Ca ressemble à une variante du jeu de la vie tout ca...

Question?: est ce que tu as commencer à debugguer un peu?
Je dis ca car dans le code
1 - il y deux Option Explicit,
2 - la definition suivante: Public damier(1 To dimterrain, 1 To dimterrain) As Integer  est impossible en VB6
3 - La variable Voisins n'est déclarée nul part.
Bref... il faut procéder par étape.
De plus quel sont les contrôles nécessaires à placer sur la Form pour essayer de te dépanner
@+: Ju£i?n
Pensez: Réponse acceptée
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
18 avril 2007 à 09:23
Re,
Pour conitnuer avec les truc bizarres:

Dim ind As Integer
If ind(lig + 1, col + 1), ----
[code.aspx?ID= 41455 By Renfield]
ind(lig + 1 , col + 1) est un tableau et non un entier

Peu être voulais tu faire ind = indice(lig +1, col+1)....

Deplus le If suivant est très bizarre que veux tu faire exactementIf ind(lig + 1, col + 1) agent(ind).BackColor &HFF& Then

De plus il ya des Else alors qu'aucun If est ouvert . Des IF Sans End IF Bref... avant d'essayer d'aller plus loin tu devrais essayer de te relire un peu et de compiler plus souvent ton projet...

@+: =89254 Ju£i?n
Pensez: Réponse acceptée
0

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

Posez votre question
tlemeillat Messages postés 26 Date d'inscription jeudi 8 mars 2007 Statut Membre Dernière intervention 17 mai 2007
18 avril 2007 à 09:25
effectivement cela est une variante du jeu de la vie, voilà l'énoncé:

Que se passe-t-il si, après avoir disposé aléatoirement un même nombre de pièce de nickel et de cuivre sur un échiquier, je déplace chacune des pièces dont au moins à 50% de ses 8 voisines sont du métal opposé, et ce jusqu'à ce que plus aucune ne soit dans cette configuration ?
Le modèle de ségrégation illustre comment des individus en interaction peuvent produire un phénomène macroscopique (les recoupements homogènes) dont la réalisation n'était pas une des motivations de leur activité. En effet dans ce modèle le comportement des agents est orienté par le seul désir de disposer d'un voisinage proche composé d'un certains taux d'agents de la même catégorie.

Le modèle est assez simple, il est composé d'un damier et d'un certain nombre d'agents dont le comportement est paramétré par un seuil de tolérance.
La moitié des agents appartient à une catégorie (par exemple les rouges), et l'autre à une autre catégorie (par exemple les bleus). Les agents peuvent être ou ne pas être heureux suivant que le taux de voisins de l'autre catégorie est inférieur au seuil de tolérance.
La simulation est initialisée en distribuant aléatoirement les agents sur le damier. Un pas de simulation consiste alors à déplacer chaque agent malheureux sur une case du damier laissée vide par un autre agent souhaitant se déplacer. Ce déplacement peut ne pas être systématique mais s'effectuer selon une certaine probabilité. L'opération est ainsi répétée jusqu'à ce que tous les agents soient heureux.

Il est demandé de réaliser une application qui permet à l'utilisateur de:
- réinitialiser le damier, pour faire une nouvelle partie,
- faire 1 pas de simulation,
- faire 10 ou 20 pas de simulation
- lancer la simulation jusqu'à ce que les agents ne se déplacent plus
- régler au moins l'un des paramètres tels que la taille du damier, le seuil de satisfaction des agents, le pourcentage d'agents bleus et d'agent rouge ou bien la probabilité qu'un agent malheureux se déplace.
L'application pourra permettre à l'utilisateur d'obtenir des informations telles que le nombre d'agents qui ont 8, 7, 6, 5 ou 4 voisins semblables à eux ou bien le nombre de pas de la simulation en cours.


Le squelette de l'application

A l'écran, les cases sont des contrôles de type label, et elles sont chargées dynamiquement au lancement de l'application à partir du contrôle agent(0) ; le (name) de chaque cellule est donc agent(i), où i est un entier correspondant à l'indice de la cellule. La constante dimdamier définit la dimension du damier, c'est à dire le nombre de lignes et de colonnes, par exemple 10.
Afin d'enregistrer des informations sur chaque agent, vous pourrez utiliser un tableau
damier (1 to dimdamier, 1 to dimdamier) as integer, où :
la première composante correspond à la ligne sur laquelle se trouve une case, et la seconde sa colonne.

Pour mettre en relation l'indice d'une agent(i) et la ligne et la colonne du damier sur laquelle il se trouve, on utilise la bijection suivante :
{1 ... 100} ----------------> {1 ... 10 } x {1 ... 10}
ligne : indice :-------------------> ((i-1) mod 10) + 1
colonne: indice :-------------------> (i-1 \ 10) + 1)
{1 ... 10 } x {1 ... 10}----------------> {1 ... 100}
indice : (ligne, colonne) :--------------> ligne + (colonne - 1) *10
où \ est la division entière et mod le reste de la division entière.
Les trois fonctions ligne, colonne et indice vous sont données dans le squelette.

Le squelette comporte :
? l'initialisation de la présentation graphique du damier;
? un exemple de ce qui peut être fait lorsque le joueur clique sur une case.



je viens juste de le commencer, je vais essayer de corriger les erreurs du programme précédent(merci pour ta réponse), par contre je ne sais pas comment traiter les "insatisfaits", je pensais les mettre dans un tableau et puis les redistribuer sur le damier sur les cases laissées vides afin que tous les "agents soient satisfaits, mais je ne sais pas comment traduire cela en vb
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
18 avril 2007 à 09:39
Salut,
Pas mal l'exo, tu es à l'école?
Ce qui est important d'avoir à l'esprirt lors des déplacement, c'est ceci:
"Un pas de simulation consiste alors à déplacer chaque agent malheureux
sur une case du damier laissée vide par un autre agent souhaitant se
déplacer. Ce déplacement peut ne pas être systématique mais s’effectuer
selon une certaine probabilité."

Ensuite si j'étais toi je commencerais par revoir ma procédure Voisin pour en faire un fonction qui te retourne le nombre de  voisin semblable pour un indice d'agent donné.
Est ce que j'ai raison de dire:
- "Le damier comporte plus de cases que d'agents!" car sinon si aucune case n'est vide c'est encore plus balaise me semble t il .

@+: Ju£i?n
Pensez: Réponse acceptée
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
18 avril 2007 à 09:47
Re,
voilà à quoi je pense pour essayer d'avancer un peu.
1- Faire une fonction Voisin te retournant le nombre de voisin semblable en fonction d'un indice.
2 -Faire un tableau dynamique contenant  l'indice des agent insatisfait + leur couleur. (type string par exemple) ou alors un tableau de TYPE
3 -Colorier les cases avec une couleur tampon.
4 - Parcourir le tableau d'instaisfait et voir si il est satisfait dans les autres indice si oui recolorier la case de la bone couleur.

PB: la ou je bloque c'est pour utiliser le fait que le déplacement n'est pas systématique

@+: 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
18 avril 2007 à 12:02
Je sors de mon cours de développement et le prof nous a dit que ct pas nécessaire d'ajouter le fait que les agents se déplacent selon une proba.

pour déplacer les agents insatisfaits dans un tableau, j'aimerai faire un truc du genre:

Public Sub déplacer()
Dim i As Integer
Dim j As Integer
Dim dimtemp As Integer
Dim temp(1 To dimtemp, 1 To dimtemp) As Integer
ind(lign, col) = temp(i, j)

End Sub

Public Sub rangement()
For i = 1 To dimtemp
For j = 1 To dimtemp
Randomize
x = Int(insatisfait * Rnd)
End Sub

ReDim damier(1 To dimterrain, 1 To dimterrain) As Integer

...mais je n'arrive pas à le formuler correctement

sinon pour l'expression "If ind(lig + 1, col + 1) agent(ind).BackColor &HFF& Then" c'est pour exprimer le fait que si le voisin(ici celui du bas à droite)est de la couleur rouge, et que la case du milieu(la cellule (2,2) dans un tableau(3,3))est de couleur bleu alors le nb de voisins différents va être incrémenté de 1, ce qui permet d'avoir le nb de voisins différents(8 au max)à comparer au seuil que j'aurai rentré au début
0
tlemeillat Messages postés 26 Date d'inscription jeudi 8 mars 2007 Statut Membre Dernière intervention 17 mai 2007
18 avril 2007 à 12:36
Je sors de mon cours de développement et le prof nous a dit que ct pas nécessaire d'ajouter le fait que les agents se déplacent selon une proba.

pour déplacer les agents insatisfaits dans un tableau, j'aimerai faire un truc du genre:

Public Sub déplacer()
Dim i As Integer
Dim j As Integer
Dim dimtemp As Integer
Dim temp(1 To dimtemp, 1 To dimtemp) As Integer
ind(lign, col) = temp(i, j)

End Sub

Public Sub rangement()
For i = 1 To dimtemp
For j = 1 To dimtemp
Randomize
x = Int(insatisfait * Rnd)
End Sub

ReDim damier(1 To dimterrain, 1 To dimterrain) As Integer

...mais je n'arrive pas à le formuler correctement

sinon pour l'expression "If ind(lig + 1, col + 1) agent(ind).BackColor &HFF& Then" c'est pour exprimer le fait que si le voisin(ici celui du bas à droite)est de la couleur rouge, et que la case du milieu(la cellule (2,2) dans un tableau(3,3))est de couleur bleu alors le nb de voisins différents va être incrémenté de 1, ce qui permet d'avoir le nb de voisins différents(8 au max)à comparer au seuil que j'aurai rentré au début
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
18 avril 2007 à 13:17
Salut,
Je ne vais pas pouvoir beaucoup me pencher sur le sujet cet aprem mais regarde ce que j'ai fait au niveau de GetVoisins
cela pourra peu etre t'aiguiller sur qqch

Option Explicit

'le nbre de cases du damier, en largeur et hauteur
Private dimterrain As Integer
   'informations sur chaque agent du terrain
Private damier(1 To 50, 1 To 50) As Integer
Public Sub IniatialisationDamier()
dimterrain = 10
'dimensionnement des agents, sur un damier de 6000 points,
Agent(0).Height = 6000 / dimterrain
Agent(0).Width = 6000 / dimterrain
Agent(0).Visible = False
   
'charge une copie de agent(0) pour chaque  emplacement du damier
Dim Col As Integer
Dim Lig As Integer
Dim Ind As Integer
For Col = 1 To dimterrain
 For Lig = 1 To dimterrain
   Ind = indice(Lig, Col)
   Load Agent(Ind)
   'le damier est situé en haut à gauche de la fenetre
   Agent(Ind).Left = Agent(0).Width * (Col - 1)
   Agent(Ind).Top = Agent(0).Height * (Lig - 1)
   Agent(Ind).Visible = True
   Agent(Ind).Enabled = True
   Agent(Ind).Caption = Ind
   
 Next Lig
Next Col
Call ColorierAgents
End Sub<hr />
Private Sub ColorierAgents()
'exemple pour colorier un agent
Dim Col As Integer
Dim Lig As Integer
For Col = 1 To dimterrain
 For Lig = 1 To dimterrain
   Randomize   Agent(indice(Lig, Col)).BackColor IIf(Int((2 * Rnd) + 1) 1, vbBlue, vbRed)
   
 Next Lig
Next Col
   
End Sub<hr />
'POUR VERIFIER que les fonction "colonne" et "ligne" retournent les bonnes valeurs
Public Sub agent_Click(Index As Integer)
   'MsgBox GetVoisins(Index) & " " & IIf(Agent(Index).BackColor = vbRed, "vbRed", "vbBlue")
   Dim BonneCouleur As Integer
   BonneCouleur = GetVoisins(Index)
   If BonneCouleur < 4 Then MsgBox ("AGENT " & Index & " INSATISFAIT AVEC " & 8 - BonneCouleur & " VOISINS DIFFERENTS")
End Sub<hr />

Public Function Ligne(ByVal indice As Integer) As Integer
   'retourne la ligne correspondant à ind
Ligne = ((indice - 1) Mod dimterrain) + 1
End Function<hr />
Public Function Colonne(ByVal indice As Integer) As Integer
   'reourne la colonne correspondant à indice
Colonne = ((indice - 1) \ dimterrain) + 1
End Function<hr />
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<hr />
Private Function GetVoisins(ByVal Ind As Integer) As Integer
Dim Col As Integer
Dim Lig As Integer
Dim CouleurInd As Long
Col = Colonne(Ind)
Lig = Ligne(Ind)
CouleurInd = Agent(Ind).BackColor
   'MsgBox "INDICE: " & Ind & " COONNE: " & Col & " LIGNE:" & Lig
   If IsSameColor(Lig + 1, Col + 1, CouleurInd) Then GetVoisins = GetVoisins + 1
   If IsSameColor(Lig + 1, Col, CouleurInd) Then GetVoisins = GetVoisins + 1
   If IsSameColor(Lig + 1, Col - 1, CouleurInd) Then GetVoisins = GetVoisins + 1
   If IsSameColor(Lig - 1, Col + 1, CouleurInd) Then GetVoisins = GetVoisins + 1
   If IsSameColor(Lig - 1, Col, CouleurInd) Then GetVoisins = GetVoisins + 1
   If IsSameColor(Lig - 1, Col - 1, CouleurInd) Then GetVoisins = GetVoisins + 1
   If IsSameColor(Lig, Col + 1, CouleurInd) Then GetVoisins = GetVoisins + 1
   If IsSameColor(Lig, Col - 1, CouleurInd) Then GetVoisins = GetVoisins + 1

End Function<hr />

Private Function IsSameColor(ByVal Lig As Integer, ByVal Col As Integer, ByVal CouleurInd As Long) As Boolean
   Dim Ind As Integer
   Ind = indice(Lig, Col)
   'MsgBox Ind
   If (Ind > 0) And (Ind < (dimterrain * dimterrain)) Then       IsSameColor (Agent(Ind).BackColor CouleurInd)
       'If IsSameColor Then Agent(Ind).Visible = False
   Else
       IsSameColor = False
   End If
End Function<hr />

Public Sub satisfaction()
Dim heureux As Boolean
Dim seuil As Integer
Dim voisins As Integer
Dim Ind As Integer
Dim insatisfait As Integer
seuil = InputBox("Entrez le nombre maximum de voisins différents tolérés")
heureux = (voisins <= seuil)
If Not heureux Then
   Agent(Ind) = insatisfait
   Call deplacement
End If

End Sub<hr />
Private Sub deplacement()

End Sub<hr />

Private Sub Form_Load()
   IniatialisationDamier
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
18 avril 2007 à 13:33
merci beaucoup, je vais y passer tout l'aprem dessus, si jamais je comprends pas qqch je me "permettrais" de te demander conseil

A+ et bon aprem
0
tlemeillat Messages postés 26 Date d'inscription jeudi 8 mars 2007 Statut Membre Dernière intervention 17 mai 2007
18 avril 2007 à 15:41
je ne comprend pas la partie droite de l'égalité suivante:

agent(indice(Lig, Col)).BackColor IIf(Int((2 * Rnd) + 1) 1, vbBlue, vbRed)

Que signifit le "IIf" ?

A+
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
18 avril 2007 à 16:17
Salut,
IIF permet de faire un If Then Else sur une seule ligne,

En Faite cette ligneagent(Indice(Lig, Col)).BackColor IIf(Int((2 * Rnd) + 1) 1, vbBlue, vbRed)

Est équivalente à

If (Int((2 * Rnd) + 1) = 1) Then
   agent(Indice(Lig, Col)).BackColor = vbBlue
Else
   agent(Indice(Lig, Col)).BackColor = vbRed
End If , ----
[code.aspx?ID=41455 By Renfield]
Voila   
@+: 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
18 avril 2007 à 16:40
merci
0
tlemeillat Messages postés 26 Date d'inscription jeudi 8 mars 2007 Statut Membre Dernière intervention 17 mai 2007
18 avril 2007 à 21:35
Excuse moi de te déranger, j'ai une petite question:

dans cette procédure:

"'POUR VERIFIER que les fonction "colonne" et "ligne" retournent les bonnes valeurs
Public Sub agent_Click(Index As Integer)
'MsgBox GetVoisins(Index) & " " & IIf(Agent(Index).BackColor = vbRed, "vbRed", "vbBlue")
Dim BonneCouleur As Integer
BonneCouleur = GetVoisins(Index)
If BonneCouleur < 4 Then MsgBox ("AGENT " & Index & " INSATISFAIT AVEC " & 8 - BonneCouleur & " VOISINS DIFFERENTS")
End Sub "

j'aimerai remplacer "4" par "seuil" afin de pouvoir donner la valeur de seuil que je souhaite (entre 1 et 8). Ainsi je voulais ajouter à cette procédure:

Dim Seuil(1 to 8) as integer
Seuil=Inputbox("Donnez le seuil désiré")

mais quand je l'ajoute et que je click sur un agent ça bug et ça me dit "compile error: can't assign to array"
0
tlemeillat Messages postés 26 Date d'inscription jeudi 8 mars 2007 Statut Membre Dernière intervention 17 mai 2007
18 avril 2007 à 22:23
Excuse moi de te déranger, j'ai une petite question:

dans cette procédure:

"'POUR VERIFIER que les fonction "colonne" et "ligne" retournent les bonnes valeurs
Public Sub agent_Click(Index As Integer)
'MsgBox GetVoisins(Index) & " " & IIf(Agent(Index).BackColor = vbRed, "vbRed", "vbBlue")
Dim BonneCouleur As Integer
BonneCouleur = GetVoisins(Index)
If BonneCouleur < 4 Then MsgBox ("AGENT " & Index & " INSATISFAIT AVEC " & 8 - BonneCouleur & " VOISINS DIFFERENTS")
End Sub "

j'aimerai remplacer "4" par "seuil" afin de pouvoir donner la valeur de seuil que je souhaite (entre 1 et 8). Ainsi je voulais ajouter à cette procédure:

Dim Seuil(1 to 8) as integer
Seuil=Inputbox("Donnez le seuil désiré")

mais quand je l'ajoute et que je click sur un agent ça bug et ça me dit "compile error: can't assign to array"
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 à 08:14
Salut,
La déclaration que tu as fait de Seuil est un Tableau d'entier de 8 éléments, Hors toi tu veux simplement que la variable seuil soit un entier entre 1 et 8

Le code suivant aura pour effet de demander la valeur de Seuil TANT QU'elle ne sera pas comprise entre 1 et 8
'Dans la partie commune à tous le code
'=>vers Option Explicit
Dim Seuil As Integer
'la ou tu veux initialiser Seuil
While Seuil > 8 Or Seuil < 1
   Seuil = CInt(Val(InputBox("Donnez le seuil désiré")))
Wend, ----
[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 à 10:52
Salut,
Tout d'abord merci de m'avoir répondu. J'ai un petit souci pour la procédure 'déplacement' et 'rangement':

Public Sub satisfaction()
Dim heureux As Boolean
Dim Seuil As Integer
Dim Voisins As Integer
Dim Ind As Integer
Dim insatisfait As Integer
While Seuil > 8 Or Seuil < 1
Seuil = InputBox("Donnez le nombre de voisins de même couleur compris entre 1 et 8 souhaité")
Wend
heureux = (Voisins >= Seuil)
If Not heureux Then
agent(Ind) = insatisfait
Call deplacement
End If
End Sub

Private Sub deplacement()
'ébauche'
'dans cette procédure j'aimerais que l'ordi parcours le damier et à chaque fois qu'il trouve un agent insatisfait sur le damier il rentre ses coordonnées et sa couleur dans un tableau(invisible à l'écran)'

Dim i As Integer
Dim j As Integer
Dim dimtemp As Integer
Dim temp(1 To dimtemp, 1 To dimtemp, CouleurInd) As Integer
For lig= 1 to dimterrain
For col= 1 to dimterrain
Ind(lig, Col) = temp(i, j) 'je sais pas comment intégrer la couleur comme 3ème dimension du tableau temp'
Next Lig
Next Col
End Sub

Public Sub rangement()
'ébauche'
'ici j'aimerais "redispatcher" les agents insatisfaits du tableau invisible sur le damier aux emplacements qui conviennent pour qu'à la fin tous les agents du damier soient satisfaits'

Dim x as Integer
For i = 1 To dimtemp
For j = 1 To dimtemp
Randomize
x = Int(insatisfait * Rnd)
temp(i,j)=damier(1 To dimterrain, 1 To dimterrain)
End Sub

ReDim damier(1 To dimterrain, 1 To dimterrain) As Integer

...merci pour ton aide...
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 à 11:32
Salut,
Pour ce qui concerne Deplacement:
Ce qu'il te faut c 'est un tableau à trois dimensions certes (quoique compliquer pour ce qu'il apporte) mais que tu devras redimensionner au fur et a mesure (compliquer lorsque plus d'une dimension)

1 - Si j'ai bien compris tu veux un tableau qui stocke pour chaque agent Instatisafit, sa ligne sa colonne et sa couleur (moi j'ajouterais pour plus de simplicite lors de la procédure rangement, le nombre de voisins de couleur differentes qu'il possède).
Je te propose donc plutot que de passer par un tableau à trois dimension, de faire un tableau de Type (a mon avis plus simple) essaie de comprendre le code du dessous.
2 - C'est Dans ta procédure Satisfaction, qu'il serait mieus de parcourrir ton damier,et de ranger les instatisfaits.

Le code suivant est à rajouter à l'existant (c'est moi qui suis en train de te faire l'exo)

Option Explicit
Private Type T_Agent
   T_Ligne As Integer
   T_Colonne As Integer
   T_Couleur As Long
   T_VoisinsDifferents As Integer
End Type

Private LesInsatisfaits() As T_Agent
Public Sub satisfaction()
Dim heureux As Boolean
Dim seuil As Integer
Dim voisins As Integer
Dim Ind As Integer
Dim insatisfait As Integer
Dim Col As Integer
Dim Lig As Integer
Dim Tmp_Agent As T_Agent
   seuil = InputBox("Entrez le nombre maximum de voisins différents tolérés")
   heureux = (voisins <= seuil)

   'redimensionne le tableau pour une premiere fois
   ReDim LesInsatisfaits(0)
   For Col = 1 To dimterrain
       For Lig = 1 To dimterrain
           Ind = indice(Lig, Col)
           voisins = 8 - GetVoisins(Ind)
           heureux = (voisins <= seuil)
           If Not heureux Then
               'on rempli la variable de type T_Agent
               Tmp_Agent.T_Colonne = Col
               Tmp_Agent.T_Ligne = Lig
               Tmp_Agent.T_Couleur = Agent(Ind).BackColor
               Tmp_Agent.T_VoisinsDifferents = voisins
               'On ajoute la variable de type T_Agent dans le tableau
               'LesInsatisfaits
               LesInsatisfaits(UBound(LesInsatisfaits)) = Tmp_Agent
               'on reprépare une ligne dans le tableau en redimensionnat
               'Preserve signifie que le redimensionnement n'entraine
               'pas de perte de donne un redim seul lui pert les donnée
               ReDim Preserve LesInsatisfaits(UBound(LesInsatisfaits) + 1)
           End If
       Next Lig
   Next Col
   'Nous sommes ici obliger de supprimer le dernier élément du tableau LesInsatisfaits
   'car il y en a une vide
   ReDim Preserve LesInsatisfaits(UBound(LesInsatisfaits))
End Sub<hr />, ----
[code.aspx?ID=41455 By Renfield]
Pour la procédure rangement, il faudra alors que tu parcour ton tableau d'instatifait dans une premiere boucle puis dans une seconde boucle que tu regarde ou tu pourrais le mettre (toujours en ragardant simplement dans le tableau d'instatisfait)

@+: Ju£i?n
Pensez: Réponse acceptée
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 à 11:37
Re,
Je crois en fait que le nombre de voisins differents est INUTILE (désolé de t'embrouiller)

@+: Ju£i?n
Pensez: Réponse acceptée
0
Rejoignez-nous