Jeu de la vie

Fermé
castor-python Messages postés 8 Date d'inscription vendredi 3 janvier 2014 Statut Membre Dernière intervention 10 avril 2014 - 3 janv. 2014 à 17:35
nidhogg-59 Messages postés 102 Date d'inscription mercredi 20 juin 2012 Statut Membre Dernière intervention 5 décembre 2015 - 13 janv. 2014 à 16:55
Bonsoir, je me suis lancé un petit défi : programmer le jeu de la vie en python.
J'ai déjà les bases grâce au site France IOI. Seulement, je, comme diraient les jeunes : "galére".
J'ai les fonctions de départ mais, je n'arrive pas à coder celle qui sert à compter le nombre de cellules vivantes autour d'une cellule choisie.
Quelqu'un aurait une idée?

Sinon, quelqu'un aurait-il une version simple de ce code afin que je le compare au mien et m'en aide?

Merci d'avance.

Castor-Python
A voir également:

2 réponses

nidhogg-59 Messages postés 102 Date d'inscription mercredi 20 juin 2012 Statut Membre Dernière intervention 5 décembre 2015 27
6 janv. 2014 à 11:10
Bonjour!
Alors pour t'aider, il faudrait déjà que tu expliques comment tu as organisé tes cellules:
-travailles-tu sur un tableau où chaque cellule est représenté par un 0 ou un 1 (vivant/mort)?
- ou bien sur un 'plateau infini' ?

si tu as un plateau fini:
tu peux regarder les cellules qui l'entourent en faisant:
tableau[numero_cellule-1] pour celle de gauche
tableau[numero_cellule+1] pour celle de droite
tableau[numero_cellule+largeur_plateau] pour celle du bas
tableau[numero_cellule+largeur_plateau-1] pour celle du bas gauche
tableau[numero_cellule+largeur_plateau+1] pour celle du bas droit
tableau[numero_cellule-largeur_plateur-1] pour celle en haut gauche
tableau[numero_cellule-largeur_plateur+1] pour celle en haut droite
tableau[numero_cellule-largeur_plateur] pour celle du dessus

sur un plateau infini, ca fonctionne de la même façon:
disons que pos est la position de ta cellule comme suit:
pos[0] == position sur l'axe des x
pos[1] == position sur l'axe des y
et que seuls les cellules vivantes ont leurs position dans ton tableau alive, pour tester l'existance d'une cellule, tu peux faire:

if [pos[0]+1,pos[1]] in alive

pour tester si la cellule à droite est présente ou pas!
ou

if [pos[0],pos[1]-1] in alive

pour tester celle du dessus!

Bon, je ne sais pas si c'est clair, (en tous cas dans ma tête ça l'est ^^ ) mais si tu as des questions plus précises, n'hésite pas !
1
castor-python Messages postés 8 Date d'inscription vendredi 3 janvier 2014 Statut Membre Dernière intervention 10 avril 2014
8 janv. 2014 à 14:20
Merci pour ta réponse forte utile!
Je travaille sur un plateau fini (j'ai un contour de cellules mortes qui le restent quoi qu'il arrive) et mes cellules vivantes sont symbolisées par un "O" et les mortes par un point "."
j'ai "en gros" compris ton raisonnement mais je n'arrive pas à l'appliquer... si j'appelle x la ligne de mon tableau et y la colonne, et que ma cellule de depart est de coordonnées (x,y) et que je souhaite compter le nombre de cellule autour? Qu'est ce que cela donnerait?
0
nidhogg-59 Messages postés 102 Date d'inscription mercredi 20 juin 2012 Statut Membre Dernière intervention 5 décembre 2015 27
Modifié par nidhogg-59 le 8/01/2014 à 18:17
Dans ce cas, appelons y-1 la ligne du dessus, y+1 la ligne du dessous (ou l'inverse, comme tu veux) et pareil pour x: x+1 la cellule à droite et x-1 celle à gauche.

Pour compter les cellules entourant la cellule (x,y), on peut faire:
 
count = 0
for i in range(-1, 2):
    for j in range(-1, 2):
        if not (i == 0 and j == 0):
            if (x + i, y + j) == "O":
                count += 1

à la fin, count contiens le nombre de cellules vivantes.
La condition " if not (i == 0 and j == 0): " est là pour ne pas compter la cellule pour laquelle tu cherche le nombre de cellules vivantes voisines.

Pour quelque chose de plus concis, tu peux utiliser les listes sous cette forme:
count = sum([1 for i in range(-1, 2) for j in range(-1, 2) if  not (i == 0 and j == 0) and (x + i, y + j) == "O"])

'fin, après, c'est juste une question de goût...
0
castor-python Messages postés 8 Date d'inscription vendredi 3 janvier 2014 Statut Membre Dernière intervention 10 avril 2014 > nidhogg-59 Messages postés 102 Date d'inscription mercredi 20 juin 2012 Statut Membre Dernière intervention 5 décembre 2015
8 janv. 2014 à 20:20
Et bien merci beaucoup pour cette réponse ! J'essaye dès ce soir! Merci pour tous ces conseils avisés.
0
castor-python Messages postés 8 Date d'inscription vendredi 3 janvier 2014 Statut Membre Dernière intervention 10 avril 2014
9 janv. 2014 à 13:42
J'arrive presque à bout du programme, mais impossible de réussir à éclaircir mes idées à propos des tableaux : j'ai créé un tableau, placé mes cellules, puis dupliqué ce tableau pour y compter les cellules alive autour de chaque cellule, puis j'applique la mort/résurection/survie des cellules dans le tableau initial, est-ce ce qu'il faut faire ?
0
nidhogg-59 Messages postés 102 Date d'inscription mercredi 20 juin 2012 Statut Membre Dernière intervention 5 décembre 2015 27
9 janv. 2014 à 21:33
Personnellement, quand j'ai codé ce jeu, j'avais 3 tableaux:alive qui contenais mes cellules, j'ai déterminé toutes les qui allaient vivre que je mettais dans un tableau new, et toute celles qui allaient mourir que je mettais dans died. Ensuite, j'ajoutais au tableau alive celles dans new, et je supprimais du tableau alive celles dans died.
Mais si ce que tu fais fonctionne, tu devrais le voir:
teste avec commes cellules (O = vivant; . = mort):
O.O
O.O
OOO
au bout d'un moment tu devrais avoir une forme comme celle sur https://fr.wikipedia.org/wiki/Jeu_de_la_vie chapitre "Dimension et complexité".

Personnellement je prenais toujours comme référence cette figure( le 'u' qui devient un clown) pour savoir si mes jeux fonctionnaient.
0
castor-python Messages postés 8 Date d'inscription vendredi 3 janvier 2014 Statut Membre Dernière intervention 10 avril 2014
12 janv. 2014 à 09:28
Donc la solution la plus simple c'est bien deux tableaux? Pour l'interface graphique, j'ai peu de connaissance du coup, le tableau se résume à O pour les cellules vivantes et . Pour les mortes. Je ne veux pas le code source que je désire vraiment le faire moi même. Cependant, j'accepterai vraiment toute ton aide. Où dois-je placer mes duplications de tableaux?
0
nidhogg-59 Messages postés 102 Date d'inscription mercredi 20 juin 2012 Statut Membre Dernière intervention 5 décembre 2015 27
Modifié par nidhogg-59 le 13/01/2014 à 00:55
Waow... Là j'avoue n'avoir pas bien compris ta question... Tu as écris quoi pour le moment?
Tu veux que je te donnes le déroulement du prog sans code source? En tous cas, je ne duplique pas de tableau, je fais:
tableau=[[x,y],[x,y]...]
while 1:
    new_gen=[calcul de la new génération]
    for i in new gen:
        affichage(i)
    tableau=[]+new_gen

'fin, c'est un peu plus compliqué que ça, et ce sera différent de toi, vu qu'on travaille de deux manière différentes. (interface/console)
Ps: je viens de remarquer qu'en travaillant avec des set, ça va beaucoup plus vite qu'avec des list.
0
castor-python Messages postés 8 Date d'inscription vendredi 3 janvier 2014 Statut Membre Dernière intervention 10 avril 2014
13 janv. 2014 à 09:44
Je suis désolé, je ne me suis pas bien exprimé. Pour le moment, j'ai :
-une fonction qui crée un tableau.
-une fonction qui compte le voisinage (count = nombre de cellules vivantes)
-une fonction qui modifie (si count == (2), la cellule reste reste vivante,...)
-et un cellule qui balaye, appliquant le comptage et la modification à toutes les cellules.
Ma question est la suivante : à quel moment mon tableau 1 doit-il intervenir et à quel moment le tableau 2 doit intervenir?
Je ne connais pas encore les set...
0
nidhogg-59 Messages postés 102 Date d'inscription mercredi 20 juin 2012 Statut Membre Dernière intervention 5 décembre 2015 27
Modifié par nidhogg-59 le 13/01/2014 à 16:56
Le second tableau dans ton cas, interviendrais où tu applique les modifications:
il faudrait créer un second tableau qui va contenir le génération suivante, car toutes les cellules doivent "mourir" et "naître" en même temps, or si tu modifie ton tableau au fur et à mesure que tu le parcours, ça créera des problèmes (je suppose).

Là, je ne vois pas ce qu'il y a à écrire de plus:
tu as la fonction qui calcule la génération suivante, il ne te reste que l'affichage et la copie du nouveau tableau dans l'ancien...

Pour ce qui est des set, j'ai demandé autre part, et apparemment, les set sont plus rapides pour ce qui est des test de présence ou d'absence d'objet en leur sein, les listes sont plus rapides avec les itérations, donc dans ton cas, je dirais que les listes sont plus avantageuses.
Lien vers la discussion https://openclassrooms.com/forum/sujet/set-plus-rapide-que-list
Attention, si tu ne tiens vraiment à ne pas voir mon code source, il y est écrit au début...
0