KULT Underground

una della più "antiche" e-zine italiane – attiva dal 1994

Il gioco della vita

2 min read

Il gioco della vita

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.

———————————————————————-

Regole del Gioco

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 ———————————————————————-

Il concetto di vicino

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.

———————————————————————-

Il programma

include include include void nuova_configurazione(void); void stampa_soluzione(void); int passo,d;
/* 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

inizializzare la matrice

che dovrà contenere la

configurazione iniziale */

for(i=0;ifor(j=0;jS[0][i][j]=0;
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

se la nuova configurazione deve

essere messa in S[0][i][j]

oppure in S[1][i][j] */

for(i=0;i{
im1=(i==0)?(d-1):(i-1);
ip1=(i==d-1)?0:i+1;
for(j=0;j

{

jm1=(j==0)?(d-1):(j-1);

jp1=(j==d-1)?0:j+1;

/* le inizializzazioni di im1 ip1
jm1 jm2 vengono fatte tenendo
conto della struttura toroidale
precedentemente definita */

somma=S[i1][im1][jm1]+

S[i1][im1][j]+
S[i1][im1][jp1]+

S[i1][i][jm1]+

S[i1][i][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] */

if((somma>3)[i][j]=0;

else

if(somma==3)

S[i2][i][j]=1;

else

S[i2][i][j]=S[i1][i][j];

/* regole del gioco */

}

}
}
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

printf(“—–+”);

printf(“n [i][j])

printf(”

ñ

Elena

Per scaricare il sorgente cliccare qui]

Commenta