Aller au contenu
Zebulon
  • Pas encore inscrit ?

    Pourquoi ne pas vous inscrire ? C'est simple, rapide et gratuit.
    Pour en savoir plus, lisez Les avantages de l'inscription... et la Charte de Zébulon.
    De plus, les messages que vous postez en tant qu'invité restent invisibles tant qu'un modérateur ne les a pas validés. Inscrivez-vous, ce sera un gain de temps pour tout le monde, vous, les helpeurs et les modérateurs ! :wink:

Visual Basic: programmation d'un jeu de vie


Invité mauriiiiice

Messages recommandés

Invité mauriiiiice

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

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.

Option Explicit
Const col_max = 15
Const row_max = 15
Tableau_cellules(1 To col_max, 1 To row_max) As String


Sub affich()
Dim i As String
Dim j As String
Dim x As String

For i = 1 To col_max
 For j = 1 To row_max

 x = cellule_hazard() 'Fais appel à une procédure qui va choisir si la cellule est morte ou vivante
 Call mort_ou_vie(i, j, x)
 Next j
Next i

End Sub


Sub mort_ou_vie(a, b, i)
If i = False Then
  ms.Col = a
  ms.Row = b
  ms.Text = "M"
Else
  ms.Col = a
  ms.Row = b
  ms.Text = "V"

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 sais que ça sera un booléen).

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.

 

Merci de votre aide

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

J'ai un problème pour créer une procédure (ou une fonction?) qui me sort aléatoirement une valeur (je sais que ça sera un booléen).

Eh de toutes evidence une fonction car une procedure ne renvoi rien..

 

Voici un exemple pur generer un nombre aleatoire de type long:

Private Function NbAleatoire(ByVal MinNumber As Long, ByVal MaxNumber As Long) As Long
Randomize
NbAleatoire = CLng((MaxNumber - MinNumber) * Rnd + MinNumber)
End Function

Exemple d'utilisation pour generer un nombre compris entre 0 et 10 (0 et 10 inclus):

MsgBox NbAleatoire(1, 10)

 

Pour le reste je te conseil d'utiliser des variables plus explicite que j, i, v etc... et surtout de ne pas oublier de bien declarer tes types de variables!

Et surtout bien specifie le ByVal ou ByRef dans les parametres de tes fonctions et procedure car c'est source d'erreur.

 

Si tu ne le specifie pas, par defaut ce sera byref ce qui aura pour consequence de modifier ta variable passee en paramete lors de l'appel, le ByVal permet de faire une copie de ta variable...

 

Pour les algo, si tu respecte ces deux trois conseils et que tu sais faire une boucle, ce n'est plus qu'une question de mathematique et la je ne peux vraiment pas t'aider en plus j'aime po la biologie lol

 

Bon courrage :P

++

Lien vers le commentaire
Partager sur d’autres sites

Invité mauriiiiice

Bonjour,

 

Merci

 

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

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 !

Lien vers le commentaire
Partager sur d’autres sites

Comment puis je faire pour que les valeurs présentes dans chaque case soient mélangés dans le même tableau?
?

Il n'y a qu'une seule valeur par "case" (valeur stockée dans le tableau avec x et y comme index). Je ne comprends pas ce que tu entends par "mélanger"...

Lien vers le commentaire
Partager sur d’autres sites

Invité mauriiiiice

?

Il n'y a qu'une seule valeur par "case" (valeur stockée dans le tableau avec x et y comme index). Je ne comprends pas ce que tu entends par "mélanger"...

Merci mais j'ai résolu tout ça!

 

J'ai écrit le code qui réparti aléatoirement 20 cellules mortes ("M") et 80 cellules vivantes ("V") dans un tableau.

 

Il me reste plus qu'à programmer les régles de survie des cellules!

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.

Je suis en train de répertorier tous les cas! Si vous avez des solutions plus simple, ça m'interesse !

 

Voila mon code:

Option Explicit
Const Longmax = 10
Dim Tableau_cellules(1 To Longmax, 1 To Longmax) As String
Dim Tvie(1 To Longmax, 1 To Longmax) As Boolean
Const nbCellV = 20

Private Sub Command2_Click()
Call InitTV(Tvie())
Call InitTabcell(MSFlexGrid1)
Call hazard2(Tvie())
End Sub


Sub InitTabcell(ms2 As MSFlexGrid)
Dim i As Integer
Dim j As Integer

For i = 1 To Longmax
 For j = 1 To Longmax
	Tableau_cellules(i, j) = ""
	ms2.Col = i - 1
	ms2.Row = j - 1
	ms2.Text = Tableau_cellules(i, j)
Next j
Next i
End Sub


Sub InitTV(Tvi() As Boolean)
Dim i As Integer
Dim j As Integer

For i = 1 To Longmax
	For j = 1 To Longmax
		Tvi(i, j) = False
	Next j
Next i
End Sub


Sub hazard2(Tvi() As Boolean)
Dim MaVal As Integer
Dim MaVal2 As Integer
Dim i As Integer

For i = 1 To nbCellV
ligne1:
Randomize   ' Initialise le générateur de hazard
MaVal = CInt(Int((Longmax * Rnd()) + 1))
MaVal2 = CInt(Int((Longmax * Rnd()) + 1))
	If Tvi(MaVal, MaVal2) = True Then
	GoTo ligne1
		Else
		Tvi(MaVal, MaVal2) = True
	End If
Next i
End Sub


Private Sub Command1_Click()
Call debut_cycle(MSFlexGrid1)
End Sub


Sub debut_cycle(ms As MSFlexGrid)
Dim i As Integer
Dim j As Integer

For i = 1 To Longmax
 For j = 1 To Longmax
 Call mort_ou_vie(i, j, ms, Tvie())
Next j
Next i
End Sub


Function mort_ou_vie(a As Integer, b As Integer, ms1 As MSFlexGrid, Tvi() As Boolean)
For a = 1 To Longmax
 For b = 1 To Longmax

	If Tvi(a, b) = False Then
	Tableau_cellules(a, b) = "M"
	ms1.Col = a - 1
	ms1.Row = b - 1
	ms1.Text = Tableau_cellules(a, b)

		Else
		Tableau_cellules(a, b) = "V"
		ms1.Col = a - 1
		ms1.Row = b - 1
		ms1.Text = Tableau_cellules(a, b)

	End If
Next b
Next a
End Function

Voila le début du code d'évolution:

Function milieu(Tvi())
Dim i As Integer
Dim j As Integer
Vh As Boolean
Vb As Boolean
Vg As Boolean
Vd As Boolean

Vh = Tvi(i + 1, j)
Vb = Tvi(1 - 1, j)
Vg = Tvi(i, j - 1)
Vd = Tvi(i, j + 1)

vivante = False
For i = 2 To (Longmax - 1)
For j = 2 To (Longmax - 1)
   If Tvi(i, j) = True And Vh = Vd = Vg = Vd = False Or Tvi(i, j) = True And (Vh = True And Vb = Vg = Vd = False) Or Tvi(i, j) = True And (Vb = True And Vh = Vg = Vd = False) Or Tvi(i, j) = True And (Vg = True And Vh = Vb = Vd = False) Or Tvi(i, j) = True And (Vd = True And Vg = Vb = Vh = False) Then
   Tvi(i, j) = False
   ElseIf Tvi(i, j) = True And (Vh = Vb = True And Vg = Vd = False) Or Tvi(i, j) = True And (Vh = Vg = True And Vb = Vd = False) Or Tvi(i, j) = True And (Vh = Vd = True And Vb = Vg = False) Or Tvi(i, j) = True And (Vb = Vg = True And Vh = Vd = False) Or Tvi(i, j) = True And (Vb = Vd = True And Vg = Vh = False) Or Tvi(i, j) = True And (Vg = Vd = True And Vb = Vh = False) Then
   Tvi(i, j) = True
   ElseIf Tvi(i, j) = True And (Vh = False And Vg = Vd = Vb = True) Or Tvi(i, j) = True And (Vh = False And Vb = Vg = Vd = True) Or Tvi(i, j) = True And (Vg = False And Vh = Vd = Vb = True) Or Tvi(i, j) = True And (Vd = False And Vb = Vg = Vh = True) Then
   Tvi(i, j) = True
   ElseIf Tvi(i, j) = False And (Vh = False And Vg = Vd = Vb = True) Or Tvi(i, j) = False And (Vh = False And Vb = Vg = Vd = True) Or Tvi(i, j) = False And (Vg = False And Vh = Vd = Vb = True) Or Tvi(i, j) = False And (Vd = False And Vb = Vg = Vh = True) Then
   Tvi(i, j) = True
   Else
   Tvi(i, j) = False
   End If

   Next j
Next i

End Function

Lien vers le commentaire
Partager sur d’autres sites

Y'a un léger problème : tu fais tes opérations "en live" sur ton tableau, ce qui veut dire qu'à partir du premier recalcul de survie d'une cellule, tu n'es plus dans les mêmes conditions.

Il te faut deux tableaux, un qui contient l'état du système, et un qui contient ce que tu calcules de la survie de tes cellules à l'itération suivante.

Lien vers le commentaire
Partager sur d’autres sites

  • 1 an après...

voici le code source du programme en Liberty BASIC

 

    maxi=40

[taille]
   cls
   print "entrez les dimensions du tableau de la vie (1-";maxi;")"
   print er$
   input "Largeur ->";l
   if l<1 or l>maxi then
       er$="La largeur doit être comprise entre 1 et ";maxi;" : Recommencez !"
       goto [taille]
   end if
   input "Hauteur ->";h
   if h<1 or h>maxi then
       er$="La hauteur doit être comprise entre 1 et ";maxi;" : Recommencez !"
       goto [taille]
   end if
   dim t(l,h)
   er$=""

[prc]
   cls
   print er$
   input "Quelle est le pourcentages de cellules vivantes ? (1-99)"; prc
   if prc<1 or prc>99 then
       er$="Le pourcentage doit être compris entre 1 et 99 : Recommencez !"
       goto [prc]
   end if

[remplissage]
   total=l*h
   nbi=int(prc*total/100)
   nbi2=nbi
   print "Le programme va donner la vie à ";nbi;" cellules."
   while nbi2>0
       scan
       [rnd]
       bk=0
       px=int(rnd(.5)*l)+1
       py=int(rnd(.5)*h)+1
       if t(px,py)=1 then goto [rnd]
       t(px,py)=1
       v=v+1
       pp=int(v*100/nbi)
       if pp<>pp2 then pp2=pp : locate 5,5 : print pp
       nbi2=nbi2-1
   wend

[cycle]
   cls
   gosub [affichage]
   dim t2(l,h)
   for i=1 to l
       for j=1 to h
           scan
           gosub [voisins]
           gosub [comptage]
           if t(i,j)=0 then
               'la cellule est morte
               if v=3 then n=1 else n=0
           else
               'la cellule est vivante
               if v=2 or v=3 then n=1 else n=0
           end if
           t2(i,j)=n
       next j
   next i
   'input r$
   if r$="q" then end
   for i=1 to l
       for j=1 to h
           t(i,j)=t2(i,j)
       next j
   next i
   goto [cycle]

[affichage]
   for i=1 to l
       for j=1 to h-1
           scan
           if t(i,j)=1 then a$="o" else a$=" "
           print a$;" ";
       next j
       if t(i,h)=1 then a$="o" else a$=" "
       print a$
   next i
   return

[voisins]
   v$=""
   xmin=max(i-1,1)
   xmax=min(i+1,l)
   ymin=max(j-1,1)
   ymax=min(j+1,h)
   for i1=xmin to xmax
       for j1=ymin to ymax
           if i1<>i or j1<>j then
               et=t(i1,j1)
               v$=v$+" "+str$(et)
           end if
       next j1
   next i1
   return

[comptage]
   v=0 : m=0
   p=instr(v$,"1")
   while p<>0
       v=v+1
       p=instr(v$,"1",p+1)
   wend
   p=instr(v$,"0")
   while p<>0
       m=m+1
       p=instr(v$,"0",p+1)
   wend
   return


   input r$

Lien vers le commentaire
Partager sur d’autres sites

C'est sympa, mais quand le sujet c'est "Vous réaliserez une application en Visual basic ...", et qu'il date de février 2006, je crains que ce ne soit trop tard et pas exactement la solution recherchée...

Cela dit, et je le répète, c'est très sympa d'avoir cherché ;-)

Lien vers le commentaire
Partager sur d’autres sites

Rejoindre la conversation

Vous pouvez publier maintenant et vous inscrire plus tard. Si vous avez un compte, connectez-vous maintenant pour publier avec votre compte.
Remarque : votre message nécessitera l’approbation d’un modérateur avant de pouvoir être visible.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

  • En ligne récemment   0 membre est en ligne

    • Aucun utilisateur enregistré regarde cette page.
×
×
  • Créer...