Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdio>
- #include <cstdlib>
- #include <ctime>
- #include <fstream>
- #include <iostream>
- #include <string>
- using namespace std;
- // komorka == 1 jest zywa
- // komorka == 0 jest martwa
- // uzywamy krawedzi wokol
- // void odczytajPlik(int tablica[13][21]) {}
- void oczyscEkran() {
- // Czyscimy ekran w zaleznosci od OS,
- // mozesz to usunac - nie chcialo mi sie bootowac Windy
- #ifdef WINDOWS
- system("cls");
- #else
- system("clear");
- #endif
- }
- // Kopiujemy tablice2 do tablicy1
- void kopiuj(int tablica1[13][21], int tablica2[13][21]) {
- for (int j = 1; j < 13; j++) {
- for (int i = 1; i < 21; i++)
- tablica2[j][i] = tablica1[j][i];
- }
- }
- // Funkcja zycie odpowiada za symulacje, zlicza sasiadow komorki i dokonuje
- // selekcji
- void zycie(int tablica[13][21]) {
- // Kopiuje tablice do tablicy tymczasowej, by zapewnic poprawnosc obliczen
- // to tablice tymczasowa bedziemy edytowac, a na tablicy aktualnej bedziemy
- // przeprowadzac obliczenia
- int tymczasowa[13][21];
- kopiuj(tablica, tymczasowa);
- for (int j = 1; j < 13; j++) {
- for (int i = 1; i < 21; i++) {
- // Sprawdza sasiadow w 8 roznych kierunkach
- int licznikSasiadow = 0;
- licznikSasiadow = tablica[j - 1][i] + tablica[j - 1][i - 1] +
- tablica[j][i - 1] + tablica[j + 1][i - 1] +
- tablica[j + 1][i] + tablica[j + 1][i + 1] +
- tablica[j][i + 1] + tablica[j - 1][i + 1];
- // Zdychaj komoreczko, austriacki malarz pocztowek pozdrawia
- // zabraklo zarcia albo nie bylo sie z kim reprodukowac
- if (licznikSasiadow < 2 || licznikSasiadow > 3)
- tymczasowa[j][i] = 0;
- // Komorka sie nie zmienia
- if (licznikSasiadow == 2)
- tymczasowa[j][i] = tablica[j][i];
- // Komorka sie rodzi albo pozostaje jedynka (jezeli nia byla)
- if (licznikSasiadow == 3)
- tymczasowa[j][i] = 1;
- }
- }
- // Kopiuje tymczasową do tablicy
- kopiuj(tymczasowa, tablica);
- }
- // sprawdza czy dwie tablice są intentyczne, jeżeli są to zwraca true
- bool porownaj(int tablica1[13][21], int tablica2[13][21]) {
- int licznikIdentycznych = 0;
- for (int j = 1; j < 13; j++) {
- for (int i = 1; i < 21; i++) {
- if (tablica1[j][i] == tablica2[j][i])
- licznikIdentycznych++;
- }
- }
- // z racji, że licznik identycznych jest zwiększany za każdym razem, gdy
- // tablica jest identyczna to
- // wystarczy porównać go z ogólną ilością komórek
- if (licznikIdentycznych == 12 * 20)
- return true;
- else
- return false;
- }
- // Funkcja rysuje pole o wymiarach 13 x 21
- void rysuj(int tablica[13][21]) {
- for (int j = 1; j < 13; j++) {
- for (int i = 1; i < 21; i++) {
- if (tablica[j][i] == 1)
- cout << 'x';
- else
- cout << '.';
- }
- cout << endl;
- }
- }
- int main() {
- int pokolenie0[13][21];
- int aktualna[13][21];
- int zapasowa[13][21];
- bool wynikPorownania;
- // Czyscimy ekran
- oczyscEkran();
- int i = 0;
- do {
- // odczytajPlik(pokolenie0); TODO
- srand(time(NULL));
- for (int j = 1; j < 13; j++) {
- for (int i = 1; i < 21; i++)
- pokolenie0[j][i] = rand() % 2;
- }
- // Wypisuje numer pokolenia
- cout << endl << "Pokolenie " << i << ":" << endl << endl << endl;
- // jeżeli jest to pokolenie 0, to kopiuje je do aktualnej tablicy
- if (i == 0) {
- kopiuj(pokolenie0, aktualna);
- }
- kopiuj(aktualna, zapasowa);
- rysuj(aktualna);
- zycie(aktualna);
- i++;
- // Zatrzymuje na chwile refresh, zeby nie dostac oczoplasu
- system("sleep .1");
- // sprawdzamy czy wykonano już 100 symulacji
- if (i == 101) {
- cout << endl;
- // przerywamy
- break;
- }
- // porownuje ze soba tablice, jezeli nie sa identyczne to kontynuuje
- // symulacje
- wynikPorownania = porownaj(aktualna, zapasowa);
- if (wynikPorownania == false)
- oczyscEkran();
- if (wynikPorownania == true)
- cout << endl;
- } while (wynikPorownania == false);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement