Dal C al C++/Gioco life di Conway: differenze tra le versioni
Contenuto cancellato Contenuto aggiunto
Annullata la modifica 300533 di 151.42.13.92 (discussione) |
Nessun oggetto della modifica |
||
Riga 1:
#include<ctime>
//Ho usato quasi solo funzioni "void" perché sono mooolto più belle e perché le funzioni "normali" sono sopravvalutate.
using std::cout;//Questi 4 "using std::..." servono a fare le cose che fa un programma normalmente, potevamo usare
//il semplice "using namespace std" ma così sembra più complicato.
/*Ho provato a dare dei nomi a tutte le funzioni e variabili che aiutani la spiegazione di ciò che succede all'iterno di tale funzione
o a cosa serve tale variabile, molti sono in inglese perché sono più brevi in inglese e perché l'inglese è una lingua più bella.*/
▲ #include <iostream>
▲ #include <cstdlib>
▲ #include <vector>
▲ #include <set>
▲ using std::cin;
public: //accessibili dall’esterno e in ogni punto del programma.
▲ using std::dec;
enum stato{vuoto=0,pieno}; //Questa è una enumerazioni, essa è esattamente come i tipi fondamentali e composti, un altro "tipo"
▲ using std::hex;
//essa nello specifico tratta solo valori che possono essere assunti da una variabile enumerazione e questi
//sono ristretti ad un insieme di valori interi costanti, ad ognuno dei quali viene associato un nome.
typedef std::set<Casella *> Container; //Typedef ha come scopo quello di semplificare la vita, esso infatti,
//a differenza di una dichiarazione standard troppo fastidiosa, riesce a rendere il codice moooolto più riutilizzabile
//tra un'implementazione e un'altra.
private: //utilizzabili soltanto all’interno della classe stessa.
▲ // Osservabile e osservato contemporaneamente, gestisce le regole "biologiche"
▲ class Casella{
int vicini_futuri;
public:▼
▲ typedef Container::iterator Iterator;
Casella( const Casella::stato & s = Casella::vuoto ) //const non ha bisogno di essere spiegato.
▲ stato stato_;
:
▲ int vicini;
▲ Container osservatori;
virtual ~Casella(){} //Virtual è un pò più difficile da spiegare...è anche questa come int, double, typedef, enum un "tipo" di dichiarazione
//virtual però è diferso dagli altri tipi di dichiarazioni poichè consente di condizionare l’esecuzione del codice
▲ //non copia gli osservatori
//secondo il tipo dell’istanza oggetto cui si fa riferimento. Scusi se non è molto chiaro ma non ho idea di come spiegarlo...
//ma ripeto che non sono sicurissimo su questo fatto, scusi se non sono ferrato ma me l'ha consigliato di usare un amico.
if (&c != this){ //this identifica un puntatore speciale che contiene l’indirizzo dell’istanza della classe
osservatori.insert(&c);▼
//che
} ▼
}▼
Imposta(Casella::vuoto);
Notifica(-1);//Utile per la notifica, vedi dopo.
}
} ▲ }
}
vicini=vicini_futuri;
if (vicini==3) // Modificare questa riga per cambiare le regole di nascita
Nasci();
}
// Ricevi la notifica dai vicini
};
private: //utilizzabili soltanto all’interno della classe stessa.
int time;
Container griglia; public: //accessibili dall’esterno e in ogni punto del programma.
if (righe_ < 5) righe_=5;
if (colonne_ < 5) righe_=5;
griglia.reserve(righe_*colonne_);
griglia.resize(righe_*colonne_);
return griglia[n];
for (int i = 0; i < righe_*colonne_;++i)
griglia[i].Ciclo();
for (int i = 0; i < righe_*colonne_;++i)
griglia[i].Verifica();
}
griglia[pos].Nasci();
}
griglia[pos].Muori();
}
inline void Genera(){ //Scusi se questa parte è un poco incasinata ma non avevo trovato modi per scrivere più "ristretto"
//e comunque in un modo "chiaro e capibile".
bool primo, ultimo;
for (int indice=0; indice< righe_*colonne_;++indice){ ultimo = ( (indice%colonne_) == colonne_-1);
if (indice > colonne_){
if (!primo)
griglia[indice].Registra(griglia[indice-colonne_ - 1]);
griglia[indice].Registra(griglia[indice-colonne_]);
if (!ultimo)
griglia[indice].Registra(griglia[indice-colonne_ + 1]);
griglia[indice].Registra(griglia[indice-1]);
griglia[indice].Registra(griglia[indice+1]);
griglia[indice].Registra(griglia[indice+colonne_+1]);
griglia[indice].Registra(griglia[indice+colonne_]);
if (!primo)
griglia[indice].Registra(griglia[indice+colonne_-1]);
}
cout << "\n\n"; //ne abbiamo messi 2 per bellezza
cout << "+--------------------+\n|";
for (int indice=0;indice < 400;++indice){ //Caratteri.
bool ultimo = ( (indice%20) == 19);
g[indice].Leggi()?cout << "O":cout << " ";
if (ultimo){
if (indice !=399)
{cout << "|\n|";}
else
{cout << "|\n";}
}
}
cout << "+--------------------+\n";
}
Griglia griglia(20,20)
griglia.Genera();
// Inizializza la griglia casualmente, con fattore di
// riempimento un ottavo.
// Gestione !statica! delle dimensioni. Per variare, utilizzare griglia.Righe() e Colonne()
srand(time(0));
for (int i=0; i < 100;++i){
griglia.Imposta((rand()>>4) %400);
}
while (1){
Stampa(griglia);
griglia.Cicla();
griglia.Verifica();
// Aspetta la pressione di enter
cin.get(); //Comando che è stra utile poichè registra la pressione del tasto, e quindi è stra utile.
}
// Mai raggiunto
return 0;
|