tlemeillat
Messages postés26Date d'inscriptionjeudi 8 mars 2007StatutMembreDernière intervention17 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 -)
jrivet
Messages postés7392Date d'inscriptionmercredi 23 avril 2003StatutMembreDernière intervention 6 avril 201260 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.
tlemeillat
Messages postés26Date d'inscriptionjeudi 8 mars 2007StatutMembreDernière intervention17 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
jrivet
Messages postés7392Date d'inscriptionmercredi 23 avril 2003StatutMembreDernière intervention 6 avril 201260 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
jrivet
Messages postés7392Date d'inscriptionmercredi 23 avril 2003StatutMembreDernière intervention 6 avril 201260 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...
tlemeillat
Messages postés26Date d'inscriptionjeudi 8 mars 2007StatutMembreDernière intervention17 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
jrivet
Messages postés7392Date d'inscriptionmercredi 23 avril 2003StatutMembreDernière intervention 6 avril 201260 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 .
jrivet
Messages postés7392Date d'inscriptionmercredi 23 avril 2003StatutMembreDernière intervention 6 avril 201260 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
tlemeillat
Messages postés26Date d'inscriptionjeudi 8 mars 2007StatutMembreDernière intervention17 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
tlemeillat
Messages postés26Date d'inscriptionjeudi 8 mars 2007StatutMembreDernière intervention17 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
jrivet
Messages postés7392Date d'inscriptionmercredi 23 avril 2003StatutMembreDernière intervention 6 avril 201260 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]
tlemeillat
Messages postés26Date d'inscriptionjeudi 8 mars 2007StatutMembreDernière intervention17 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"
tlemeillat
Messages postés26Date d'inscriptionjeudi 8 mars 2007StatutMembreDernière intervention17 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"
jrivet
Messages postés7392Date d'inscriptionmercredi 23 avril 2003StatutMembreDernière intervention 6 avril 201260 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]
tlemeillat
Messages postés26Date d'inscriptionjeudi 8 mars 2007StatutMembreDernière intervention17 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
jrivet
Messages postés7392Date d'inscriptionmercredi 23 avril 2003StatutMembreDernière intervention 6 avril 201260 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)