Mai 2024 | Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
---|
| | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | | | Calendrier |
|
| | Jeu de la vie - Automates cellulaires | |
| | Auteur | Message |
---|
jean_debord
Nombre de messages : 1250 Age : 69 Localisation : Limoges Date d'inscription : 21/09/2008
| Sujet: Jeu de la vie - Automates cellulaires Dim 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
| |
| | | Minibug
Nombre de messages : 4566 Age : 57 Localisation : Vienne (86) Date d'inscription : 09/02/2012
| Sujet: Re: Jeu de la vie - Automates cellulaires Dim 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 : Je ne sais pas comment éviter cela... | |
| | | jean_debord
Nombre de messages : 1250 Age : 69 Localisation : Limoges Date d'inscription : 21/09/2008
| Sujet: Re: Jeu de la vie - Automates cellulaires Dim 19 Sep 2021 - 14:52 | |
| Bonjour Minibug, Je me fais toujours avoir avec ce problème 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
| |
| | | jean_debord
Nombre de messages : 1250 Age : 69 Localisation : Limoges Date d'inscription : 21/09/2008
| Sujet: Re: Jeu de la vie - Automates cellulaires Jeu 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
| |
| | | Minibug
Nombre de messages : 4566 Age : 57 Localisation : Vienne (86) Date d'inscription : 09/02/2012
| Sujet: Re: Jeu de la vie - Automates cellulaires Jeu 14 Oct 2021 - 11:34 | |
| Ah oui la fourmi de Langton... Comme l'expliquait Papydall, surprenant cette histoire d'autoroute !! Merci pour le partage Jean. | |
| | | jean_debord
Nombre de messages : 1250 Age : 69 Localisation : Limoges Date d'inscription : 21/09/2008
| Sujet: Re: Jeu de la vie - Automates cellulaires Dim 17 Oct 2021 - 18:44 | |
| Deux tutoriels sur les automates cellulaires : Le jeu de la vieLa fourmi de LangtonComme pour les fractales, il s'agit des versions remaniées de mes anciens articles de "Panoramic le Mag". | |
| | | Contenu sponsorisé
| Sujet: Re: Jeu de la vie - Automates cellulaires | |
| |
| | | | Jeu de la vie - Automates cellulaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |