Home • ECDL • Algoritmi • Java • Basi di dati • Seconda prova • Eccetera • Cerca nel sito

Il gioco della vita

Precedente
SUPERIORE

Il gioco è noto con il nome di Life o Gioco della Vita; fu introdotto dal matematico inglese J.H. Conway nel 1970, descritto e discusso da M. Gardner (1970, 1971).

Il gioco è in realtà una simulazione dell’evoluzione di una colonia di individui o organismi nel loro habitat, costituito da un insieme ordinato di celle.

La sopravvivenza della colonia è legata a rigidi rapporti di vicinato, simili a quelli che si instaurano in una città. La colonia è minata dalla possibile carenza di cibo, dovuta a sovraffollamento, e dalla solitudine degli individui.

I rapporti di vicinato definiscono perciò le condizioni di nascita, morte e sopravvivenza di ciascun individuo della colonia in base al seguente schema:
bulletnascita di un individuo: una cella libera e tre vicini sono la condizione per la nascita di un individuo;
bulletmorte per solitudine: la presenza di al massimo un vicino per individuo ne provoca la morte;
bulletmorte per sovraffollamento: la presenza di più di quattro vicini per individuo ne determina la morte;
bulletsopravvivenza: la condizione ottimale di due o tre vicini per individuo.

La colonia evolve attraverso generazioni. Ad ogni generazione si analizzano, ad un ad una, tutte le celle: per le celle vuote si applicherà la condizione di nascita, per le celle occupate si verificheranno le possibilità di sopravvivenza o di morte dell’occupante.

Analisi del problema

Da questo livello di comprensione superficiale è necessario passare ad una più profonda conoscenza del problema definendo:

  1. come è possibile descrivere l’habitat della colonia;
  2. quando e in quali condizioni un individuo risulta vicino di un altro;
  3. in che modo interagiscono le nascite e le morti determinando l’evoluzione della colonia stessa.

Inoltre poiché Life è un gioco, dovrà essere possibile:

  1. iniziarlo;
  2. terminarlo.

Life è anche una simulazione e perciò deve essere possibile:

  1. fornire una colonia abitata più o meno densamente da individui, seguirne l’evoluzione di generazione in generazione per un certo numero di generazioni.

Approfondimenti

Si decide, per chiarire il punto 1., di rappresentare l’habitat con una griglia limitata rettangolare, dove ogni quadratino rappresenta una cella. La presenza di un individuo è rappresentata con una cella contenente *.

Per il punto 2. vicino di un organismo è un individuo che occupa una delle otto celle orizzontalmente, verticalmente e diagonalmente adiacenti alla cella dell’organismo in questione. Le celle numerate da 1 a 8 possono ospitare vicini dell’organismo (*) oppure essere vuote.

1 8 7
2 * 6
3 4 5

Per il punto 3. la soluzione migliore risulta la stesura di un elenco di regole:

  1. vicino è un abitante di una delle otto celle adiacenti, verticalmente, orizzontalmente o diagonalmente a quella in esame;
  2. se una cella è occupata ed ha, al massimo un vicino, nella prossima generazione l’individuo morirà per solitudine;
  3. se una cella è occupata ed ha quattro o più vicini, nella prossima generazione l’abitante morirà per sovraffollamento;
  4. se una cella è abitata e ha 2 o 3 vicini nella prossima generazione sopravviverà;
  5. se una cella è vuota, nella prossima generazione verrà abitata se ha esattamente tre vicini;
  6. tutte le nascite e le morti avvengono contemporaneamente, perciò i moribondi possono favorire nascite, ma non limitare morti per sovraffollamento.

E’ necessario stare ben attenti e non violare la regola 6. permettendo morti o nascite che modifichino il numero dei vicini per le celle che verranno studiate successivamente. Una semplice soluzione è quella di costruire una copia della griglia sulla quale rappresentare l’evolversi della colonia. Dopo aver costruito tutta la nuova generazione, la si potrà ricopiare sulla griglia originale. L’obiettivo è perciò vedere l’evoluzione della colonia attraverso l’evolversi delle generazioni.

Per il punto 4. la condizione di inizio dovrà essere una possibile configurazione della colonia con celle occupate da individui oppure libere (randomizzazione iniziale).

Per il punto 5. la condizione di terminazione potrà essere in prima istanza la morte della totalità della colonia, ma non è il caso di dimenticare che tale evento potrà verificarsi magari dopo ore di gioco e potrà risultare non solo noioso, ma anche estenuante attendere. In tal caso la soluzione più ovvia è anche la più corretta, il gioco terminerà comunque dopo un certo numero di mosse di generazioni. (Per il punto 5. si potrà ancora notare il problema della stabilità della colonia: alcune configurazioni in effetti possono non produrre ulteriori modificazioni nelle colonie, in tal caso che senso avrebbe continuare a giocare?)

Schema del programma

A questo punto è possibile dare una prima formalizzazione della nostra attuale soluzione:

determina il numero massimo di generazionicostruisci la griglia iniziale (oldboard)ripeti i seguenti passi per ogni cella della griglia di oldboard conta i vicini se i vicini sono 0, 1, >=4 l’individuo è morto(segna spazio) se i vicini sono 3 nasce un individuo(segna *) se i vicini sono 2 l’individuo sopravvive(segna quel che c’era) copia newboard in oldboardfinché sia raggiunto il numero massimo di generazioni oppure colonia morta oppure colonia stabile.

Il gioco della vita - ApPuNtIdIuNiNfOrMaTiCo

Home • ECDL • Algoritmi • Java • Basi di dati • Seconda prova • Eccetera • Cerca nel sito

Precedente
SUPERIORE