Jeu de la vie

Unité libre

D. Olivier



Damien.Olivier@gmail.com

Principe

Conway 1970 - Automate cellulaire

  • On considère une grille ;
  • À chaque étape, l’évolution d’une cellule est entièrement déterminée par l’état de ses huit voisines de la façon suivante :
    • Une cellule morte possédant exactement trois voisines vivantes devient vivante (elle naît).
    • Une cellule vivante possédant deux ou trois voisines vivantes le reste, sinon elle meurt.



NetLogo et le jeu de la vie

Des patches, des patches et encore des ....

  • Une cellule = un patch ;
  • Un patch possède un état ;
  • Un patch connaît le nombre de voisin en vie ;
  • Un patch/cellule en vie à une couleur donnée ;
  • Un patch/mort prend la couleur du fond.

NetLogo et le jeu de la vie

Une première version

  • On définit l'état d'un patch
;; Informations contenues dans chaque patches
patches-own [
  vivante?   ;; cellule en vie
  nbVoisins  ;; nbre de cellule voisine en vie
]

NetLogo et le jeu de la vie

Une première version

  • Initialisation de la grille
;; Trois variables globales pour la couleur du fond 
;; et d'une cellule en vie et la densité initiale
globals[couleurFond couleurVie densité]

;; Chaque patch à 30% de chance de contenir une cellule en vie
to setup
  ca
  set couleurFond black
  set couleurVie blue
  set densité 30
  ask patches [
    ifelse random-float 100 < densité
    [naissanceCellule]
    [mortCellule]
  ]
end

NetLogo et le jeu de la vie

Une première version

  • Définition des règles de vie et de mort

to go
  ;; On demande à chaque patches le nombre de voisins en vie
  ask patches [
    set nbVoisins count neighbors with [vivante?]
  ]
  ask patches [          ;; En fct du nbre de voisins
    ifelse nbVoisins = 3
    [ naissanceCellule ] ;; Naissance
    [if nbVoisins != 2
      [ mortCellule ]]   ;; Mort
  ]
end

NetLogo et le jeu de la vie

Une première version

  • Naissance d'une cellule
to naissanceCellule
  set vivante? true
  set pcolor couleurVie
end
  • Mort d'une cellule
to mortCellule
  set vivante? false
  set pcolor couleurFond
end

NetLogo et le jeu de la vie

Une première version

  • On crée l'interface

NetLogo et le jeu de la vie

Une version plus aboutie

  • Ajouter un slider pour fixer la densité initiale ;
  • Ajouter deux choosers pour choisir les couleurs du fond et des patches en vie ;
  • Ajouter un bouton permettant d'appliquer les changements de couleur.

Les variables globales que nous avons déclarées fontionnent-elles toujours ?

NetLogo et le jeu de la vie

Une version plus aboutie

  • Comment appliquer le changement de couleur
    • Créer le bouton ;
    • Associer au bouton une commande.
ifelse vivante?
  [set pcolor couleurVie]
  [set pcolor couleurFond] 
Constatez vous un problème ?

NetLogo et le jeu de la vie

Une version plus aboutie

  • Ajouter un monitor qui affiche la densité de cellule en vie :
    100 * count patches with [vivante?] / count patches
    
  • Ajouter une courbe (plot) qui trace l'évolution du nombre de cellules.
    plot count patches with [vivante?]
    
  • Est-ce que cela marche ?

NetLogo et le jeu de la vie

Une version plus aboutie

  • Cela ne marche pas !
  • Il faut gérer l'initialisation et la mise à jour des courbes (reset-ticks, setup-plots, tick, update-plots)

to setup
  ca
  set couleurFond black
  set couleurVie blue
  ask patches [
    ifelse random-float 100 < Densité
    [naissanceCellule]
    [mortCellule]
  ]
   reset-ticks       ;; Initialise l'horloge initialise les courbes
end
to go
  ;; On demande à chaque patches le nombre de voisins en vie
  ask patches [
    set nbVoisins count neighbors with [vivante?]
  ]
  ask patches [
    ifelse nbVoisins = 3
    [ naissanceCellule ]
    [if nbVoisins != 2
      [ mortCellule ]]
  ]
  tick               ;; On avance l'horloge maj des courbes
end	

NetLogo et le jeu de la vie

Une version plus aboutie

  • On ajoute la possibilite de créer des cellules ou de les détruire ;
  • Indication utiliser mouse-down?
to ajouteCellules
  if mouse-down? [
    ask patch mouse-xcor mouse-ycor [naissanceCellule]
    display
  ]
end
to tueCellules
  if mouse-down? [
    ask patch mouse-xcor mouse-ycor [mortCellule]
    display
  ]
end 

NetLogo et le jeu de la vie

Une version avec lecture d'un fichier de configuration

to readFile
  let filename user-file
  ifelse (filename != false) [
    file-open filename
    while [not file-at-end?][
      ;; Une ligne coordonnées d une cellule en vie
      let in1 file-read
      let in2 file-read
      ask patch in1 in2 [naissanceCellule]
    ]
  ]
  [ user-message "Fichier non chargé"]
  file-close
  reset-ticks
end