:: Home » Numeri » #10 » COMPUTER » Il gioco della vita
1995
25
Lug

Il gioco della vita

Commenti () - Page hits: 2800
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]
 
:: Vota
Vota questo articolo: 1 - 2 - 3 - 4 - 5 (1 = scarso - 5 = ottimo)
 
:: Automatic tags
 
:: Articoli recenti
 
KULT Virtual Press e KULT Underground sono iniziative amatoriali no-profit - per gli e-book e per gli articoli fare riferimento alla sezione Copyright
Webmaster: Marco Giorgini - e-mail: marco @ kultunderground.org - Per segnalazioni o commenti inviare una e-mail a: info @ kultunderground.org
Questo sito è ospitato su server ONE.COM

pagina generata in 147 millisecondi