Visual basic: programmation d'un jeu de vie [MA QUESTION EST TOUT EN BAS]
Forum Programmation : Visual basic: programmation d'un jeu de vie [MA QUESTION EST TOUT EN BAS]
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.
|
Code :
|
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
salut,
pour ce qui est de la syntaxe en VB, j'utilise rarement VB.NET mais la syntaxe est la suivante :
Code :
|
apres pour tirer un chiffre aléatoirement avec un biais, tu peux par exemple créer une fonction du type :
(je ne t'assure pas l'exactitude la syntaxe ...)
Code :
|
Avec cette fonction, si tu rentre 40 en paramètre, alors dans 40% des cas elle te renverra true (si bien sûr la distribution de Rnd est normale
)
Attention, quand tu va analyser ton plateau pour connaître le nouvel état de cellule il faut bien que tu utilises 2 tableaux différents. Un qui contient l'état en cours et l'autre qui contient l'état modifié.
En pour tester chaque cellule, il faut commencer par tester les cas par ordre de prioirité (une cellule vivante entouré de 3 voisines est forcement entouré de 2 voisines ...)
Enfin, il faut penser à ce que tu vas faire pour les cases sur les bords du plateau.
Bon courage.
Merci beaucoup pour ces éléments de réponses
Si j'ai bien compris, lorsque je vais faire appelle à cette fonction et que je voudrais obtenir par exemple 40% de cellule vivante, je devrais écrire:
Code :
|
C'est bien ça?
De plus dans mon cas, le nombre de case seront prédéfénies.
Pour un carré de 20*20 donc 400 cellules, est ce que je dois écrire:
Code :
|
| Citation : Enfin, il faut penser à ce que tu vas faire pour les cases sur les bords du plateau. |
Je sens que ça va aussi me poser des problème :-( :-(
Pour le bord du tableau, comme pour un démineur, tu peux ajouter une colone à gauche et à droite, et une ligne en haut et en bas supplémentaire.
Ces cases seront interdites pour les déplacements, mais pour faire les tests autour d'une cellule, c'est plus facile à faire, car il n'y a pas de cas particulier.
| Citation : Si j'ai bien compris, lorsque je vais faire appelle à cette fonction et que je voudrais obtenir par exemple 40% de cellule vivante, je devrais écrire:
|
heu non, il me semble que tu devras faire :
Code :
|
| Citation :
|
non non, en fait le 100 permet de donner un rapport en pourcentage.
La formule que je t'ai donné te permet d'avoir statistiquement des tirages au pourcentage défini, mais pas surement.
Si tu veux un tirage sûr alors il faut tirer des valeurs avec retirage en cas de doublon, jusqu'à obtention de ton pourcentage.
Pour les cases sur les bords, y'a un truc sympa à faire , c'est considérer que grossierement ton plateau est une sphère. Donc une case complètement à gauche a une voisine sur la même ligne complètement à droite.
J'ai apporté quelques modifications:
Code :
|
Code :
|
=40% des cases de mon carré
Ensuite, je ferais appelle à la fonction:
Code :
|
Code :
|
Vous en pensez quoi?
(désolé si je fais des erreurs conne, je suis loin d'être un expert...)
juste je reprécise ce que j'ai dit, la fonction TirageBiaise de garantie que statistiquement tu auras un remplissage de "biais"% (je sais pas pourquoi je l'ai appelé comme ça cet argument ...).
Il te manque un
Code :
|
à la fin de ta fonction TirageBiaise
[edit]heu non pas un return biais, biais est un Integer et V_ou_M est un booléen. Il te manque un
Code :
|
Je le place de cette façon?
Code :
|
En tout cas, merci de ton aide :-)
oui, sauf que tu supprimes ton
Code :
|
à la fin de ta fonction.
Sinon en fait je pense qu'il y a une meilleur solution.
C'est d'initialiser ton tableau avec le nombre exact de case que tu veux.
Tu définis ta constante du nombre de case (cas simple d'un tableau non dynamique)
Code :
|
Tu définis la fonction d'init :
Code :
|
tu appelles ta fonction quelque part initialisant ton tableau :
Code :
|
Mais bon ce ne sont que des pistes.
Bon courage.
| Citation : Mais bon ce ne sont que des pistes. |
Pas mal du tout! Je vais tester cette approche!
En fait, mon second tableau aura par défaut que des valeurs "false".
Le placement des cellules vivante sera bien effectué dans un tableau à deux dimensions?
disons que c'était une méthode avec un seul vecteur et après tu pouvais jouer avec les indices pour te créer un tableau.
Mais VB te propose les tableaux, alors tu peux également tout faire en 2D :
tu déclares :
Code :
|
tu crées une fonction init en 2D
Code :
|
et tu appelles ta fonction avec un tableau en 2D
Code :
|
Sur ce je me rentre moi :-D
Il y a quelque chose que je n'arrive pas à comprendre:
Je n'arrivais pas à afficher des trucs dans mon tableau (élément MSflexgrid) alors j'ai fais une mini procédure qui me met une valeur dans chaque case afin de trouver la bonne syntaxe.
Code :
|
Voila la procedure qui appelle "remp1":
Code :
|
Au départ, j'avais mis:
ms.col = i
ms.row = j
Et mon programme (je devrais pas mettre une fonction à la place?) bugé, j'ai regardé la valeur des variables "i" et "j" et j'ai du mettre (i - 1) et (j - 1) mais je n'arrive pas à comprendre pourquoi.
je pense simplement que l'objet MSFlexgrid doit être appelé en commençant à l'indice 0 (comme n'importe quel tableau dans la plupart des langages).
Donc si tu as déclaré ton composant MSFlexgrid comme ayant col_max colonnes alors les indices colonnes de composant irons de 0 à (col_max-1) (ce qui fait bien col_max indices, et idem pour row_max)
Donc ton programme devait planté quand tu arrivais à l'indice i=col_max ou j=row_max.
| Citation : je devrais pas mettre une fonction à la place? |
J'ai pas compris?
C'était bien ça! L'objet Msflexgrid commence à 0, je n'y avais pas pensé du tout... Quel con...
| Citation : J'ai pas compris? |
Est ce que je dois mettre "Sub remp1(ms As MSFlexGrid)"
ou
"Function remp1(ms As MSFlexGrid)"
J'ai du mal à faire la distinction.
Si j'ai bien compris: ce sous programme ne renvoit aucune valeur, il rempli un tableau donc c'est une procédure et c'est "sub" que je dois mettre? C'est ça?
heu ... honnêtement j'en sais rien.
Voilà ce qui est dit dans la doc MSDN :
| Citation : Une procédure Sub, à l'instar d'une procédure Function, est une procédure distincte qui peut prendre en charge des arguments et exécuter une série d'instructions. Toutefois, contrairement à une procédure Function, qui retourne une valeur, une procédure Sub ne peut pas être utilisée dans une expression |
Donc d'après eux, la seule différence est que la procédure ne renvoit pas d'argument ... mais comme il est possible d'appeler une fonction avec un call je ne vois pas vraiment l'interêt.
Sur certains site, ils parlent de différence de performances qui seraient meilleurs avec les Sub ...
En tout cas il y a certaintement un interêt à Sub sur function puisque la méthode new (entre autre) d'une Form , généré automatiquement sous VS.NET est déclarée en tant que sub et non en tant que function.
Je laisse la place aux spécialistes en VB pour le choix. :-D
J'ai pas tout lu
A la base des langages procéduraux (comme le pascal), il faut distinguer les procédures des fonctions (le C ne faisant pas de distinction car une procédure est une fonction retournant void).
D'un point de vue conceptuel, le Sub est l'éxécution d'un code qui par exemple fait appel à un périphérique, alors qu'une fonction est plus un calcul qui ne toucherait pas ou peu un périphérique.
Mais bon je suis surpris que ça existe encore, comme avec le vieux QBasic :-D
Merci :-D
J'ai une autre petite question: j'ai un tableau à deux dimensions:
Code :
|
Comment puis je faire pour que les valeurs présentes dans chaque case soient mélangés dans le même tableau?
Tu boucles sur tous les élément du tableau, et pour chaque élément, tu faits une permutation avec une case choisie aléatoirement entre la case courante (comprise) et la fin du tableau.
WEp! J'ai réussi avec une autre approche!
J'ai un autre problème:
Je n'arrive pas à mettre les bonnes variables: a chaque fois, j'ai le message d'erreur...
[RESOLU]
Code :
|
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
Il y a 2240 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici.

CRicky