Si supponga di considerare un intervallo di tempo [A,B] e di discretizzarlo mediante la successione T0,T1,…Tn tale che T0=A e
T1=B: il gioco della vita descrive l’evoluzione dell’esistenza di un gruppo di esseri viventi da [Th, Th+1] a [Th+1, Th+2] per ogni h=0, …, n-2, valutando l’influenza che ciascun essere vivente può avere sugli altri.
L’interesse del programma presentato di seguito nasce appunto dalla discretizzazione dell’intervallo temporale, in quanto viene utilizzata una matrice a tre indici per tenere memoria dell’evoluzione della situazione dall’istante Tk+i all’istante
Tk+i+1, dove si è posto:
Tk=T[h,Th+1]
Tk+1=T[h+1,Th+2]
…………….
Tk+i=T[h+i,Th+i+1]
In questo caso particolare viene usata la matrice S[2][9][9] dove, al prima passo S[0][i][j] rappresenta la situazione di partenza ed
S[1][i][j] la situazione di arrivo; al secondo passo S[1][i][j] rappresenta la situazione di partenza ed S[0][i][j] quella di arrivo, e così via.
Sfruttando questo artificio è possibile alternare le matrici
S[0][i][j] ed S[1][i][j] semplicemente usando un flag.
Se invece si utilizzassero due matrici a due indici (ad esempio
A[i][j] e B[i][j]) ad ogni passo occorrerebbe controllare quale delle due matrici era quella di partenza al passo precedente.
———————————————————————-
Su una scacchiera quadrata di dimensioni d a piacere (nel programma qui riportato si è supposto che fosse al massimo di 9 x 9 elementi) l’utente dispone un numero n di esseri viventi tale che sia n<=d. Lo schema così ottenuto rappresenterà la situazione di partenza che, nelle schermate successive, evolverà secondo le seguenti regole: ogni essere vivente: muore quando ha più di tre o meno di due vicini rimane in vita quando ha due oppure tre vicini nasce quando esistono tre vicini ———————————————————————-
Si consideri la matrice (Ai,j)i,j=0,…,n
0)per ogni Aij interno, tale cioè che i,j=1,…,n-1 di definiscono vicini gli elementi
Ai-1,j-1 Ai-1,j Ai-1,j+1 Ai,j+1 Ai+1,j+1 Ai+1,j Ai+1,j-1 Ai,j-1
1)si definiscono vicini di A0,0 gli elementi
An,n An,0 An,1 A0,1 A1,1 A1,0 A1,n A0,n
2)si definiscono vicini di A0,n gli elementi
An,n-1 An,n An,0 A0,0 A1,0 A1,n A1,n-1 A0,n-1
3)si definiscono vicini di An,n gli elementi
An-1,n-1 An-1,0 An-1,n An,0 A0,0 A0,n A0,n-1
4)si definiscono vicini di An,0 gli elementi
An-1,n An-1,0 An-1,1 An,1 A0,1 A0,0 A0,n An,n
5)per ogni A0,j tale che j=1,…,n-1 si definiscono vicini gli elementi
An,j-1 An,j An,j+1 A0,j+1 A1,j+1 A1,j A1,j-1 A0,j-1
6)per ogni Ai,n tale che i=1,…,n-1 si definiscono vicini gli elementi
Ai-1,n-1 Ai-1,n Ai-1,0 Ai,0 Ai+1,0 Ai+1,n Ai+1,n-1 Ai,n-1
7)per ogni An,j tale che j=1,…,n-1 si definiscono vicini gli elementi
An-1,j-1 An-1,j An-1,j+1 An,j+1 A0,j+1 A0,j A0,j-1 An,j-1
8)per ogni Ai,0 tale che i=1,…,n-1 si definiscono vicini gli elementi
Ai-1,n Ai-1,0 Ai-1,1 Ai,1 Ai+1,1 Ai+1,0 Ai+1,n Ai,n
Si noti che in questo modo si è definita una struttura toroidale.
———————————————————————-
include
/* la variabile passo viene utilizzata
per decidere quale, fra le matrici
S[0][i][j] ed S[1][i][j],
deve essere stampata e in quale
deve essere memorizzata la nuova
configurazione */ char S[2][9][9];
void main()
{
int i,j,v,ir,ic;
printf(“n Dammi le dimensioni della scacchiera (<=9)");
scanf(“%d”,&d);
printf(“n Quanti esseri viventi ci sono?”);
scanf(“%d”,&v);
/* Questo ciclo serve per
for(i=0;i
for(i=0;i
printf(“n Dammi le coordinate dell’essere vivente n.%d”,i);
scanf(“%d%d”,&ir,&ic);
S[0][ir][ic]=1;
}
stampa_soluzione();
getch();
do
{
passo++;
nuova_configurazione();
stampa_soluzione();
printf(“n Vuoi un’altra configurazione? (S/N)”);
}
while(‘S’==toupper(getch()));
}
void nuova_configurazione(void)
{
int i1,i2,i,j,im1,jm1,ip1,jp1,somma;
i2=passo%2;
i1=1-i2;
/* questi due passaggi stabiliscono
for(i=0;i /* le inizializzazioni di im1 ip1 S[i1][im1][j]+ S[i1][i][jp1]+ /* regole del gioco */ } printf(“n [i][j]) ñ Per scaricare il sorgente cliccare qui]
im1=(i==0)?(d-1):(i-1);
ip1=(i==d-1)?0:i+1;
for(j=0;j
jm1 jm2 vengono fatte tenendo
conto della struttura toroidale
precedentemente definita */
S[i1][im1][jp1]+
S[i1][ip1][jm1]+
S[i1][ip1][j]+
S[i1][ip1][jp1];
/* questo passaggio serve per
stabilire i vicini di S[i1][i][j] */
}
void stampa_soluzione(void)
{
int i,j,ic;
ic=passo%2;
/* inizializzando ic si stabilisce
se la soluzione da stampare S
contenuta in S[0][i][j]
oppure in S[1][i][j] */
clrscr();
printf(“n Soluzione n]%d n”, passo);
for(i=0;i
printf(” +”);
for(j=0;j