Aide pour bug dans logiciel simulation cellules

Aide pour bug dans logiciel simulation cellules - VB/VBA/VBS - Programmation

Marsh Posté le 05-01-2010 à 19:59:26    

Bonjour,
 
Je suis en train de créer un programme basé sur le jeu de la vie qui simule la vie cellulaire. A partir d'un effectif de départ et d'une contrainte fixé par l'utilisateur, les cellules qui sont seules meurent. Celles qui sont entourés de la contrainte +1 meurent également. Dans le cas où il y a beaucoup de cellule initiale le programme fonctionne un certains temps avant d'atteindre un état d'équilibre. Mon programme atteint un équilibre beaucoup trop tôt. Il s'arrête alors même que des cellules devraient mourrire et d'autres générés en conséquence.
 
Merci de votre aide en espérant avoir été claire.  
 

'Déclaration des variables
Dim converge As Boolean
Dim virtueltab(1 To 100, 1 To 100) As Byte 'Tableau de transition
Dim vietab(1 To 100, 1 To 100) As Byte 'Tableau initial
Dim n As Integer 'Effectif de départ
Dim pauser As Boolean
Dim evol As Integer
Dim i As Integer 'Compteur des lignes du tableau initial
Dim j As Integer 'Compteur des colonnes du tableau initial
Dim l As Integer 'Compteur des lignes du tableau de transition
Dim m As Integer 'Compteur des colonnes du tableau de transition
Dim k As Integer 'Nombre de cellules voisines pour une cellule
Dim b As Integer 'Contrainte fixée par l'utilisateur
Dim popu As Integer
Dim reponse As VbMsgBoxResult
 
 
'Procédure initialisation
Sub initialisation(ByRef x() As Byte)
Dim i, j As Integer
'Remplissage du tableau avec des 0
For i = 1 To 100
    For j = 1 To 100
        x(i, j) = 0
    Next
Next
End Sub
 
'Procédure remplir
Sub remplir(ByVal n As Integer, ByRef x() As Byte)
Dim i, j, m As Integer
 
'Remplissage aléatoire du tableau: boucle répéter jusqu'à ce que les cases du tableau prennent la valeur 1, et ceci n fois
Randomize
For m = 1 To n
    Do
        i = Int(99 * Rnd) + 1
        j = Int(99 * Rnd) + 1
    Loop Until x(i, j) = 0
    x(i, j) = 1
Next
End Sub
         
'Fonction comptage
Function comptage(ByRef x() As Byte, ByVal i As Integer, ByVal j As Integer) As Integer
Dim l, c, n As Integer
Dim imin, imax, jmin, jmax As Integer
 
n = 0 'Initialisation du compteur
 
'Détermination des bornes du tableau dans un univers restreint
imin = i - 1
imax = i + 1
jmin = j - 1
jmax = j + 1
 
'Comptage dans les coins
If i = 1 Then
    imin = 1
Else
    If i = 100 Then
        imax = 100
    End If
End If
 
If j = 1 Then
    jmin = 1
Else
    If j = 100 Then
        jmax = 100
    End If
End If
 
'Comptage des futures cellules affichées
For l = imin To imax
    For c = jmin To jmax
        If x(l, c) = 1 Then
            n = n + 1
        End If
    Next
Next
 
If x(i, j) = 1 Then
    n = n - 1
End If
comptage = n
 
End Function
 
'Procédure dessiner
Sub dessiner(ByRef x() As Byte)
Dim l, c As Integer
For l = 1 To 100
    For c = 1 To 100
        If x(l, c) = 1 Then
            Picture1.FillStyle = 0 'Remplissage plein de la cellule vivante
            Picture1.FillColor = QBColor(4) 'Remplissage de couleur rouge de la cellule vivante
            Picture1.Circle (50 * l, 50 * c), 25, QBColor(4)
        Else
            Picture1.FillStyle = 0.01 'Remplissage plein de la cellule morte
            Picture1.FillColor = QBColor(15) 'Remplissage de couleur blanche de la cellule morte
            Picture1.Circle (50 * l, 50 * c), 25, QBColor(15) 'Couleur et forme de la cellule morte
        End If
         
        Picture1.AutoRedraw = True 'Rafraîchissement de l'image
         
    Next
Next
Refresh
End Sub
 
'Fonction evolution
Function evolution(ByRef x() As Byte, ByRef y() As Byte, ByVal i, j, b, k As Integer) As Integer
Dim c As Integer
c = 0
 
'k est le nombre de voisins autour de la cellule
If k = b + 1 Then
    If x(i, j) = 1 Then
        y(i, j) = 1
    Else
        y(i, j) = 1
        c = c + 1
    End If
End If
 
'Fonction de comptage des voisins en tenant compte des la contrainte b
If k = b Then
    If x(i, j) = 1 Then
        y(i, j) = 1
    Else
        y(i, j) = 0
    End If
End If
 
'Cas de la cellule seule ou entourée de plus de trois cellules: elle meurt dans virtueltab
If k < b Or k > b + 1 Then
    If x(i, j) = 1 Then
        y(i, j) = 0
        c = c + 1
    Else
        y(i, j) = 0
    End If
End If
 
'vietab reçoit les modifications effectuées dans virtueltab
x(i, j) = y(i, j)
evolution = c
End Function
 
'Fonction comptevol: comptage post évolution
Function comptevol(ByRef x() As Byte)
Dim i, j As Integer
Dim c As Integer
 
c = 0
For i = 1 To 100
    For j = 1 To 100
        If x(i, j) = 1 Then
            c = c + 1
        End If
    Next
Next
 
comptevol = c
End Function
 
Private Sub Bgo_Click()
 
'Algorithme principal
 
'Appel de la procédure de création du tableau
Call initialisation(vietab)
 
'On demande à l'utilisateur de définir un effectif de départ
If Teffectif.Text = "" Then
    n = InputBox("Effectif de départ?" )
    Teffectif.Text = n
Else
    n = Teffectif.Text
End If
 
'Choix de la contrainte
If Tcontrainte.Text = "" Then
    b = InputBox("Choix d'une contrainte entre 1 et 4" )
    Tcontrainte.Text = b
Else
    b = Tcontrainte.Text
End If
 
 
'Appel de la procédure de remplissage par randomisation
Call remplir(n, vietab)
 
'Appel de la procédure de dessin des cellules
Call dessiner(vietab)
 
evol = 0
For i = 1 To 100
    For j = 1 To 100
        'Appel de la fonction comptage, k reçoit sa valeur de sortie
        k = comptage(vietab, i, j)
        'Mise en correspondance des 2 tableaux
        c = evolution(vietab, virtueltab, i, j, b, k)
        evol = evol + c
    Next
Next
 
'La valeur de convergence est atteinte lorsqu'il n'y a plus d'écart entre les 2 tableaux
converge = evol = 0
 
'Somme des cellules vivantes
popu = comptevol(vietab)
 
'Dessin des valeurs contenues dans vietab
Call dessiner(vietab)
 
'Pause dans la boucle
Do
DoEvents
'Fin de la boucle si convergence au pause
Loop Until converge Or pauser
 
End Sub
 
 
 
 
 
 
 
 
 
Private Sub Bquitter_Click()
End
End Sub
 
 


Message édité par Profil supprimé le 05-01-2010 à 20:33:52
Reply

Marsh Posté le 05-01-2010 à 19:59:26   

Reply

Marsh Posté le 05-01-2010 à 21:00:56    

c'est un programme basique pourtant :D :lol:

Reply

Marsh Posté le 06-01-2010 à 16:36:36    

Bonjour,
que fait le DO juste avant DoEvents??
 
es-tu certain que:
 
'vietab reçoit les modifications effectuées dans virtueltab  
x(i, j) = y(i, j)  
 
 
n'est pas un peu prématuré à cet endroit?
 
Cordialement

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed