FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC

Développement d'applications avec le langage Panoramic
 
AccueilAccueil  RechercherRechercher  Dernières imagesDernières images  S'enregistrerS'enregistrer  MembresMembres  Connexion  
Derniers sujets
» PANORAMIC V 1
Jeu de la vie - Automates cellulaires Emptypar papydall Aujourd'hui à 4:28

» Je teste PANORAMIC V 1 beta 1
Jeu de la vie - Automates cellulaires Emptypar papydall Aujourd'hui à 1:48

» bouton dans autre form que 0
Jeu de la vie - Automates cellulaires Emptypar leclode Hier à 12:59

» KGF_dll - nouvelles versions
Jeu de la vie - Automates cellulaires Emptypar Klaus Hier à 10:41

» Gestion d'un système client-serveur.
Jeu de la vie - Automates cellulaires Emptypar Klaus Hier à 9:23

» Editeur EliP 6 : Le Tiny éditeur avec 25 onglets de travail
Jeu de la vie - Automates cellulaires Emptypar Froggy One Jeu 2 Mai 2024 - 10:16

» @Jack
Jeu de la vie - Automates cellulaires Emptypar Jack Mar 30 Avr 2024 - 19:40

» trop de fichiers en cours
Jeu de la vie - Automates cellulaires Emptypar papydall Lun 29 Avr 2024 - 22:39

» Une calculatrice en une ligne de programme
Jeu de la vie - Automates cellulaires Emptypar jean_debord Dim 28 Avr 2024 - 7:47

» Form(résolu)
Jeu de la vie - Automates cellulaires Emptypar leclode Sam 27 Avr 2024 - 16:59

» Bataille navale SM
Jeu de la vie - Automates cellulaires Emptypar jjn4 Ven 26 Avr 2024 - 16:39

» Les maths du crocodile
Jeu de la vie - Automates cellulaires Emptypar jean_debord Jeu 25 Avr 2024 - 9:37

» Naissance de Crocodile Basic
Jeu de la vie - Automates cellulaires Emptypar jean_debord Jeu 25 Avr 2024 - 7:45

» Dessine-moi une galaxie
Jeu de la vie - Automates cellulaires Emptypar jjn4 Lun 22 Avr 2024 - 12:47

» Erreur END_SUB
Jeu de la vie - Automates cellulaires Emptypar jjn4 Lun 22 Avr 2024 - 12:43

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Mai 2024
LunMarMerJeuVenSamDim
  12345
6789101112
13141516171819
20212223242526
2728293031  
CalendrierCalendrier
-45%
Le deal à ne pas rater :
WHIRLPOOL OWFC3C26X – Lave-vaisselle pose libre 14 couverts – ...
339 € 622 €
Voir le deal

 

 Jeu de la vie - Automates cellulaires

Aller en bas 
2 participants
AuteurMessage
jean_debord

jean_debord


Nombre de messages : 1250
Age : 69
Localisation : Limoges
Date d'inscription : 21/09/2008

Jeu de la vie - Automates cellulaires Empty
MessageSujet: Jeu de la vie - Automates cellulaires   Jeu de la vie - Automates cellulaires EmptyDim 19 Sep 2021 - 11:08

Adaptation d'un ancien programme de FBPano.

Code:

' ********************************************************************
' Jeu de la vie de J. H. Conway
' ********************************************************************
' Ce programme travaille sur des grilles de grande taille dont on
' n'affiche qu'une partie, avec possibilite de zoom et de defilement.
'
' Le programme demarre en mode "Creation". Les commandes suivantes
' sont actives :
'
'   Clic gauche : cree ou efface une cellule
'   Clic droit  : efface une cellule
'   A, a        : remplit 10% des cases, de maniere aleatoire
'   E, e        : efface toutes les cases
'   +, -        : augmente ou diminue le zoom (taille en pixels
'                 des cases affichees : 0, 4, 8, 12, 16, 20, 24 ;
'                 0 = 1 pixel par case)
'   Fleches     : font defiler la zone d'affichage
'   *, /        : multiplie ou divise par 2 le pas de defilement
'                 (1 a 1024)
'   G, g        : affiche une grille (si zoom > 4)
'   S, s        : active ou desactive la sauvegarde automatique des images
'   Espace      : passe en mode "Generation"
'
' En mode "Generation" les commandes suivantes sont actives :
'
'   G, g, S, s          : comme en mode "Creation"
'   Fleches, +, -, *, / : comme en mode "Creation" mais plus lent
'                         a cause du temps de calcul
'   Espace              : repasse en mode "Creation" et remet le
'                         compteur de generations a zero
'
' Les parametres sont ecrits de part et d'autre de la grille :
'   - coordonnees des cases affichees (Row, Col)
'   - zoom, pas de deplacement, compteur de generations
'
' La touche Echap quitte le programme
' ********************************************************************

const n = 1000   ' Taille de la grille
const fg = 2     ' Taille de la fenetre graphique en multiple de 240
                 ' (240 = PPCM des valeurs de zoom)
const lag = 50   ' Delai entre 2 images (ms)

dim z% = 24              ' Zoom (0, 4, 8, 12, 16, 20, 24)

dim creat% = TRUE       ' Mode "creation"
dim grid% = TRUE        ' Afficher la grille (si z > 4)
dim savepics% = FALSE   ' Sauvegarder les images
dim pas% = 1            ' Deplacement par les fleches (nb de cases)
dim gener% = 0          ' Generation

dim x0%, y0%            ' Coin inf. gauche de la grille
dim w1%, h1%            ' Taille de la fenetre en pixels    
dim w%                  ' Largeur de la grille en pixels
dim m%                  ' Nombre de cases affichees dans chaque direction
dim k1x%, k1y%          ' Coord. de la case affichee en bas a gauche
dim kmx%, kmy%          ' Coord. de la case affichee en haut a droite
dim key$                ' Touche pressee
dim i%, j%              ' Variables de boucle

dim a%*1(n, n)          ' Population actuelle (codage sur 1 octet)
dim b%*1(n, n)          ' Nouvelle population

' --------------------------------------------------------------------
' Liste des commandes
' --------------------------------------------------------------------

data "Clic gauche", "Cree une cellule"
data "Clic droit", "Efface une cellule"
data "A, a", "Remplit une case sur 10 (aleatoire)"
data "E, e", "Efface toutes les cases"
data "+, -", "Augmente ou diminue le zoom"
data "Fleches", "Font defiler la zone d'affichage"
data "*, /", "Multiplie/divise par 2 le pas de defilement"
data "G, g", "Affiche une grille (si zoom > 4)"
data "S, s", "Active/desactive la sauvegarde des images"
data "Espace", ""

dim cmd$(10,2)

for i = 1 to 10
  read cmd(i,1), cmd(i,2)
next i

' --------------------------------------------------------------------
' Definition des couleurs par les caracteres de controle
' --------------------------------------------------------------------

const clr1 = chr(15, 20) ' Turquoise
const clr2 = chr(15, 26) ' Blanc
const clr3 = chr(15, 15) ' Orange
const clr4 = chr(15, 18) ' Vert vif  
const clr5 = chr(15,  9) ' Vert fonce

' --------------------------------------------------------------------
' Definition des regles d'evolution
' --------------------------------------------------------------------

dim evol%(1,

data 0, 0, 0, 1, 0, 0, 0, 0, 0
data 0, 0, 1, 1, 0, 0, 0, 0, 0

for i = 0 to 1
  for j = 0 to 8
    read evol(i, j)
  next j
next i

' --------------------------------------------------------------------
' Cree le nom du fichier PNG pour 1 generation (Ex. 00000123.png)
' --------------------------------------------------------------------

def filename() = dec(gener, "00000000") + ".png"

' --------------------------------------------------------------------
' Programme principal
' --------------------------------------------------------------------

init()

mode 3, "Jeu de la vie (" & n & " x " & n & ")", w1, h1, 1, 2

repeat
  screenlock : cls

  origin x0, y0, x0, x0 + w, y0 + w, y0, CL_NOIR, CL_BLANC

  display()
  if not creat then
    if savepics then img_save filename()
    newpop()
  end_if

  get_click()
  
  origin

  printparam()
  if creat then
    print_cmd_creation()
  else
    print_cmd_generation()
  end_if

  key = inkey()

  select key
    case " "
      creat = not creat
      if creat then gener = 0

    case "*"
      if pas < 1024 then pas = 2 * pas

    case "+"
      if z < 24 then z = z + 4 : init()

    case "-"
      if z > 0 then z = z - 4 : init()

    case "/"
      if pas > 1 then pas = pas \ 2

    case "A", "a"
      if creat then aleat()

    case "E", "e"
      if creat then efface()

    case "G", "g"
      grid = not grid

    case "S", "s"
      savepics = not savepics

    case "UP"
      k1y = max(1, k1y - pas)
      kmy = k1y + m - 1

    case "LEFT"
      k1x = max(1, k1x - pas)
      kmx = k1x + m - 1

    case "RIGHT"
      kmx = min(n, kmx + pas)
      k1x = kmx - m + 1

    case "DOWN"
      kmy = min(n, kmy + pas)
      k1y = kmy - m + 1
  end_select

  screenunlock : sleep lag
until key = "ESCAPE"

' --------------------------------------------------------------------
' Sous-Programmes
' --------------------------------------------------------------------

sub init()
' Initialisation des variables

  x0 = 20
  y0 = 30
  w = 240 * fg
  w1 = w + 2 * x0 + 450
  h1 = w + 2 * y0
  if z = 0 then m = w else m = w \ z
  k1x = (n - m) \ 2 + 1
  kmx = k1x + m - 1
  k1y = k1x
  kmy = kmx
end_sub

sub efface ()
' Efface toutes les cases

  dim i%, j%

  for i = 1 to n
    for j = 1 to n
      a(i,j) = 0
    next j
  next i
end_sub

sub aleat ()
' Remplissage aleatoire de 10% des cases

  dim i%, j%
  randomize timer

  for i = 1 to n
    for j = 1 to n
      if rnd > 0.9 then a(i, j) = 1 else a(i, j) = 0
    next j
  next i
end_sub

sub plotgrid ()
' Affichage de la grille

  if z < 8 then exit_sub

  dim x%, y%

  pen CL_GRIS

  for x = 0 to w step z
    move x, 0
    draw x, w
  next x

  for y = 0 to w step z
    move 0, y
    draw w, y
  next y
end_sub

sub newpop()
' Calcul de la nouvelle population

  dim i%, im1%, ip1%, j%, jm1%, jp1%, s%

  for i = 1 to n
    if i = 1 then im1 = n else im1 = i - 1
    if i = n then ip1 = 1 else ip1 = i + 1

    for j = 1 to n
      if j = 1 then jm1 = n else jm1 = j - 1
      if j = n then jp1 = 1 else jp1 = j + 1

      s =     a(im1, jm1) + a(im1, j) + a(im1, jp1)
      s = s + a(i,   jm1)             + a(i,   jp1)
      s = s + a(ip1, jm1) + a(ip1, j) + a(ip1, jp1)

      b(i, j) = evol(a(i, j), s)
    next j
  next i

  for i = 1 to n
    for j = 1 to n
      a(i, j) = b(i, j)
    next j
  next i

  gener = gener + 1
end_sub

sub printparam()

  dim autosave$

  if savepics then autosave = "ON" else autosave = "OFF"

  print clr1 & "Row: " & clr2 & k1y & clr1 & "-" & clr2 & kmy,  20, 52 + w
  print clr1 & "Col: " & clr2 & k1x & clr1 & "-" & clr2 & kmx, 160, 52 + w

  print clr1 & "AutoSave: " & clr2 & autosave, 400, 52 + w
  
  print clr1 & "Zoom: " & clr2 & z,      20, 18
  print clr1 & "Pas: "  & clr2 & pas,   120, 18
  print clr1 & "Gen: "  & clr2 & gener, 220, 18
end_sub

sub print_cmd_creation ()
 
  cmd(10,2) = "Passe en mode generation"
  
  locate 70, 5 : print clr3 + "MODE CREATION"

  for i = 1 to 10
    locate 70, 2 * i + 6
    print clr4 + cmd(i,1) + "  " + clr5 + cmd(i,2)
  next i
end_sub

sub print_cmd_generation ()
 
  cmd(10,2) = "Passe en mode creation"

  locate 70, 5 : print clr3 + "MODE GENERATION"
 
  for i = 5 to 10
    locate 70, 2 * i - 2
    print clr4 + cmd(i,1) + "  " + clr5 + cmd(i,2)
  next i
end_sub

sub display()
' Affichage de la population ; sauvegarde de l'image

  dim i%, j%, x%, y%, z2%, r%, h%

  z2 = z \ 2

  if z = 0 then h = 1 else h = z

  select z
    case 4
      r = z2
    case 8
      r = z2 - 1
    case is > 8
      r = z2 - 2
  end_select

  cls : if grid then plotgrid()

  pen CL_VERT_VIF

  x = z2
  for j = 0 to m - 1
    y = w - z2
    for i = 0 to m - 1
      if a(i + k1y, j + k1x) = 1 then
        if z = 0 then plot x, y else pie x, y, r
      end_if
      y = y - h
    next i
    x = x + h
  next j
end_sub

sub get_click()
' Clic de souris ==> changer l'etat de la case

  dim x%, y%, btn%, i%, j%
  
  get_mouse x, y, btn
  
  if btn > 0 then
    i = k1y + (w - y) \ z
    j = k1x + x \ z
    if btn = 1 then a(i, j) = 1 else a(i, j) = 0
  end_if
end_sub

Jeu de la vie - Automates cellulaires Vie10
Revenir en haut Aller en bas
http://www.unilim.fr/pages_perso/jean.debord/index.htm
Minibug

Minibug


Nombre de messages : 4566
Age : 57
Localisation : Vienne (86)
Date d'inscription : 09/02/2012

Jeu de la vie - Automates cellulaires Empty
MessageSujet: Re: Jeu de la vie - Automates cellulaires   Jeu de la vie - Automates cellulaires EmptyDim 19 Sep 2021 - 11:34

Bonjour Jean,

Chez moi le code ne fonctionne pas avec la dernière version de Croco-basic !

Une partie du code a été mangé en ligne 100 : dim evol%(1,
Tout fonctionne après ajout en fin de ligne des caractères 8 et ).

les caractères 8 et ) cote à cote sont pris pour l'émoticône suivante : Cool

Je ne sais pas comment éviter cela... drunken
Revenir en haut Aller en bas
http://gpp.panoramic.free.fr
jean_debord

jean_debord


Nombre de messages : 1250
Age : 69
Localisation : Limoges
Date d'inscription : 21/09/2008

Jeu de la vie - Automates cellulaires Empty
MessageSujet: Re: Jeu de la vie - Automates cellulaires   Jeu de la vie - Automates cellulaires EmptyDim 19 Sep 2021 - 14:52

Bonjour Minibug,

Je me fais toujours avoir avec ce problème Embarassed

Il faut mettre un espace entre le 8 et la parenthèse.

Il y a aussi la ligne 92 : chr( 15, 18 )

Voici une version qui devrait corriger le problème :

Code:

' ********************************************************************
' Jeu de la vie de J. H. Conway
' ********************************************************************
' Ce programme travaille sur des grilles de grande taille dont on
' n'affiche qu'une partie, avec possibilite de zoom et de defilement.
'
' Le programme demarre en mode "Creation". Les commandes suivantes
' sont actives :
'
'   Clic gauche : cree ou efface une cellule
'   Clic droit  : efface une cellule
'   A, a        : remplit 10% des cases, de maniere aleatoire
'   E, e        : efface toutes les cases
'   +, -        : augmente ou diminue le zoom (taille en pixels
'                 des cases affichees : 0, 4, 8, 12, 16, 20, 24 ;
'                 0 = 1 pixel par case)
'   Fleches     : font defiler la zone d'affichage
'   *, /        : multiplie ou divise par 2 le pas de defilement
'                 (1 a 1024)
'   G, g        : affiche une grille (si zoom > 4)
'   S, s        : active ou desactive la sauvegarde automatique des images
'   Espace      : passe en mode "Generation"
'
' En mode "Generation" les commandes suivantes sont actives :
'
'   G, g, S, s          : comme en mode "Creation"
'   Fleches, +, -, *, / : comme en mode "Creation" mais plus lent
'                         a cause du temps de calcul
'   Espace              : repasse en mode "Creation" et remet le
'                         compteur de generations a zero
'
' Les parametres sont ecrits de part et d'autre de la grille :
'   - coordonnees des cases affichees (Row, Col)
'   - zoom, pas de deplacement, compteur de generations
'
' La touche Echap quitte le programme
' ********************************************************************

const n = 1000   ' Taille de la grille
const fg = 2     ' Taille de la fenetre graphique en multiple de 240
                 ' (240 = PPCM des valeurs de zoom)
const lag = 50   ' Delai entre 2 images (ms)

dim z% = 24              ' Zoom (0, 4, 8, 12, 16, 20, 24)

dim creat% = TRUE       ' Mode "creation"
dim grid% = TRUE        ' Afficher la grille (si z > 4)
dim savepics% = FALSE   ' Sauvegarder les images
dim pas% = 1            ' Deplacement par les fleches (nb de cases)
dim gener% = 0          ' Generation

dim x0%, y0%            ' Coin inf. gauche de la grille
dim w1%, h1%            ' Taille de la fenetre en pixels    
dim w%                  ' Largeur de la grille en pixels
dim m%                  ' Nombre de cases affichees dans chaque direction
dim k1x%, k1y%          ' Coord. de la case affichee en bas a gauche
dim kmx%, kmy%          ' Coord. de la case affichee en haut a droite
dim key$                ' Touche pressee
dim i%, j%              ' Variables de boucle

dim a%*1(n, n)          ' Population actuelle (codage sur 1 octet)
dim b%*1(n, n)          ' Nouvelle population

' --------------------------------------------------------------------
' Liste des commandes
' --------------------------------------------------------------------

data "Clic gauche", "Cree une cellule"
data "Clic droit", "Efface une cellule"
data "A, a", "Remplit une case sur 10 (aleatoire)"
data "E, e", "Efface toutes les cases"
data "+, -", "Augmente ou diminue le zoom"
data "Fleches", "Font defiler la zone d'affichage"
data "*, /", "Multiplie/divise par 2 le pas de defilement"
data "G, g", "Affiche une grille (si zoom > 4)"
data "S, s", "Active/desactive la sauvegarde des images"
data "Espace", ""

dim cmd$(10,2)

for i = 1 to 10
  read cmd(i,1), cmd(i,2)
next i

' --------------------------------------------------------------------
' Definition des couleurs par les caracteres de controle
' --------------------------------------------------------------------

const clr1 = chr( 15, 20 ) ' Turquoise
const clr2 = chr( 15, 26 ) ' Blanc
const clr3 = chr( 15, 15 ) ' Orange
const clr4 = chr( 15, 18 ) ' Vert vif  
const clr5 = chr( 15,  9 ) ' Vert fonce

' --------------------------------------------------------------------
' Definition des regles d'evolution
' --------------------------------------------------------------------

dim evol%( 1, 8 )

data 0, 0, 0, 1, 0, 0, 0, 0, 0
data 0, 0, 1, 1, 0, 0, 0, 0, 0

for i = 0 to 1
  for j = 0 to 8
    read evol(i, j)
  next j
next i

' --------------------------------------------------------------------
' Cree le nom du fichier PNG pour 1 generation (Ex. 00000123.png)
' --------------------------------------------------------------------

def filename() = dec(gener, "00000000") + ".png"

' --------------------------------------------------------------------
' Programme principal
' --------------------------------------------------------------------

init()

mode 3, "Jeu de la vie (" & n & " x " & n & ")", w1, h1, 1, 2

repeat
  screenlock : cls

  origin x0, y0, x0, x0 + w, y0 + w, y0, CL_NOIR, CL_BLANC

  display()
  if not creat then
    if savepics then img_save filename()
    newpop()
  end_if

  get_click()
  
  origin

  printparam()
  if creat then
    print_cmd_creation()
  else
    print_cmd_generation()
  end_if

  key = inkey()

  select key
    case " "
      creat = not creat
      if creat then gener = 0

    case "*"
      if pas < 1024 then pas = 2 * pas

    case "+"
      if z < 24 then z = z + 4 : init()

    case "-"
      if z > 0 then z = z - 4 : init()

    case "/"
      if pas > 1 then pas = pas \ 2

    case "A", "a"
      if creat then aleat()

    case "E", "e"
      if creat then efface()

    case "G", "g"
      grid = not grid

    case "S", "s"
      savepics = not savepics

    case "UP"
      k1y = max(1, k1y - pas)
      kmy = k1y + m - 1

    case "LEFT"
      k1x = max(1, k1x - pas)
      kmx = k1x + m - 1

    case "RIGHT"
      kmx = min(n, kmx + pas)
      k1x = kmx - m + 1

    case "DOWN"
      kmy = min(n, kmy + pas)
      k1y = kmy - m + 1
  end_select

  screenunlock : sleep lag
until key = "ESCAPE"

' --------------------------------------------------------------------
' Sous-Programmes
' --------------------------------------------------------------------

sub init()
' Initialisation des variables

  x0 = 20
  y0 = 30
  w = 240 * fg
  w1 = w + 2 * x0 + 450
  h1 = w + 2 * y0
  if z = 0 then m = w else m = w \ z
  k1x = (n - m) \ 2 + 1
  kmx = k1x + m - 1
  k1y = k1x
  kmy = kmx
end_sub

sub efface ()
' Efface toutes les cases

  dim i%, j%

  for i = 1 to n
    for j = 1 to n
      a(i,j) = 0
    next j
  next i
end_sub

sub aleat ()
' Remplissage aleatoire de 10% des cases

  dim i%, j%
  randomize timer

  for i = 1 to n
    for j = 1 to n
      if rnd > 0.9 then a(i, j) = 1 else a(i, j) = 0
    next j
  next i
end_sub

sub plotgrid ()
' Affichage de la grille

  if z < 8 then exit_sub

  dim x%, y%

  pen CL_GRIS

  for x = 0 to w step z
    move x, 0
    draw x, w
  next x

  for y = 0 to w step z
    move 0, y
    draw w, y
  next y
end_sub

sub newpop()
' Calcul de la nouvelle population

  dim i%, im1%, ip1%, j%, jm1%, jp1%, s%

  for i = 1 to n
    if i = 1 then im1 = n else im1 = i - 1
    if i = n then ip1 = 1 else ip1 = i + 1

    for j = 1 to n
      if j = 1 then jm1 = n else jm1 = j - 1
      if j = n then jp1 = 1 else jp1 = j + 1

      s =     a(im1, jm1) + a(im1, j) + a(im1, jp1)
      s = s + a(i,   jm1)             + a(i,   jp1)
      s = s + a(ip1, jm1) + a(ip1, j) + a(ip1, jp1)

      b(i, j) = evol(a(i, j), s)
    next j
  next i

  for i = 1 to n
    for j = 1 to n
      a(i, j) = b(i, j)
    next j
  next i

  gener = gener + 1
end_sub

sub printparam()

  dim autosave$

  if savepics then autosave = "ON" else autosave = "OFF"

  print clr1 & "Row: " & clr2 & k1y & clr1 & "-" & clr2 & kmy,  20, 52 + w
  print clr1 & "Col: " & clr2 & k1x & clr1 & "-" & clr2 & kmx, 160, 52 + w

  print clr1 & "AutoSave: " & clr2 & autosave, 400, 52 + w
  
  print clr1 & "Zoom: " & clr2 & z,      20, 18
  print clr1 & "Pas: "  & clr2 & pas,   120, 18
  print clr1 & "Gen: "  & clr2 & gener, 220, 18
end_sub

sub print_cmd_creation ()
 
  cmd(10,2) = "Passe en mode generation"
  
  locate 70, 5 : print clr3 + "MODE CREATION"

  for i = 1 to 10
    locate 70, 2 * i + 6
    print clr4 + cmd(i,1) + "  " + clr5 + cmd(i,2)
  next i
end_sub

sub print_cmd_generation ()
 
  cmd(10,2) = "Passe en mode creation"

  locate 70, 5 : print clr3 + "MODE GENERATION"
 
  for i = 5 to 10
    locate 70, 2 * i - 2
    print clr4 + cmd(i,1) + "  " + clr5 + cmd(i,2)
  next i
end_sub

sub display()
' Affichage de la population ; sauvegarde de l'image

  dim i%, j%, x%, y%, z2%, r%, h%

  z2 = z \ 2

  if z = 0 then h = 1 else h = z

  select z
    case 4
      r = z2
    case 8
      r = z2 - 1
    case is > 8
      r = z2 - 2
  end_select

  cls : if grid then plotgrid()

  pen CL_VERT_VIF

  x = z2
  for j = 0 to m - 1
    y = w - z2
    for i = 0 to m - 1
      if a(i + k1y, j + k1x) = 1 then
        if z = 0 then plot x, y else pie x, y, r
      end_if
      y = y - h
    next i
    x = x + h
  next j
end_sub

sub get_click()
' Clic de souris ==> changer l'etat de la case

  dim x%, y%, btn%, i%, j%
  
  get_mouse x, y, btn
  
  if btn > 0 then
    i = k1y + (w - y) \ z
    j = k1x + x \ z
    if btn = 1 then a(i, j) = 1 else a(i, j) = 0
  end_if
end_sub
Revenir en haut Aller en bas
http://www.unilim.fr/pages_perso/jean.debord/index.htm
jean_debord

jean_debord


Nombre de messages : 1250
Age : 69
Localisation : Limoges
Date d'inscription : 21/09/2008

Jeu de la vie - Automates cellulaires Empty
MessageSujet: Re: Jeu de la vie - Automates cellulaires   Jeu de la vie - Automates cellulaires EmptyJeu 14 Oct 2021 - 9:33

La fourmi de Langton.

Voir le post initial de Papydall.

Code:

' ********************************************************************
' Fourmi de Langton
' ********************************************************************
' Ce programme travaille sur des grilles de grande taille dont on
' n'affiche qu'une partie, avec possibilite de zoom et de defilement.
'
' Le programme demarre en mode "Creation". Les commandes suivantes
' sont actives :
'
'   Clic gauche : marque la case
'   Clic droit  : efface la case
'   A, a        : marque une partie des cases, de maniere aleatoire
'   E, e        : efface (met en blanc) toutes les cases
'   +, -        : augmente ou diminue le zoom (taille en pixels
'                 des cases affichees : 0, 4, 8, 12, 16, 20, 24 ;
'                 0 = 1 pixel par case)
'   Fleches     : font defiler la zone d'affichage
'   *, /        : multiplie ou divise par 2 le pas de defilement
'                 (1 a 1024)
'   G, g        : affiche une grille (si zoom > 4)
'   S, s        : active ou desactive la sauvegarde automatique des images
'   Espace      : Passe en mode "Generation"
'
' En mode "Generation" les commandes suivantes sont actives :
'
'   G, g, S, s          : comme en mode "Creation"
'   Fleches, +, -, *, / : comme en mode "Creation"
'   Espace              : repasse en mode "Creation" et remet le
'                         compteur d'iterations a zero
'
' Les parametres sont ecrits de part et d'autre de la grille :
'   - coordonnees des cases affichees (Row,Col)
'   - statut de la sauvegarde automatique (AutoSave)
'   - zoom, pas de deplacement, compteur d'iterations
'
' La touche Echap quitte le programme
' ********************************************************************

const n = 1000              ' Taille du "terrain de jeu"
const fg = 2                ' Taille de la grille en multiple de 240
                            ' (240 = PPCM des valeurs de zoom)
const w = 240 * fg          ' Largeur de la grille en pixels
const x0 = 20, y0 = 30      ' Coin sup. gauche de la grille affichee
const w1 = w + 2 * x0 + 450 ' Largeur de la fenetre graphique en pixels
const h1 = w + 2 * y0       ' Hauteur de la fenetre graphique en pixels
const lag = 10              ' Delai entre 2 images (ms)

dim z% = 8                  ' Zoom (0, 4, 8, 12, 16, 20, 24)
dim creat% = TRUE           ' Mode "creation"
dim grid% = TRUE            ' Afficher la grille (si z > 4)
dim savepics% = FALSE       ' Sauvegarder les images
dim pas% = 1                ' Deplacement par les fleches (nb de cases)
dim iter% = 0               ' Iteration
dim pr = 0.9                ' Probabilite d'avoir une case vide
                            '   lors d'un remplissage aleatoire
dim a%*1(n, n)              ' Grille (0=Vide, 1=Plein)
dim fi%, fj                 ' Position de la fourmi        
dim r% = 2                  ' Orientation (0=Nord, 1=Est, 2=Sud, 3=Ouest)
dim m%                      ' Nombre de cases affichees dans chaque direction
dim k1x%, kmx%              ' Coord. de la case affichee en haut a gauche
dim k1y%, kmy%              ' Coord. de la case affichee en bas a droite
dim key$                    ' Touche pressee
dim i%, j%                  ' Variables de boucle

' --------------------------------------------------------------------
' Liste des commandes
' --------------------------------------------------------------------

data "Clic gauche", "Marque la case"
data "Clic droit", "Efface la case"
data "A, a", "Colore une partie des cases (aleatoire)"
data "E, e", "Efface toutes les cases"
data "+, -", "Augmente ou diminue le zoom"
data "Fleches", "Font defiler la zone d'affichage"
data "*, /", "Multiplie/divise par 2 le pas de defilement"
data "G, g", "Affiche une grille (si zoom > 4)"
data "S, s", "Active/desactive la sauvegarde des images"
data "Espace", ""

dim cmd$(10,2)

for i = 1 to 10
  read cmd(i,1), cmd(i,2)
next i

' --------------------------------------------------------------------
' Definition des couleurs par les caracteres de controle
' --------------------------------------------------------------------

const clr1 = chr( 15, 20 ) ' Turquoise
const clr2 = chr( 15, 26 ) ' Blanc
const clr3 = chr( 15, 15 ) ' Orange
const clr4 = chr( 15, 18 ) ' Vert vif  
const clr5 = chr( 15,  9 ) ' Vert fonce

' --------------------------------------------------------------------
' Cree le nom du fichier PNG pour 1 generation (Ex. 00000123.png)
' --------------------------------------------------------------------

def filename() = dec(iter, "00000000") + ".png"

' --------------------------------------------------------------------
' Programme principal
' --------------------------------------------------------------------

init()

fi = n \ 2
fj = fi

mode 3, "Fourmi de Langton (" & n & " x " & n & ")", w1, h1, 1, 2

repeat
  screenlock
  paper CL_NOIR : cls

  origin x0, y0, x0, x0 + w, y0 + w, y0, CL_BLANC

  display()
  if not creat then
    if savepics then img_save filename()
    deplace()
  end_if

  get_click()
  
  origin
  paper CL_NOIR

  printparam()
  if creat then
    print_cmd_creation()
  else
    print_cmd_generation()
  end_if

  key = inkey()

  select key
    case " "
      creat = not creat
      if creat then iter = 0

    case "*"
      if pas < 1024 then pas = 2 * pas

    case "+"
      if z < 24 then z = z + 4 : init()

    case "-"
      if z > 0 then z = z - 4 : init()

    case "/"
      if pas > 1 then pas = pas \ 2

    case "A", "a"
      if creat then aleat()

    case "E", "e"
      if creat then efface()

    case "G", "g"
      grid = not grid

    case "S", "s"
      savepics = not savepics

    case "UP"
      k1y = max(1, k1y - pas)
      kmy = k1y + m - 1

    case "LEFT"
      k1x = max(1, k1x - pas)
      kmx = k1x + m - 1

    case "RIGHT"
      kmx = min(n, kmx + pas)
      k1x = kmx - m + 1

    case "DOWN"
      kmy = min(n, kmy + pas)
      k1y = kmy - m + 1
  end_select

  screenunlock : sleep lag
until key = "ESCAPE"

' --------------------------------------------------------------------
' Sous-Programmes
' --------------------------------------------------------------------

sub init()
' Initialisation des parametres graphiques

  if z = 0 then m = w else m = w \ z
  k1x = (n - m) \ 2 + 1
  kmx = k1x + m - 1
  k1y = k1x
  kmy = kmx
end_sub

sub efface ()
' Efface toutes les cases et restaure les parametres de la fourmi

  dim i%, j%

  for i = 1 to n
    for j = 1 to n
      a(i,j) = 0
    next j
  next i

  fi = n \ 2
  fj = fi
  r = 2
end_sub

sub aleat ()
' Coloriage aleatoire des cases

  dim i%, j%
  randomize timer

  for i = 1 to n
    for j = 1 to n
      if rnd > pr then a(i, j) = 1 else a(i, j) = 0
    next j
  next i
end_sub

sub plotgrid ()
' Affichage de la grille

  if z < 8 then exit_sub

  dim x%, y%

  pen CL_GRIS

  for x = 0 to w step z
    move x, 0
    draw x, w
  next x

  for y = 0 to w step z
    move 0, y
    draw w, y
  next y
end_sub

sub deplace()
' Deplacement de la fourmi

  a(fi, fj) = a(fi, fj) xor 1        ' Changement de couleur
  r = (r + 2 * a(fi, fj) + 1) mod 4  ' Nouvelle orientation

  select r
    case 0 : fi = fi - 1             ' Deplacement
    case 1 : fj = fj + 1
    case 2 : fi = fi + 1
    case 3 : fj = fj - 1
  end_select

  iter = iter + 1
end_sub

sub printparam()

  dim autosave$

  if savepics then autosave = "ON" else autosave = "OFF"

  print clr1 & "Row: " & clr2 & k1y & clr1 & "-" & clr2 & kmy,  20, 52 + w
  print clr1 & "Col: " & clr2 & k1x & clr1 & "-" & clr2 & kmx, 160, 52 + w

  print clr1 & "AutoSave: " & clr2 & autosave, 400, 52 + w
  
  print clr1 & "Zoom: " & clr2 & z,     20, 18
  print clr1 & "Pas: "  & clr2 & pas,  120, 18
  print clr1 & "Iter: " & clr2 & iter, 220, 18
end_sub

sub print_cmd_creation ()
 
  cmd(10,2) = "Passe en mode generation"
  
  locate 70, 5 : print clr3 + "MODE CREATION"

  for i = 1 to 10
    locate 70, 2 * i + 6
    print clr4 + cmd(i,1) + "  " + clr5 + cmd(i,2)
  next i
end_sub

sub print_cmd_generation ()
 
  cmd(10,2) = "Passe en mode creation"

  locate 70, 5 : print clr3 + "MODE GENERATION"
 
  for i = 5 to 10
    locate 70, 2 * i - 2
    print clr4 + cmd(i,1) + "  " + clr5 + cmd(i,2)
  next i
end_sub

sub plotcell(i%, j%, x%, y%, xr%, yr%, z%)
' Coloration d'une case

  dim fourmi%

  fourmi = (i = fi and j = fj)
  if a(i, j) = 0 and (not fourmi) then exit_sub
  
  if fourmi then pen CL_ROUGE_VIF else pen CL_BLEU
  if z = 0 then plot x, y else rectangle_fill xr, yr, z, z
end_sub

sub display()
' Affichage et sauvegarde de l'image

  dim i%, j%, i1%, j1%, x%, y%, xr%, yr%, z2%, h%

  z2 = z \ 2

  if z = 0 then h = 1 else h = z

  if grid then plotgrid()

  x = z2
  xr = 0
  for j = 0 to m - 1
    y = z2
    yr = 0
    j1 = j + k1x
    for i = 0 to m - 1
      i1 = i + k1y
      plotcell i1, j1, x, y, xr, yr, z
      y = y + h
      yr = yr + h
    next i
    x = x + h
    xr = xr + h
  next j
end_sub

sub get_click()
' Clic de souris ==> changer l'etat de la case

  dim x%, y%, btn%, i%, j%
  
  get_mouse x, y, btn
  if btn = 0 then exit_sub

  i = k1y + y \ z + 1
  j = k1x + x \ z
  
  select btn
    case BUTTON_LEFT
      a(i, j) = 1
    case BUTTON_RIGHT
      a(i, j) = 0
  end_select
end_sub
Revenir en haut Aller en bas
http://www.unilim.fr/pages_perso/jean.debord/index.htm
Minibug

Minibug


Nombre de messages : 4566
Age : 57
Localisation : Vienne (86)
Date d'inscription : 09/02/2012

Jeu de la vie - Automates cellulaires Empty
MessageSujet: Re: Jeu de la vie - Automates cellulaires   Jeu de la vie - Automates cellulaires EmptyJeu 14 Oct 2021 - 11:34

Ah oui la fourmi de Langton... drunken

Comme l'expliquait Papydall, surprenant cette histoire d'autoroute !!

Merci pour le partage Jean. Wink
Revenir en haut Aller en bas
http://gpp.panoramic.free.fr
jean_debord

jean_debord


Nombre de messages : 1250
Age : 69
Localisation : Limoges
Date d'inscription : 21/09/2008

Jeu de la vie - Automates cellulaires Empty
MessageSujet: Re: Jeu de la vie - Automates cellulaires   Jeu de la vie - Automates cellulaires EmptyDim 17 Oct 2021 - 18:44

Deux tutoriels sur les automates cellulaires :

Le jeu de la vie

La fourmi de Langton

Comme pour les fractales, il s'agit des versions remaniées de mes anciens articles de "Panoramic le Mag".
Revenir en haut Aller en bas
http://www.unilim.fr/pages_perso/jean.debord/index.htm
Contenu sponsorisé





Jeu de la vie - Automates cellulaires Empty
MessageSujet: Re: Jeu de la vie - Automates cellulaires   Jeu de la vie - Automates cellulaires Empty

Revenir en haut Aller en bas
 
Jeu de la vie - Automates cellulaires
Revenir en haut 
Page 1 sur 1

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC :: Expériences autour de PANORAMIC :: Crocodile Basic-
Sauter vers: