Visual Basic: programmation d'un jeu de simulation de vie[tout en bas]

Visual Basic: programmation d'un jeu de simulation de vie[tout en bas] - VB/VBA/VBS - Programmation

Marsh Posté le 31-01-2006 à 16:19:57    

Bonjour à tous,
 
 
J'ai un projet à réaliser en visual basic. Je connais assez bien le langage de programmation (boucle, booléen...etc...) mais, mon gros problème réside dans le fait que j'ai beaucoup de mal à analyser le sujet pour le découper en une série de sous programme.
 
Je souhaiterais avoir un peu d'aide pour démarrer mon projet. Merci
 

Citation :

Le but de ce projet est de simuler un jeu de la vie. Le jeu de la vie est le plus célèbre des automates cellulaires. Il a été inventé par John Conway et popularisé dans la rubrique de Martin Gardner du magazine américain "Scientific American" d'octobre 1970.  
 
Le jeu de la vie consiste à faire naître, vivre ou mourir des cellules. Celles-ci sont disposées sur une grille carrée. Chaque case de la grille contient une cellule. Initialement une cellule est soit "en vie"  soit "morte". A chaque génération, les cellules évoluent en fonction de l’état de leurs voisines, en suivant une loi d’évolution.  
 
Par exemple, une loi d’évolution peut être :  
• Une cellule en vie meurt si elle a plus de 3 voisins morts,  
• Une cellule en vie survit si elle a exactement 2 voisins en vie,
• Une cellule morte naît si elle a exactement 3 voisins en vie.  
Les cases voisines d’une case donnée sont les quatre cases adjacentes, c’est-à-dire les cases ayant au moins un côté en commun.
 
D’autres règles d’évolution sont envisageables. Lors d’une exécution, toutes les cellules suivent la même règle d’évolution.  
 
Vous réaliserez une application en Visual basic qui affiche à l’écran à chaque génération l’état des cellules sur la grille, ainsi que des informations sur l’évolution des populations de cellules en vie ou mortes. La grille sera initialisée en fonction du pourcentage de cellules en vie donné par l’utilisateur au lancement de l’application. Vous pourrez envisager de laisser l’utilisateur choisir une règle d’évolution parmi une liste de règles disponibles.
 
 


Message édité par mauriiiiiice le 04-02-2006 à 21:52:44
Reply

Marsh Posté le 31-01-2006 à 16:19:57   

Reply

Marsh Posté le 01-02-2006 à 21:30:54    

ben tu définis un tableau avec pour chaque cellule 2 états (vie / mort)
apres tu fait analyser le tableau et ca change ...
 
nan ?

Reply

Marsh Posté le 01-02-2006 à 22:54:10    

Salut,
j'ai déja fait ce genre d'automate cellulaire.
Si tu as des problêmes précis, demande.
Bonne chance

Reply

Marsh Posté le 02-02-2006 à 11:01:41    

Code :
  1. Option Explicit
  2. Const col_max = 15
  3. Const row_max = 15
  4. Tableau_cellules(1 To col_max, 1 To row_max) As String
  5. Sub affich()
  6. Dim i As String
  7. Dim j As String
  8. Dim x As String
  9. For i = 1 To col_max
  10.      For j = 1 To row_max
  11.    
  12.      x = cellule_hazard() 'Fais appel à une procédure qui va choisir si la cellule est morte ou vivante
  13.      Call mort_ou_vie(i, j, x)
  14.      Next j
  15.     Next i
  16. End Sub
  17. Sub mort_ou_vie(a, b, i)
  18. If i = False Then
  19.    ms.Col = a
  20.    ms.Row = b
  21.    ms.Text = "M"
  22. Else
  23.    ms.Col = a
  24.    ms.Row = b
  25.    ms.Text = "V"
  26.      
  27. End Sub


Voila mes premier algo. J'ai un problème pour créer une procédure (ou une fonction?) qui me sort aléatoirement une valeur.
Je dois me servir de l'objet "ramdomize" mais je ne suis pas sur de moi pour la syntaxe.
Mon deuxième problème est la manière par laquelle j'aurai par exemple 40% de cellules vivantes au départ.

Reply

Marsh Posté le 04-02-2006 à 09:53:03    

Bonjour,
 
J'ai une autre petite question: j'ai un tableau à deux dimensions:
 

Code :
  1. Dim Tableau_cellules(1 To col_max, 1 To row_max)


 
Comment puis je faire pour que les valeurs présentes dans chaque case soient mélangés dans le même tableau?
 
Merci de vos réponses !

Reply

Marsh Posté le 04-02-2006 à 11:11:24    

"Comment puis je faire pour que les valeurs présentes dans chaque case soient mélangés dans le même tableau? " // Sois un peu plus clair

Reply

Marsh Posté le 04-02-2006 à 12:02:21    

Citation :

"Comment puis je faire pour que les valeurs présentes dans chaque case soient mélangés dans le même tableau? " // Sois un peu plus clair


Je vais prendre un exemple: imagines un tableau de 100 cases (10*10)
Les 40 premières cellules auront la valeur "V", les suivantes auront la valeur "M". Après que cette attribution a été faite, je voudrais faire en sorte que toutes les lettres du tableau soient mélangées de façon aléatoire.
 
J'ai du mal à paramétrer corectment l'objet "randomize".


Message édité par mauriiiiiice le 04-02-2006 à 12:02:37
Reply

Marsh Posté le 04-02-2006 à 14:00:54    

Code :
  1. Dim i, j, k As Integer
  2. For k = 1 To 10
  3. aa:
  4. x = Fix(10 * Rnd()) + 1
  5. y = Fix(10 * Rnd()) + 1
  6. If Cells(x, y).Value = "M" Then GoTo aa
  7. Cells(x, y).Formula = "M"
  8. Next
  9. For i = 1 To 10
  10. For j = 1 To 10
  11. If Not Cells(i, j).Value = "M" Then Cells(i, j).Formula = "V"
  12. Next
  13. Next


 
Bon voila l'idée.
 
Ca te remplit exactement 10 cellules avec "M" soit des cellules mortes
Le reste sera des cellules "V" -> vivantes
Le remplissement des "M" se fait de façon aléatoire
on est ici à 10 cellules mortes pour un total de 10x10 (100 cellules) soit 10% de cellules mortes
pour obtenir un chiffre autre, remplacer "For k = 1 To 10" par "For k = 1 To 20" pour obtenir par exemple 20% et ainsi de suite.
Voila
 
--
Edit : orthographe


Message édité par knakes le 04-02-2006 à 14:24:54

---------------
now : do nothing
Reply

Marsh Posté le 04-02-2006 à 15:12:26    

Merci!
Je commence à comprendre comment ça fonctionne. J'ai procéder diffèremment.
 

Code :
  1. Option Explicit
  2. Const col_max = 10
  3. Const row_max = 10
  4. Dim Tableau_cellules(1 To col_max, 1 To row_max)
  5. Const ncell = (col_max * row_max)
  6. Dim Tvi(1 To ncell) As Boolean
  7. Const z = 20


Code :
  1. Private Sub Command6_Click()
  2. Call initJeu(z, Tvie())
  3. 'Fais appel à une procédure qui va choisir si la cellule est morte ou vivante
  4. End Sub


Code :
  1. Private Sub Command1_Click()
  2. Call debut_cycle(MSFlexGrid1)
  3. End Sub


Code :
  1. Sub initJeu(ByVal nbV As Integer, ByRef Tvi() As Boolean)
  2. Dim i As Integer
  3. Dim j As Integer
  4. Dim cell As Integer
  5.        
  6. For i = 1 To ncell
  7.     Tvi(i) = False 'attribue la valeur false par défaut
  8. Next i
  9. j = 1
  10. Do While j <= nbV
  11. 'Ajoute aléatoirement des cellules en vie (true) jusqu'au nombre voulu
  12. Randomize
  13. cell = CInt(Int(Rnd() * ncell))
  14.     If Tvi(cell) = False Then
  15.         Tvi(cell) = True
  16.          End If
  17.         j = j + 1
  18.     Loop
  19. End Sub


Mon problème est ci dessus:
- quel paramètre suplémentaire dois je rentrer pour que la variable "celle" ne prenne pas la valeur 0 (sinon bug) ?
- que dois faire pour évité les doublon, c'est dire que je me retrouve exactement avec 20 cellules vivantes ?
 
 

Code :
  1. Sub debut_cycle(ms As MSFlexGrid)
  2. Dim i As Integer
  3. Dim j As Integer
  4. For i = 1 To col_max
  5.      For j = 1 To row_max
  6.    
  7.    
  8.      Call mort_ou_vie(i, j, ms)
  9.      Next j
  10.     Next i
  11. End Sub


Code :
  1. Function mort_ou_vie(a As Integer, b As Integer, ms1 As MSFlexGrid)
  2. For a = 1 To col_max
  3.      For b = 1 To row_max
  4.    
  5. If Tvie(((a - 1) * 5) + b) = False Then
  6.    Tableau_cellules(a, b) = "M"
  7.    ms1.Col = a - 1
  8.    ms1.Row = b - 1
  9.    ms1.Text = Tableau_cellules(a, b)
  10.  
  11.    Else
  12.    Tableau_cellules(a, b) = "V"
  13.    ms1.Col = a - 1
  14.    ms1.Row = b - 1
  15.    ms1.Text = Tableau_cellules(a, b)
  16.    End If
  17.    Next b
  18. Next a
  19. End Function


 
Merci :))

Reply

Marsh Posté le 04-02-2006 à 15:21:56    

dans mon code
 
x = Fix(10 * Rnd()) + 1
y = Fix(10 * Rnd()) + 1
 
les +1 évite d'avoir des valeurs nulles
 
If Cells(x, y).Value = "M" Then GoTo aa
 
je verifie que la cellule est vide sinon il choisis 1 nouvelle cellule.
 


---------------
now : do nothing
Reply

Marsh Posté le 04-02-2006 à 15:21:56   

Reply

Marsh Posté le 04-02-2006 à 15:26:12    

Code :
  1. j = 1
  2. Do While j <= nbV
  3. 'Ajoute aléatoirement des cellules en vie (true) jusqu'au nombre voulu
  4. Randomize
  5. cell = CInt(Int(Rnd() * ncell))
  6.    If Tvi(cell) = False Then
  7.        Tvi(cell) = True
  8.         End If
  9.        j = j + 1
  10.    Loop


 
moi je mettrais
 

Code :
  1. for j = 1 to nbV
  2. Randomize
  3. lbla:
  4. cell = Int(Rnd() * ncell)
  5. If Tvi(cell) = True Then Goto lbla
  6. If Tvi(cell) = False Then Tvi(cell) = True
  7. next


 
voila
 
---
Edit : viré le CInt()


Message édité par knakes le 04-02-2006 à 15:30:00

---------------
now : do nothing
Reply

Marsh Posté le 04-02-2006 à 15:27:55    

Citation :

dans mon code
 
x = Fix(10 * Rnd()) + 1
y = Fix(10 * Rnd()) + 1
 
les +1 évite d'avoir des valeurs nulles
 
If Cells(x, y).Value = "M" Then GoTo aa
 
je verifie que la cellule est vide sinon il choisis 1 nouvelle cellule.


Comme tu as pu le remarquer, les true et false se faisait dans un tableau non visible à une dimension (plus facile).
 
Je vais essayer avec ta méthode.
 
 
 

Citation :

  1.
      for j = 1 to nbV
   2.
      Randomize
   3.
      lbla:
   4.
      cell = CInt(Int(Rnd() * ncell))
   5.
      If Tvi(cell) = True Then Goto lbla
   6.
      If Tvi(cell) = False Then Tvi(cell) = True
   7.
      next


Dans ton exemple, le "goto lbla" réinitialise le tirage aléatoire?


Message édité par mauriiiiiice le 04-02-2006 à 15:30:55
Reply

Marsh Posté le 04-02-2006 à 21:45:03    

Code :
  1. Option Explicit
  2. Const Longmax = 10
  3. Dim Tableau_cellules(1 To Longmax, 1 To Longmax) As String
  4. Dim Tvie(1 To Longmax, 1 To Longmax) As Boolean
  5. Const nbCellV = 20
  6. Private Sub Command2_Click()
  7.     Call InitTV(Tvie())
  8.     Call InitTabcell(MSFlexGrid1)
  9.     Call hazard2(Tvie())
  10. End Sub
  11. Sub InitTabcell(ms2 As MSFlexGrid)
  12. Dim i As Integer
  13. Dim j As Integer
  14. For i = 1 To Longmax
  15.      For j = 1 To Longmax
  16.         Tableau_cellules(i, j) = ""
  17.         ms2.Col = i - 1
  18.         ms2.Row = j - 1
  19.         ms2.Text = Tableau_cellules(i, j)
  20.     Next j
  21. Next i
  22. End Sub
  23. Private Sub Command6_Click()
  24.     Call initJeu(nbCellV, Tvie()) 'Fais appel à une procédure qui va choisir si la cellule est morte ou vivante
  25. End Sub
  26. Sub InitTV(tvi() As Boolean)
  27. Dim i As Integer
  28. Dim j As Integer
  29.     For i = 1 To Longmax
  30.         For j = 1 To Longmax
  31.             tvi(i, j) = False
  32.         Next j
  33.     Next i
  34. End Sub
  35. Sub hazard2(tvi() As Boolean)
  36. Dim MaVal As Integer
  37. Dim MaVal2 As Integer
  38. Dim i As Integer
  39. For i = 1 To nbCellV
  40. ligne1:
  41.     Randomize   ' Initialise le générateur de hazard
  42.     MaVal = CInt(Int((Longmax * Rnd()) + 1))
  43.     MaVal2 = CInt(Int((Longmax * Rnd()) + 1))
  44.         If tvi(MaVal, MaVal2) = True Then
  45.         GoTo ligne1
  46.             Else
  47.             tvi(MaVal, MaVal2) = True
  48.         End If
  49. Next i
  50. End Sub
  51. Private Sub Command1_Click()
  52.     Call debut_cycle(MSFlexGrid1)
  53. End Sub
  54. Sub debut_cycle(ms As MSFlexGrid)
  55. Dim i As Integer
  56. Dim j As Integer
  57. For i = 1 To Longmax
  58.      For j = 1 To Longmax
  59.      Call mort_ou_vie(i, j, ms, Tvie())
  60.     Next j
  61. Next i
  62. End Sub
  63. Function mort_ou_vie(a As Integer, b As Integer, ms1 As MSFlexGrid, tvi() As Boolean)
  64. For a = 1 To Longmax
  65.      For b = 1 To Longmax
  66.    
  67.         If tvi(a, b) = False Then
  68.         Tableau_cellules(a, b) = "M"
  69.         ms1.Col = a - 1
  70.         ms1.Row = b - 1
  71.         ms1.Text = Tableau_cellules(a, b)
  72.        
  73.             Else
  74.             Tableau_cellules(a, b) = "V"
  75.             ms1.Col = a - 1
  76.             ms1.Row = b - 1
  77.             ms1.Text = Tableau_cellules(a, b)
  78.            
  79.         End If
  80.     Next b
  81. Next a
  82. End Function


Ce code me permet d'afficher dans un tableau et de façon aléatoire 100 cellules: 20 sont vivantes("V" ) et 80 sont mortes ("M" ).
Le programme fonctionne, il n'y a pas de problème.(Merci à tous ceux qui m'ont aidé)
 
Je souhaiterais avoir quelques renseignements concernant l'interface graphique:
- quel est le nom du truc qui me permet d'avoir des cellules carrés (les redimentionner)
- comment puisse faire pour que la cellule soit colorié en verte à la place de "V" (vivante) et rouge pour "M" (morte)?
 
Merci
 

Reply

Marsh Posté le 04-02-2006 à 21:57:40    

pas mal.
 
moi je simplifirai
 
If tvi(MaVal, MaVal2) = True Then
GoTo ligne1
Else
tvi(MaVal, MaVal2) = True
End If
 
par
 
If tvi(MaVal, MaVal2) = True Then GoTo ligne1
tvi(MaVal, MaVal2) = True
 
comme 'Goto lign1' est sur la même ligne que 'Then', elle sera exécutée uniquement si le If est vrai. sinon, il exécute la suite du programme et donc le 'tvi(MaVal, MaVal2) = True'
 
Sinon pour la taille et la couleur du FlexGird va faire un tour sur vbfrance, tu aurs peut être des infos.
 
Et de rien


---------------
now : do nothing
Reply

Marsh Posté le 04-02-2006 à 22:15:36    

Citation :

moi je simplifirai
 
If tvi(MaVal, MaVal2) = True Then
GoTo ligne1
Else
tvi(MaVal, MaVal2) = True
End If
 
par
 
If tvi(MaVal, MaVal2) = True Then GoTo ligne1
tvi(MaVal, MaVal2) = True
 
comme 'Goto lign1' est sur la même ligne que 'Then', elle sera exécutée uniquement si le If est vrai. sinon, il exécute la suite du programme et donc le 'tvi(MaVal, MaVal2) = True'


C'est ce que j'avais mis au début mais ca faisait bugé mon programme. J'ai consulté la msdn et j'ai mis cette syntaxe et il n'y a plus aucun probleme, j'ai bien 20 cellules vivantes placé aléatoirement dans mon tableau.
 
Il me reste plus qu'à faire les lois de survi!

Reply

Marsh Posté le 06-02-2006 à 19:25:04    

Reply

Sujets relatifs:

Leave a Replay

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